小弟有这样一个方法,按页大小和页索引查询产品,如下。

/// <summary>
/// 获取产品
/// </summary>
/// <param name="manufacturerID">厂商ID,为null时不做查询条件。</param>
/// <param name="categoryID">类别ID,为null时不做查询条件。</param>
/// <param name="typeID">类型ID,为null时不做查询条件。</param>
/// <param name="name">产品名称,模糊匹配。</param>
/// <param name="description">描述,模糊匹配。</param>
/// <param name="pageSize">页大小</param>
/// <param name="pageIndex">页索引</param>
/// <returns></returns>
public DataTable GetProduct(int? manufacturerID, int? categoryID, int? typeID, string name, string description, int pageSize, int pageIndex)
{
return null;
}

可以看到小弟这个方法参数比较多,有7个,这时有人就说了:“这么多参数,应该封装成一个对象传递!”要写成下面这个样子。

public class QueryProduct
{
private int? manufacturerID;

/// <summary>
/// 厂商ID,为null时不做查询条件。
/// </summary>
public int? ManufacturerID
{
get { return manufacturerID; }
set { manufacturerID = value; }
}

private int? categoryID;

/// <summary>
/// 类别ID,为null时不做查询条件。
/// </summary>
public int? CategoryID
{
get { return categoryID; }
set { categoryID = value; }
}

private int? typeID;

/// <summary>
/// 类型ID,为null时不做查询条件。
/// </summary>
public int? TypeID
{
get { return typeID; }
set { typeID = value; }
}

private string name;

/// <summary>
/// 产品名称,模糊匹配。
/// </summary>
public string Name
{
get { return name; }
set { name = value; }
}

private string description;

/// <summary>
/// 描述,模糊匹配。
/// </summary>
public string Description
{
get { return description; }
set { description = value; }
}

private int pageSize;

/// <summary>
/// 页大小
/// </summary>
public int PageSize
{
get { return pageSize; }
set { pageSize = value; }
}

private int pageIndex;

/// <summary>
/// 页索引
/// </summary>
public int PageIndex
{
get { return pageIndex; }
set { pageIndex = value; }
}
}

/// <summary>
/// 获取产品
/// </summary>
/// <param name="query">查询条件</param>
/// <returns></returns>
public DataTable GetProduct(QueryProduct query)
{
return null;
}

小弟心里就想了 ,这才几个参数,连10个都不到,封装成一个对象有必要吗?

下面是各自对问题的看法

应该封装成对象:
1.不封装成对象,代码看起来很乱。
2.可维护性强,以后这个方法如果需要加查询参数,只需要在QueryProduct类中增加一个属性即可,方法不用改。
3.方法的参数越少越好,能少一个,绝不多一个。
4.方法的参数超过3个就要封装成对象。

应该直接传递参数:
1.直接将查询条件写在方法参数上,可读性强,便于后来人维护。
2.封装成对象,项目中就需要增加一个对象,对象越多,越不利于维护,10个以内的参数,如果没有特殊原因,不需要封装成对象。
3.这里的参数每一个都有业务意义,并不是要持久化到数据库的实体属性,在数量不多的时候,不应该封装成对象。

下面是小弟对“应该封装成对象”一派3个理由的回复
1.不封装成对象,代码看起来很乱。
一点都不乱,封装成对象反倒增加了阅读成本。
2.可维护性强,以后这个方法如果需要加查询参数,只需要在QueryProduct类中增加一个属性即可,方法不用改。
可维护性绝对没有增强,反倒因为项目中多了一堆查询条件对象,增加了阅读成本,降低了维护性。当增加查询条件时,改了查询对象的定义,方法的参数就变了,方法也100%的变了,只是方法的代码没改,但方法的定义已经改了,这完全没有优势。都是改代码,都是改方法的参数,都改变了方法的定义。
3.方法的参数越少越好,能少一个,绝不多一个。
这里没有一个参数是多余的,少任何一个参数都不能满足需求,方法的参数越少越好是毋庸置疑的,但绝不是用这种坑爹的方式减少参数。
4.方法的参数超过3个就要封装成对象。
是否要将参数封装成对象,不能只看参数的数量,还要看它的业务意义,作为数据载体的实体类,即使只有两个属性,也要用对象传递。但像这种,不需要持久化,而且每个参数都有各自的业务意义,没有特殊原因,就应该写在方法的参数列表里。

关于这个问题,小弟希望看看大家是怎么对待的,希望大家能在回复时除了表述自己的观点,同时告知在项目中会采取哪种方式。

转载于:https://www.cnblogs.com/aaronyu/archive/2011/07/12/2104353.html

