Codebase của chúng tôi là những lập trình viên cũ và mới, giống như tôi, nhanh chóng học cách làm theo cách nó được thực hiện vì mục đích đồng nhất. Nghĩ rằng chúng ta phải bắt đầu ở đâu đó, tôi đã tự mình lấy nó để cấu trúc lại một lớp chủ dữ liệu như sau:
- Đã xóa các phương thức setter và thực hiện tất cả các trường
final
(tôi lấy "final
là tốt" theo tiên đề). Các setters chỉ được sử dụng trong hàm tạo, vì vậy nó không có tác dụng phụ. - Giới thiệu một lớp Builder
Lớp Builder là cần thiết bởi vì hàm tạo (là thứ đã nhắc tái cấu trúc ở vị trí đầu tiên) kéo dài khoảng 3 dòng mã. Nó có rất nhiều thông số.
Như may mắn có được, một đồng đội của tôi đã làm việc trên một mô-đun khác và tình cờ cần các setters, bởi vì các giá trị anh ta yêu cầu đã có sẵn tại các điểm khác nhau trong dòng chảy. Do đó, mã trông như thế này:
public void foo(Bar bar){
//do stuff
bar.setA(stuff);
//do more stuff
bar.setB(moreStuff);
}
Tôi lập luận rằng anh ta nên sử dụng trình xây dựng thay thế, bởi vì việc loại bỏ setters cho phép các trường không thay đổi (họ đã nghe tôi nói về sự bất biến trước đây) và cũng vì các nhà xây dựng cho phép tạo đối tượng được giao dịch. Tôi đã phác thảo mã giả sau đây:
public void foo(Bar bar){
try{
bar.setA(a);
//enter exception-throwing stuff
bar.setB(b);
}catch(){}
}
Nếu ngoại lệ đó kích hoạt, bar
sẽ có dữ liệu bị hỏng, điều mà có thể tránh được với một người xây dựng:
public Bar foo(){
Builder builder=new Builder();
try{
builder.setA(a);
//dangerous stuff;
builder.setB(b);
//more dangerous stuff
builder.setC(c);
return builder.build();
}catch(){}
return null;
}
Các đồng đội của tôi đã vặn lại rằng ngoại lệ trong câu hỏi sẽ không bao giờ khai hỏa, điều đó đủ công bằng cho khu vực mã cụ thể đó, nhưng tôi tin rằng đang thiếu rừng cho cây.
Sự thỏa hiệp là trở lại giải pháp cũ, cụ thể là sử dụng một hàm tạo không có tham số và đặt mọi thứ với setters khi cần. Lý do là giải pháp này tuân theo nguyên tắc KISS, mà tôi vi phạm.
Tôi mới đến công ty này (chưa đầy 6 tháng) và hoàn toàn biết rằng tôi đã mất cái này. Câu hỏi tôi có là:
- Có một đối số khác cho việc sử dụng Nhà xây dựng thay vì "cách cũ" không?
- Là sự thay đổi tôi đề xuất thậm chí thực sự có giá trị nó?
nhưng thực sự,
- Bạn có bất cứ lời khuyên nào để trình bày tốt hơn những lập luận như vậy khi ủng hộ việc thử một cái gì đó mới không?
setA
?