Gần đây trong một lần xem xét mã, tôi đã xem qua mã, được viết bởi một đồng nghiệp mới, trong đó có một mẫu có mùi. Tôi nghi ngờ rằng các quyết định của đồng nghiệp của tôi dựa trên các quy tắc được đề xuất bởi cuốn sách Clean Code nổi tiếng (và có lẽ bởi các cuốn sách tương tự khác).
Theo hiểu biết của tôi, hàm tạo của lớp hoàn toàn chịu trách nhiệm cho việc tạo ra một đối tượng hợp lệ và nhiệm vụ chính của nó là gán các thuộc tính (riêng tư) của một đối tượng. Tất nhiên có thể xảy ra rằng các giá trị thuộc tính tùy chọn có thể được đặt bằng các phương thức khác ngoài hàm tạo của lớp, nhưng các tình huống như vậy khá hiếm (mặc dù không nhất thiết là sai, với điều kiện là phần còn lại của lớp sẽ tính đến tính tùy chọn của thuộc tính đó). Điều này rất quan trọng, vì nó cho phép đảm bảo rằng đối tượng luôn ở trạng thái hợp lệ.
Tuy nhiên, trong mã mà tôi gặp phải, hầu hết các giá trị thuộc tính thực sự được đặt bởi các phương thức khác ngoài hàm tạo. Các giá trị kết quả từ các tính toán được gán cho các thuộc tính được sử dụng bên trong một số phương thức riêng trong toàn lớp. Tác giả dường như sử dụng các thuộc tính lớp như thể chúng là các biến toàn cục có thể truy cập được trong toàn lớp, thay vì tham số hóa các giá trị này cho các hàm cần chúng. Ngoài ra, các phương thức của lớp nên được gọi theo một thứ tự cụ thể, vì lớp sẽ không làm gì khác.
Tôi nghi ngờ rằng mã này được lấy cảm hứng từ lời khuyên để giữ các phương thức ngắn (<= 5 dòng mã), để tránh danh sách tham số lớn (<3 tham số) và các nhà xây dựng không được thực hiện công việc (chẳng hạn như thực hiện một phép tính nào đó đó là điều cần thiết cho tính hợp lệ của đối tượng).
Bây giờ tất nhiên tôi có thể tạo ra một trường hợp chống lại mô hình này nếu tôi có thể chứng minh rằng tất cả các loại lỗi không xác định có khả năng phát sinh khi các phương thức không được gọi theo một thứ tự cụ thể. Tuy nhiên, tôi dự đoán rằng phản hồi cho điều này sẽ bổ sung các xác nhận hợp lệ để xác minh rằng các thuộc tính phải được đặt sau khi các phương thức được gọi cần các thuộc tính đó được đặt.
Tuy nhiên, tôi muốn đề xuất thay đổi hoàn toàn mã, để lớp trở thành một bản in màu xanh cho một đối tượng thực tế, thay vì một loạt các phương thức nên được gọi (theo thủ tục) theo một thứ tự cụ thể.
Tôi cảm thấy rằng mã mà tôi gặp phải có mùi. Trên thực tế, tôi tin rằng tồn tại một sự khác biệt khá rõ ràng là khi nào nên lưu một giá trị trong một thuộc tính lớp và khi nào nên đưa nó vào một tham số cho một phương thức khác để sử dụng - tôi thực sự tin rằng chúng có thể thay thế cho nhau . Tôi đang tìm kiếm các từ cho sự phân biệt này.