Answers:
以我的经验,可选参数是一件好事。我从来没有发现它们令人困惑(至少没有比实际功能更令人困惑),因为我总是可以得到默认值并知道正在调用什么。
它们的一种用途是当我必须向已经普遍使用的功能或至少在公共接口中添加另一个参数时。没有它们,我将不得不重做原始函数以调用具有另一个参数的函数,如果我多次添加参数,则该函数可能会变得很老。
new Circle(size, color, filled, ellipseProportions)
where size
和color
required之类的参数,其余为默认值。
通常,如果您经常需要许多/可选参数,则您的函数做得太多,应该分解。您可能会违反SRP(单一责任原则)。
查找可以分组的参数,例如(x和y,成为一个点)。
这些可选参数标志是否带有默认值?如果使用标志,则应拆分该函数。
这并不是说您不应该具有可选参数,但是通常,一个或两个以上的参数会提示代码有异味。
也可能是该函数实际上应该是一个类,并且可选参数已更改为属性,而必需参数是构造函数的一部分,这可能是一个线索。
可选参数很好
通常,理由是:a)您知道自己的方法有很多可能的参数,但又不想因担心API混乱而不想重载,或者b)当您不知道所有可能的参数但您却想不想强迫您的用户提供数组。在每种情况下,可选参数都以简洁,优雅的方式出现。
这里有些例子:
1.您要避免重载并且不想指定数组
看一下C,Perl,Java等中的printf()。这是可选参数功能强大的一个很好的例子。
例如:
printf("I want %d %s %s",1,"chocolate","biccies");
printf("I want %d banana",1);
没有重载,没有数组,简单而直观(一旦您掌握了标准的字符串格式代码)。某些IDE甚至会告诉您格式字符串是否与可选参数不匹配。
2.您想允许使用默认值,并将默认值对方法用户隐藏
sendEmail(“ test@example.org”);
sendEmail方法检测到缺少各种基本值,并使用定义的默认值(主题,正文,cc,bcc等)将其填充。API保持干净,但灵活。
有关太多参数的注释
但是,正如其他人所述,方法的强制参数过多表示您的设计可能有问题。如果它们共享相同的类型,则尤其如此,因为开发人员可能会偶然切换它们,从而在运行时导致奇怪的结果:
String myMethod(String x, String y, String z, String a, int b, String c, int d) {}
是引入参数对象重构以创建的理想选择
String myMethod(ParameterObject po) {}
class ParameterObject {
// Left as public for clarity
public String x;
public String y;
... etc
}
反过来,这可以基于带有提供的规范作为参数对象的Factory模式进行更好的设计。
我认为重载具有不同签名(即参数)的函数比使用可选参数更好。