创建具有许多参数的方法是一个主要的缺点。 每当需要创建这样的方法时,就在空气中闻一闻:这是代码的味道。 强化单元测试,然后进行重构。 没有借口,没有屁股。 重构! 使用构建器模式,甚至更好地使用Fluent API。 对于后者,注释处理器的影响可能会有很大帮助。
综上所述,当我们面对现实生活而不是我们在业余爱好项目中可以遵循的理想主义模式时,我们可能会迈入人生的关键时刻。 遗留下来的企业库怪物具有数以千计的参数方法,您没有权力,时间,勇气或兴趣(对您不利)来修改……操作……对其进行重构。 如果有时间,您可以将构建器创建为外观,将丑陋的API隐藏在其后。 创建构建器仍然是您甚至在编写之前就必须进行单元测试的代码(您知道:TDD),而您可能没有时间。 调用怪异方法的代码也已经存在,您只需对其进行维护即可。
您仍然可以做一些小技巧。 它可能并不完美,但是仍然有些完美。
假设有一个方法:
public void monster(String contactName, String contactId, String street, String district,
...
Long pT){
...
}
首先是在调用者的位置明智地选择局部变量。 可惜已经选择了名称,您可能不想更改它。 可能有某些原因,例如,遵循了应用程序范围的命名约定,即使您的样式不是这样,也可能有意义。 因此调用:
monster(nm, "05300" + dI, getStrt(), d, ... , z+g % 3L );
不完全是我在说的。 这就是您所拥有的,您可以使用它,也可以在代码中插入新变量:
String contactName = nm;
String contactId = "05300" + dI;
String street = getStrt();
Street district = d;
...
Long pT = z+g % 3L;
monster(contactName, contactId, street, district, ... ,pT );
或者甚至可以用Java中不常见的方式编写它,尽管完全合法:
String contactName, contactId, street, district;
...
Long pT;
monster(contactName = nm, contactId = "05300" + dI, street = getStrt(), district = d, ... ,pT = z+g % 3L );
好吃吗 依靠。 我不会在口味上争论。 如果您不喜欢那样,还有另一种方法。 您可以定义辅助和非常简单的静态方法:
static <T> T contactName(T t){ return T;}
static <T> T contactId(T t){ return T;}
static <T> T street(T t){ return T;}
static <T> T district(T t){ return T;}
...
static <T> T pT(T t){ return T;}
monster(contactName(nm), contactId("05300" + dI), street(getStrt()(, district(d), ... ,pT(z+g % 3L) );
该代码仍然很丑陋,但是在调用者处更具可读性。 你甚至可以收集静态方法为工具类或接口在Java中8的情况下,命名为喜欢with
, using
, to
等等。 您可以将它们静态导入到您的代码中,并进行如下一些方法调用:
doSomething(using(someParameter), with(someOtherParameter), to(resultStore));
如果您回答了最后一个问题,那么所有这些都将使您感到恼: * pT
是什么祝福。
( * “随便什么,您都可以用其他任何单词代替”)
翻译自: https://www.javacodegeeks.com/2014/09/named-parameters-in-java.html