我会说坚持你以前的做法。您的示例中的参数数量并不多,但替代方案要可怕得多。
地图 - 你提到的效率问题,但这里更大的问题是:
- 来电者不知道要给您发送什么而不参考
其他内容...您是否有 javadocs 可以准确说明使用了哪些键和
值?如果你这样做(这很好),那么拥有很多参数也不是问题。
- 接受不同的参数类型变得非常困难。您可以将输入参数限制为单一类型,也可以使用 Map<String, Object> 并强制转换所有值。大多数时候这两种选择都很糟糕。
包装器对象-这只是解决了问题,因为您首先需要填充包装器对象-而不是直接填充到您的方法,而是填充到参数对象的构造函数。确定移动问题是否合适取决于所述对象的重用。例如:
不会使用它:它只会在第一次调用时使用一次,所以很多额外的代码来处理 1 行......?
{
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 个方法调用的参数。它本身也可以执行另外两条线......所以它在某种意义上成为一个状态变量......
{
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);
}
- Builder 模式——在我看来,这是一种反模式。最理想的错误处理机制是更早检测,而不是更晚检测;但是使用构建器模式,缺少(程序员不认为包含它)强制参数的调用从编译时移动到运行时。当然,如果程序员故意将 null 或诸如此类的东西放在插槽中,那将是运行时,但仍然更早地捕获一些错误对于迎合拒绝查看他们正在调用的方法的参数名称的程序员来说是一个更大的优势。我发现它只在处理大量可选参数时才合适,即使这样,好处也只是微不足道的。我非常反对建造者“模式”。
人们忘记考虑的另一件事是 IDE 在这一切中的作用。当方法具有参数时,IDE 会为您生成大部分代码,并且您会用红线提醒您需要提供/设置什么。使用选项 3 时……你完全失去了这个。现在由程序员来做对了,在编码和编译期间没有任何线索……程序员必须对其进行测试才能找到答案。
此外,如果不必要地广泛采用选项 2 和 3,由于它会生成大量重复代码,因此在维护方面会产生长期的负面影响。代码越多,维护的越多,维护它所花费的时间和金钱就越多。