方法有多少个参数才算多?相关推荐

  1. 30几岁该有多少存款才算合格?

    今年30几岁,定期存款没有,活期存款有一两千,贷款到是有几百万. 那30岁应该有多少存款呢? 我觉得这个没有一个固定的标准,因为每个人所处的地方,工作的单位,个人的资源,能力,家庭都有很大的差异,所以 ...

  2. java方法参数类型不确定_一个Java方法能有多少个参数类型?这个好奇coder做了个实验...

    选自 justinblank 机器之心编译 参与:李志伟.张倩 在 JVM 中,一个 Java 方法,最多能定义多少参数呢?这是一个很无聊的问题,即使能定义一万个,十万个,谁又会真的去这么做呢.但是作 ...

  3. python有多少库存_库存究竟多少才算合理?

    本文摘自以上刘宝红老师著作. 作为库存计划人员,不管你的库存周转多快,总有人挑战你,说你的库存不合理.不合理,其实是太高的代名词.不过想想看,每一分钱的库存都不是凭空而来,都是为了特定的业务需求而设的 ...

  4. 精通python能干嘛-一个程序员怎样才算精通Python?

    原标题:一个程序员怎样才算精通Python? 作者:赖明星 我会先给出我对精通Python的理解,然后给出一些Python中有难度的知识点.如果大家在看完我这篇回答之前,已经充分理解了我列出的各个知识 ...

  5. python工程师证书-一个程序员怎么才算精通python

    我会先给出我对精通Python的理解,然后给出一些Python中有难度的知识点.如果大家在看完我这篇回答之前,已经充分理解了我列出的各个知识点,那么,我相信你已经算是精通Python了.如果不能,我希 ...

  6. 怎样才算精通Python?

    在这篇文章中,我会1)先给出我对精通Python的理解:2)然后给出一些Python中有难度的知识点.如果大家在看完这篇文章之前,已经充分理解了我列出的各个知识点,那么,我相信你已经算是精通Pytho ...

  7. 怎样才算熟悉python-终于找到python怎么才算入门

    为了提高模块加载的速度,每个模块都会在__pycache__文件夹中放置该模块的预编译模块,命名为module.version.pyc,version是模块的预编译版本编码,一般都包含Python的版 ...

  8. 到底多大并发才算高并发?一文带你全面认识高并发!

    点击上方蓝色小字,关注"涛哥聊Python" 重磅干货,第一时间送达 作者 | 骆俊武 来源 | IT人的职场进阶 高并发,几乎是每个程序员都想拥有的经验.原因很简单:随着流量变大 ...

  9. 计算机视觉要掌握哪些知识,学习了哪些知识,计算机视觉才算入门?

    原标题:学习了哪些知识,计算机视觉才算入门? 本文来自知乎问题"学习了哪些知识,计算机视觉才算入门?需要哪些数学 编程 工具 等知识? 针对这个问题,我们邀请了微软亚洲研究院视觉计算组的高级 ...

最新文章

  1. 无法访问您试图使用的功能所在的网络位置
  2. 苹果/三星/华为纷纷布局人工智能 将AI作为公司发展新动力
  3. linux path环境变量检索目录,Linux下动态链接库加载路径及搜索路径问题
  4. HTML5 基础知识(一)
  5. Linux uniq命令
  6. 给windows 98 客户虚拟机安装VMWare tools
  7. 前端学习(3010):vue+element今日头条管理--回顾
  8. 基于阿里云移动推送的移动应用推送模式最佳实践
  9. 你们都在吐槽的华为“浴霸”被这三家拿去用了...
  10. 使用高斯金字塔和拉普拉斯金字塔重构图像(matlab代码)
  11. Thinking in Java读书笔记
  12. 疯狂的程序员_周末分享丨王者程序员PK普通程序员,段位差多少?
  13. 基于FPGA的出租车计费器的设计
  14. Android Binder学习(四)之addService流程分析
  15. WPF Blend 自定义控件
  16. 直播软件测试用例,【专家专栏】李雪 | 直播通用测试方法—如何进行直播测试...
  17. 【算法】扩展卢卡斯详解
  18. SAP中使用LSMW批量导入总账科目
  19. 168 PHP中Notice: iconv(): Unknown error (84) 的解决办法
  20. js中关于时间格式转化,时间大小比较的方法

热门文章

  1. python异常值均值填充_Python 异常值分析
  2. java单例模式的七种写法_Java设计模式之单例模式的七种写法
  3. python dry原则_关于Python 的这几个技巧,你应该知道
  4. wordpress 删除自定义字段
  5. PHP使用SMTP邮件服务器
  6. 【51单片机快速入门指南】2.4:74HC595、LED点阵屏及其SPI控制
  7. C# 将PDF转为Excel
  8. Javascript this关键字 指向详解
  9. C++ 学习基础篇(一)—— C++与C 的区别
  10. [react] 在React中怎么将参数传递给事件?