Khi tôi thấy danh sách tham số dài, câu hỏi đầu tiên của tôi là liệu hàm hoặc đối tượng này có đang làm quá nhiều hay không. Xem xét:
EverythingInTheWorld earth=new EverythingInTheWorld(firstCustomerId,
lastCustomerId,
orderNumber, productCode, lastFileUpdateDate,
employeeOfTheMonthWinnerForLastMarch,
yearMyHometownWasIncorporated, greatGrandmothersBloodType,
planetName, planetSize, percentWater, ... etc ...);
Tất nhiên ví dụ này cố ý lố bịch, nhưng tôi đã thấy rất nhiều chương trình thực tế với các ví dụ chỉ hơi nực cười hơn một chút, trong đó một lớp được sử dụng để chứa nhiều thứ hầu như không liên quan hoặc không liên quan, dường như chỉ vì cùng một chương trình gọi cần cả hai hoặc vì lập trình viên tình cờ nghĩ về cả hai cùng một lúc. Đôi khi giải pháp dễ dàng là chỉ cần chia lớp thành nhiều phần, mỗi phần trong số đó làm một việc riêng.
Chỉ phức tạp hơn một chút là khi một lớp thực sự cần phải xử lý nhiều thứ logic, như cả đơn đặt hàng của khách hàng và thông tin chung về khách hàng. Trong những trường hợp này, hãy xếp một lớp cho khách hàng và một lớp cho đơn hàng, và để họ nói chuyện với nhau khi cần thiết. Vì vậy, thay vì:
Order order=new Order(customerName, customerAddress, customerCity,
customerState, customerZip,
orderNumber, orderType, orderDate, deliveryDate);
Chúng ta có thể có:
Customer customer=new Customer(customerName, customerAddress,
customerCity, customerState, customerZip);
Order order=new Order(customer, orderNumber, orderType, orderDate, deliveryDate);
Tất nhiên, tôi thích các hàm chỉ lấy 1 hoặc 2 hoặc 3 tham số, nhưng đôi khi chúng ta phải chấp nhận rằng, trên thực tế, hàm này chiếm rất nhiều và số lượng của chính nó không thực sự tạo ra sự phức tạp. Ví dụ:
Employee employee=new Employee(employeeId, firstName, lastName,
socialSecurityNumber,
address, city, state, zip);
Vâng, đó là một loạt các trường, nhưng có lẽ tất cả những gì chúng ta sẽ làm với chúng là lưu chúng vào bản ghi cơ sở dữ liệu hoặc ném chúng lên màn hình hoặc một số trường tương tự. Không thực sự có nhiều quá trình xử lý ở đây.
Khi danh sách tham số của tôi dài ra, tôi rất thích nếu tôi có thể cung cấp cho các trường các kiểu dữ liệu khác nhau. Giống như khi tôi thấy một chức năng như:
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);
Và sau đó tôi thấy nó được gọi bằng:
updateCustomer("A", "M", 42, 3, 1492, 1969, -7, true, false, false, true, false);
Tôi lo lắng. Nhìn vào cuộc gọi, hoàn toàn không rõ ràng tất cả những con số, mã và cờ khó hiểu này có nghĩa là gì. Đây chỉ là xin lỗi. Một lập trình viên có thể dễ dàng nhầm lẫn về thứ tự của các tham số và vô tình chuyển đổi hai tham số, và nếu chúng cùng kiểu dữ liệu, trình biên dịch sẽ chấp nhận nó. Tôi muốn có một chữ ký trong đó tất cả những thứ này là enums, vì vậy một cuộc gọi được chuyển đến những thứ như Type.ACTIVE thay vì "A" và CreditWatch.NO thay vì "false", v.v.