方法有多少个参数才算多?

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

/// <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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/410891.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[html] 如何实现页面背景图固定不动,不跟随滚动条滚动?

[html] 如何实现页面背景图固定不动&#xff0c;不跟随滚动条滚动&#xff1f; background-attachment: fixed个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

oracle数据库纵表设计,oracle 数据库设计-数据库表设计

在数据库设计中&#xff0c;我的工作中经常会分析怎样商业逻辑中的表格如何设计。再设计表的关系之前 需要先了解关系型数据库特点1关系型数据库&#xff0c;是指采用了关系模型来组织数据的数据库&#xff1b;2、关系型数据库的最大特点就是事务的一致性&#xff1b;3、简单来…

汇编语言复习摘要二——寄存器

CPU中的主要部件是寄存器&#xff0c;寄存器是CPU中程序员可以用指令来读写的部件。通过改变各种寄存器中的内容来实现对CPU的控制。8086CPU有14个寄存器&#xff0c;这里不一一列举。 1. 通用寄存器&#xff1a;8086CPU的所有寄存器都是16位的&#xff0c;也就是可以存放两个字…

ListString^^ 引用空间

莫名其妙报错 需要在.h和.cpp文件中都引用&#xff1a; using namespace System::Collections;using namespace System::Collections::Generic;转载于:https://www.cnblogs.com/dot-dot-123/p/3481717.html

[html] 如何实现默认显示git的第一帧图片,当鼠标经过时,播放完整的gif动画

[html] 如何实现默认显示git的第一帧图片&#xff0c;当鼠标经过时&#xff0c;播放完整的gif动画 准备一个静态第一帧的 img 图片&#xff0c;和gif完整图片&#xff0c;来回切换&#xff0c;就可以完成效果个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃…

u盘运行linux系统卡住了,从U盘运行Linux操作系统的三种方法

从U盘运行Linux操作系统的三种方法你或许听说过在U盘上运行live Linux操作系统&#xff0c;但你知不知道可以永久的保存运行时的数据&#xff0c;或者直接将Linux安装到U盘&#xff1f;本文将介绍把Linux装进口袋(U盘)的三种方法&#xff0c;挑一种你最喜欢的方法吧&#xff01…

全屏模式

<mx:Button label"全屏" click"stage.displayState StageDisplayState.FULL_SCREEN" /> <mx:Button label"窗口" click"stage.displayState StageDisplayState.NORMAL" /> <mx:Button label"全屏交互" cli…

[html] html页面中如何实现gif图片重新播放?

[html] html页面中如何实现gif图片重新播放&#xff1f; 因为浏览器会缓存图片&#xff0c;所以对于一次性gif如果不做处理的话&#xff0c;只会播放一次。如果需要重新播放gif&#xff0c;重新设置下img标签的src属性即可个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前…

python 绘图与可视化 Graphviz 二叉树 、 error: Microsoft Visual C++ 14.0 is required

需要对二叉树的构建过程进行可视化&#xff0c;发现了这个Graphviz软件&#xff0c;他对描绘数据间的关系十分擅长。 下载链接&#xff1a;https://graphviz.gitlab.io/_pages/Download/Download_windows.html 安装好后需要把安装路径添加到Path中 下载python的插件graphviz 问…

linux下统计文件的数目,Linux下如何统计文件数目

若只是查看当前目录下的文件数目(除开.和..文件),使用下面的命令&#xff1a;$ find ./ -type f | wc -l若查看当前目录下面的所有文件&#xff0c;含.和..使用如下命令即可&#xff1a;$wc -lps&#xff1a;find command and wc command1、FIND命令NAMEfind - search for file…

Delphi编程修改ProgressBar的颜色

delphi编程修改ProgressBar的颜色关键代码如下&#xff1a;uses CommCtrl; procedure TForm1.Button1Click(Sender: TObject); begin // Set the Background color to teal Progressbar1.Brush.Color : clTeal; // Set bar color to yellow SendMessage(ProgressBar1.Handle, P…

sql 中优化视图或sql语句的执行效率的方法

参见引用http://www.alixixi.com/program/a/2010062662233.shtml转载于:https://www.cnblogs.com/thornfield_he/archive/2010/09/28/1837811.html

删除数据库的表中某字段的值《转》

方法一&#xff1a; update 表名 set 字段名NULL 方法二&#xff1a; update 表名 set 字段名 转载于:https://www.cnblogs.com/LceMeaning/p/3415711.html

linux分区从1开始,Linux 学习笔记 1 使用最小的系统,从分区安装系统开始

我们常用的linux系统在安装过程中大多都省略了对系统进行分区的操作&#xff0c;以至于后期&#xff0c;不了解什么是分区以及分区当中最基本的一些概念&#xff0c;我们不说最细的知识&#xff0c;只求了解这个过程&#xff0c;那直接步入正题&#xff0c;开始第一节的学习。开…

理解Javascript_02_理解undefined和null

来自普遍的回答: 其实在 ECMAScript 的原始类型中&#xff0c;是有Undefined 和 Null 类型的。 这两种类型都分别对应了属于自己的唯一专用值&#xff0c;即undefined 和 null。 值 undefined 实际上是从值 null 派生来的&#xff0c;因此 ECMAScript 把它们定义为相等的&#…

服务器虚拟多台linux,VirtualBox环境下基于多台Ubuntu虚拟机的Hadoop分布式计算环境搭建...

export PATH$HADOOP_HOME/bin:$PATH接下来需要修改hadoop/conf/目录下的配置文件&#xff0c;共有6个文件需要修改&#xff0c;分别是masters、slaves、core-site.xml、mapred-site.xml、hdfs-site.xml、hadoop-env.sh&#xff0c;修改如下文件mastersUB01文件slavesUB02UB03文…

程序员的培养

作者: RayChase 来源: ITeye 发布时间: 2012-05-22 09:01 阅读: 2335 次 原文链接 全屏阅读  [收藏] 这篇文字是我好久以来的想法&#xff0c;有一些感悟&#xff0c;有一些激烈的言辞&#xff0c;我很自豪我就是一名程序员&#xff0c;我希望给程序员或者前程序员们带来…

[html] 你最喜欢html的哪个标签?为什么?

[html] 你最喜欢html的哪个标签&#xff1f;为什么&#xff1f; div&#xff0c;因为此标签是用得最多的也是最强大的HTML标签&#xff0c;许多其它标签也是基于此标签而产生的。个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一…

linux普通用户发送信号,Linux信号发送与作业控制

前言Linux中进程间通信又称为IPC(Inter process communication)&#xff0c;大致上可以分为这么几类&#xff1a;消息队列(message queue)&#xff0c;旗语(semerpore)&#xff0c;共享内存(shared memory)&#xff0c;信号(signal)&#xff0c;Unix域套接字&#xff0c;socket…

[html] 写一个三栏布局,中间固定,两边自适应(平均)

[html] 写一个三栏布局&#xff0c;中间固定&#xff0c;两边自适应&#xff08;平均&#xff09; <style>html,body {height: 100%;margin: 0;padding: 0;}.container {display: flex;flex-wrap: wrap;width: 100%;height: 100%;}.content {flex: 1;}.side,.right {wid…