我会说坚持以前的做法。您的示例中的参数数量并不多,但是替代方法更加可怕。
地图-您提到了效率问题,但是更大的问题是:
- 调用者在不参考其他
内容的情况下不知道该向您发送什么
。如果这样做(很好),那么拥有很多参数也不是问题。
- 接受不同的参数类型变得非常困难。您可以将输入参数限制为单个类型,也可以使用Map <String,Object>并强制转换所有值。在大多数情况下,这两种选择都是可怕的。
包装器对象-这只是一个问题,因为您首先需要填充包装器对象-而不是直接添加到您的方法中,而是对象参数的构造函数。确定移动问题是否适当取决于所述对象的重用。例如:
不会使用它:它将仅在第一次调用时使用一次,因此有很多其他代码可以处理一行...?
{
AnObject h = obj.callMyMethod(a, b, c, d, e, f, g);
SomeObject i = obj2.callAnotherMethod(a, b, c, h);
FinalResult j = obj3.callAFinalMethod(c, e, f, h, i);
}
可以使用它:在这里,它可以做更多的事情。首先,它可以考虑3个方法调用的参数。它本身也可以执行其他2行...因此从某种意义上说,它成为状态变量...
{
AnObject h = obj.callMyMethod(a, b, c, d, e, f, g);
e = h.resultOfSomeTransformation();
SomeObject i = obj2.callAnotherMethod(a, b, c, d, e, f, g);
f = i.somethingElse();
FinalResult j = obj3.callAFinalMethod(a, b, c, d, e, f, g, h, i);
}
- 构建器模式-我认为这是一种反模式。最理想的错误处理机制是尽早检测,而不是后期检测。但是在使用构建器模式时,缺少必需的调用(程序员不认为包含此调用)的强制性参数会从编译时移至运行时。当然,如果程序员有意在插槽中放入null或类似内容,那将是运行时,但仍能较早捕获一些错误,对于迎接拒绝查看所调用方法的参数名称的程序员来说,这是一个更大的优势。我发现它仅在处理大量可选参数时才适用,即使那样,其好处充其量也是微不足道的。我非常反对建造者的“模式”。
人们忘记考虑的另一件事是IDE在所有这些方面的作用。当方法具有参数时,IDE会为您生成大多数代码,并且红线提醒您需要提供/设置的内容。使用选项3时,您将完全失去这一点。现在由程序员来决定正确,并且在编码和编译期间没有任何提示……程序员必须对其进行测试以找出答案。
此外,如果选项2和3不必要地广泛采用,则由于其生成的大量重复代码而在维护方面具有长期负面影响。代码越多,维护的内容就越多,维护它所花费的时间和金钱也就越多。