例程可以有参数,这不是新闻.您可以根据需要定义任意数量的参数,但是过多的参数会使您的日常工作难以理解和维护.
当然,您可以使用结构化变量作为解决方法:将所有这些变量放在单个结构中并将其传递给例程.实际上,使用结构简化参数列表是Steve McConnell在Code Complete中描述的技术之一.但正如他所说:
细心的程序员避免捆绑数据,这在逻辑上是必要的.
因此,如果您的例程有太多参数或使用结构来伪装一个大参数列表,那么您可能做错了.也就是说,你没有保持松耦合.
我的问题是,我什么时候可以考虑参数列表太大?我认为超过5个参数,太多了.你怎么看?
我正在尝试构建一个框架,允许人们通过实现接口来扩展我们的核心功能.下面是这个界面的一个愚蠢的例子.
public interface MyInterface
{
IData GetData(string p1, char p2, double p3);
}
Run Code Online (Sandbox Code Playgroud)
最近,我们决定修改这个界面(我知道我不应该破坏依赖代码,但事实是我们还没有任何第三方实现这个界面,所以我们有机会进行"重做"正确实现此接口).
我们需要在此界面中再添加2个参数,以使我们的软件正常工作.我们想到的两种方法就是将它们添加到签名中,如下所示:
public interface MyInterface
{
IData GetData(string p1, char p2, double p3, bool p4, DateTime p5);
}
Run Code Online (Sandbox Code Playgroud)
或者通过创建这样的参数对象
public class MyParameters
{
public bool p4 { get; set; }
public DateTime p5 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
并将它们添加到方法的末尾,如下所示:
public interface MyInterface
{
IData GetData(string p1, char p2, double p3, MyParameters p4);
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找某种指导,以哪种方式是"最"正确的方法.我可以在两个类别中看到利弊,但我不希望我的偏见让我走错了路.
我的一些主要担忧是:
我甚至不知道在线询问什么问题来获得这个问题的指导.我有一种感觉,答案是"它取决于"(关于如何将相关的p1-p5与GetData()函数的目的相关联),但有人可以指出我应该要求的一系列问题来帮助我评估一种解决方案是否优于另一种?
相关: 帖子1 …