Lướt qua một số mã tôi đã viết, tôi đã xem qua cấu trúc sau đây khiến tôi suy nghĩ. Thoạt nhìn, nó có vẻ đủ sạch. Có, trong mã thực tế, getLocation()
phương thức có một tên cụ thể hơn một chút, mô tả chính xác hơn vị trí mà nó nhận được.
service.setLocation(this.configuration.getLocation().toString());
Trong trường hợp này, service
là một biến thể hiện của một kiểu đã biết, được khai báo trong phương thức. this.configuration
xuất phát từ việc được truyền vào hàm tạo của lớp và là một thể hiện của lớp thực hiện một giao diện cụ thể (bắt buộc một getLocation()
phương thức công khai ). Do đó, kiểu trả về của biểu thức this.configuration.getLocation()
được biết đến; cụ thể trong trường hợp này, nó là một java.net.URL
, trong khi service.setLocation()
muốn a String
. Do hai loại Chuỗi và URL không tương thích trực tiếp, nên một số loại chuyển đổi được yêu cầu để khớp với chốt vuông trong lỗ tròn.
Tuy nhiên , theo Luật của Demeter như được trích dẫn trong Mã sạch , một phương pháp f trong lớp C nên chỉ gọi các phương thức trên C , các đối tượng được tạo ra bởi hoặc thông qua như là đối số f , và các đối tượng tổ chức trong các biến thể hiện của C . Bất cứ điều gì ngoài điều đó (trận chung kết toString()
trong trường hợp cụ thể của tôi ở trên, trừ khi bạn xem xét một đối tượng tạm thời được tạo ra do kết quả của việc gọi phương thức, trong trường hợp đó, toàn bộ Luật dường như được đưa ra) không được phép.
Có một lý do hợp lệ tại sao một cuộc gọi như trên, với các ràng buộc được liệt kê, nên được khuyến khích hoặc thậm chí không được phép? Hay tôi chỉ là quá đáng?
Nếu tôi thực hiện một phương thức URLToString()
chỉ đơn giản gọi toString()
một URL
đối tượng (chẳng hạn như được trả về getLocation()
) được truyền cho nó dưới dạng tham số và trả về kết quả, tôi có thể kết thúc getLocation()
cuộc gọi trong đó để đạt được kết quả chính xác như nhau; một cách hiệu quả, tôi sẽ chỉ chuyển một bước ra bên ngoài. Điều đó bằng cách nào đó làm cho nó chấp nhận được? ( Dường như với tôi, theo trực giác, nó sẽ không tạo ra bất kỳ sự khác biệt nào, vì tất cả những gì làm là di chuyển mọi thứ xung quanh một chút. Tuy nhiên, đi theo lá thư của Luật Demeter như được trích dẫn, nó sẽ được chấp nhận, vì tôi sau đó sẽ được vận hành trực tiếp trên một tham số cho hàm.)
Nó sẽ làm cho bất kỳ sự khác biệt nếu điều này là về một cái gì đó hơi kỳ lạ hơn so với việc gọi toString()
một loại tiêu chuẩn?
Khi trả lời, hãy nhớ rằng việc thay đổi hành vi hoặc API của loại mà service
biến là không thực tế. Ngoài ra, để tranh luận, hãy nói rằng việc thay đổi kiểu trả về getLocation()
cũng không thực tế.