当我看到很长的参数列表时,我的第一个问题是此函数或对象是否做得太多。考虑:
EverythingInTheWorld earth=new EverythingInTheWorld(firstCustomerId,
lastCustomerId,
orderNumber, productCode, lastFileUpdateDate,
employeeOfTheMonthWinnerForLastMarch,
yearMyHometownWasIncorporated, greatGrandmothersBloodType,
planetName, planetSize, percentWater, ... etc ...);
当然,这个示例是故意荒谬的,但是我看到了很多真实的程序,而这些示例只是稍微有些荒谬,其中一个类用于容纳许多几乎不相关或不相关的东西,显然是因为同一个调用程序需要这两者,或者因为程序员碰巧同时想到了两者。有时,简单的解决方案是将类分为多个部分,每个部分都执行自己的任务。
稍微复杂一点的是,当一个类确实需要处理多种逻辑问题时,例如客户订单和有关客户的一般信息。在这种情况下,请为客户创建一个班级,为一个订单创建一个班级,并在必要时让他们彼此交谈。所以代替:
Order order=new Order(customerName, customerAddress, customerCity,
customerState, customerZip,
orderNumber, orderType, orderDate, deliveryDate);
我们可以有:
Customer customer=new Customer(customerName, customerAddress,
customerCity, customerState, customerZip);
Order order=new Order(customer, orderNumber, orderType, orderDate, deliveryDate);
当然,尽管我更喜欢只使用1或2或3个参数的函数,但有时我们不得不接受这一点,实际上,该函数需要很多,并且其本身的数量并没有真正增加复杂性。例如:
Employee employee=new Employee(employeeId, firstName, lastName,
socialSecurityNumber,
address, city, state, zip);
是的,这是一堆字段,但是我们可能要做的就是将它们保存到数据库记录中或将它们放在屏幕上或类似的东西上。这里实际上没有很多处理。
当我的参数列表变长时,我更愿意为字段赋予不同的数据类型。就像当我看到类似的函数时:
void updateCustomer(String type, String status,
int lastOrderNumber, int pastDue, int deliveryCode, int birthYear,
int addressCode,
boolean newCustomer, boolean taxExempt, boolean creditWatch,
boolean foo, boolean bar);
然后我看到它的调用:
updateCustomer("A", "M", 42, 3, 1492, 1969, -7, true, false, false, true, false);
我很担心 看一下电话,这些不清楚的数字,代码和标志的含义完全不清楚。这只是在询问错误。程序员可能会很容易对参数的顺序感到困惑,并意外地切换了两个参数,并且如果它们是相同的数据类型,则编译器只会接受它。我宁愿有一个签名,其中所有这些都是枚举,因此调用将传递诸如Type.ACTIVE(而不是“ A”)和CreditWatch.NO(而不是“ false”)之类的信息。