Tôi sẽ nói hãy gắn bó với cách bạn đã làm trước đây. Số lượng các tham số trong ví dụ của bạn không nhiều, nhưng các lựa chọn thay thế thì kinh khủng hơn nhiều.
Bản đồ - Có điều hiệu quả mà bạn đã đề cập, nhưng vấn đề lớn hơn ở đây là:
- Người gọi không biết gửi cho bạn thông tin gì nếu không đề cập đến thứ
khác ... Bạn có javadocs cho biết chính xác khóa và
giá trị nào được sử dụng không? Nếu bạn làm (điều đó thật tuyệt), thì việc có nhiều tham số cũng không phải là vấn đề.
- Rất khó để chấp nhận các kiểu lập luận khác nhau. Bạn có thể hạn chế các tham số đầu vào cho một loại duy nhất hoặc sử dụng Bản đồ <Chuỗi, Đối tượng> và ép kiểu tất cả các giá trị. Cả hai lựa chọn đều khủng khiếp hầu hết thời gian.
Đối tượng trình bao bọc - điều này chỉ giải quyết vấn đề vì bạn cần điền vào đối tượng trình bao bọc ngay từ đầu - thay vì trực tiếp vào phương thức của bạn, nó sẽ là phương thức khởi tạo của đối tượng tham số. Để xác định vấn đề di chuyển có phù hợp hay không phụ thuộc vào việc tái sử dụng đối tượng đã nói. Ví dụ:
Sẽ không sử dụng nó: Nó sẽ chỉ được sử dụng một lần trong cuộc gọi đầu tiên, vì vậy rất nhiều mã bổ sung để xử lý trên 1 dòng ...?
{
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);
}
Có thể sử dụng nó: Ở đây, nó có thể làm được nhiều hơn một chút. Đầu tiên, nó có thể tính các tham số cho 3 cuộc gọi phương thức. nó cũng có thể thực hiện 2 dòng khác trong chính nó ... vì vậy nó trở thành một biến trạng thái theo nghĩa ...
{
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);
}
- Mô hình xây dựng - đây là một mô hình chống lại theo quan điểm của tôi. Cơ chế xử lý lỗi mong muốn nhất là phát hiện sớm hơn, không muộn hơn; nhưng với mẫu trình tạo, các cuộc gọi bị thiếu (lập trình viên không nghĩ là bao gồm nó) các tham số bắt buộc được chuyển từ thời gian biên dịch sang thời gian chạy. Tất nhiên nếu lập trình viên cố tình đặt null hoặc tương tự vào vị trí, đó sẽ là thời gian chạy, nhưng vẫn bắt được một số lỗi sớm hơn là một lợi thế lớn hơn nhiều để phục vụ cho những lập trình viên không chịu nhìn vào tên tham số của phương thức họ đang gọi. Tôi thấy nó chỉ thích hợp khi xử lý số lượng lớn các tham số tùy chọn và thậm chí khi đó, lợi ích ở mức tốt nhất. Tôi rất chống lại "khuôn mẫu" của người xây dựng.
Một điều khác mà mọi người quên cân nhắc là vai trò của IDE trong tất cả những điều này. Khi các phương thức có tham số, các IDE tạo hầu hết mã cho bạn và bạn có các dòng màu đỏ nhắc nhở bạn những gì bạn cần cung cấp / thiết lập. Khi sử dụng tùy chọn 3 ... bạn hoàn toàn mất điều này. Bây giờ, lập trình viên phải làm đúng và không có dấu hiệu nào trong thời gian viết mã và biên dịch ... lập trình viên phải kiểm tra nó để tìm ra.
Hơn nữa, các phương án 2 và 3, nếu được áp dụng rộng rãi một cách không cần thiết, sẽ có tác động tiêu cực lâu dài về mặt bảo trì do số lượng lớn mã trùng lặp mà nó tạo ra. Mã càng có nhiều thì càng phải bảo trì, càng tốn nhiều thời gian và tiền bạc để duy trì.