首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

方法多少个参数才算多!解决方法

2012-01-10 
方法多少个参数才算多!小弟有这样一个方法,按页大小和页索引查询产品,如下。C# code/// summary/// 获取

方法多少个参数才算多!
小弟有这样一个方法,按页大小和页索引查询产品,如下。

C# code
        /// <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)        {           ......        }

可以看到小弟这个方法参数比较多,有7个,这时有人就说了:“这么多参数,应该封装成一个对象传递!”要写成下面这个样子。
C# code
    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; }        }    }
 

C# code
    /// <summary>        /// 获取产品        /// </summary>        /// <param name="query">查询条件</param>        /// <returns></returns>        public DataTable GetProduct(QueryProduct query)        {            ......        }

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

下面是各自对问题的看法

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

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

下面是小弟对“应该封装成对象”一派3个理由的回复
1.不封装成对象,代码看起来很乱。
一点都不乱,封装成对象反倒增加了阅读成本。
2.可维护性强,以后这个方法如果需要加查询参数,只需要在QueryProduct类中增加一个属性即可,方法不用改。
可维护性绝对没有增强,反倒因为项目中多了一堆查询条件对象,增加了阅读成本,降低了维护性。当增加查询条件时,改了查询对象的定义,方法的参数就变了,方法也100%的变了,只是方法的代码没改,但方法的定义已经改了,这完全没有优势。都是改代码,都是改方法的参数,都改变了方法的定义。


3.方法的参数越少越好,能少一个,绝不多一个。
这里没有一个参数是多余的,少任何一个参数都不能满足需求,方法的参数越少越好是毋庸置疑的,但绝不是用这种坑爹的方式减少参数。
4.方法的参数超过3个就要封装成对象。
是否要将参数封装成对象,不能只看参数的数量,还要看它的业务意义,作为数据载体的实体类,即使只有两个属性,也要用对象传递。但像这种,不需要持久化,而且每个参数都有各自的业务意义,没有特殊原因,就应该写在方法的参数列表里。

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


[解决办法]

探讨
引用:
1,楼主 我只问你一点,你这个参数如果展示后需要继续传递到其它页面怎么办?
你不会也写6-7个参数吧。。。。
2,如果是自己的小系统没问题,如果是大的系统肯定是不行的,在小的元素也是对象。

1.这个我在文章用已经说过了
是否要将参数封装成对象,不能只看参数的数量,还要看它的业务意义,作为数据载体的实体类,即使只有两个属性,也要用对象传递。但……

[解决办法]
在博客园已经回复过

除非这个对象本身来源自是model层或业务层的类,否则我个人是很不赞同使用查询对象,因为这个对象基本没什么复用性,也只会在这个查询的方法中做为参数出现

为了一个方法的参数就创建一个类,是否是设计过度呢?

热点排行