2012-12-22 17 views
8

Luật Demeter nói rằng một đối tượng không thể gọi một phương thức M từ một đối tượng B từ một đối tượng A. Nhưng nó có được gán cho các thuộc tính không? Thí dụ?Luật của Demeter có được áp dụng cho các tài sản không?

public class B{ 
    public bool IsValid(); 
} 

public class A{ 
    public B B{get;set;} 
} 

Tôi có thể làm điều gì đó như vậy không?

var isValid = new A().B.IsValid() 

hay tôi nên làm điều này:

public class B{ 
    public bool IsValid(); 
} 

public class A{ 
    private B B{get;set;} 

    public bool IsValid(){ 
      return B.IsValid(); 
    } 
} 

var result = new A().IsValid(); 

Có một vấn đề (theo pháp luật) nếu tôi truy cập phương pháp của B từ A?

+0

Trong ví dụ 2d của bạn, có vẻ trường hợp của 'B' được tạo bởi' A' bên trong. Trong ví dụ đầu tiên của bạn, nó là một thuộc tính công khai mà 'B' có thể được thiết lập. Kịch bản chính xác của bạn là gì để nó trở nên cần thiết để bạn có thể gọi 'A.B.IsValid' giống như 'B.IsValid'? Trong ví dụ thứ 2 của bạn, 'get' có thể được công khai. – shahkalpesh

Trả lời

12

Vâng, nó áp dụng cho bất động sản là tốt, kể từ khi khách hàng của mã này:

var isValid = new A().B.IsValid(); 

là cùng với A và cũng để B.

Khi sửa luật vi phạm Demeter, bạn phải cân bằng nhu cầu tách và cần phải giữ trách nhiệm rõ ràng. Đôi khi bạn có thể tạo các bộ tạo tín hiệu Demeter: các lớp có quá nhiều phương pháp không liên quan chỉ để tuân thủ luật Demeter.

Cập nhật: Một ví dụ về transmogrifier Demeter có thể được tìm thấy trong this post:

Xem xét, ví dụ, ai đó cố gắng để hôn lên đến ông chủ của mình: sendFlowers(john.getManager().getSpouse()). Áp dụng Hide Delegate ở đây sẽ mang lại phương thức getManagersSpouse() trong Employee. Kinh quá.

+4

+1 để sử dụng máy phát tín hiệu trong một câu được chế tác kỹ lưỡng. –

+0

Điều gì nếu mã giống như 'var someB = new A(). B; bool isValid = someB.IsValid(); '? – shahkalpesh

+0

Vì vậy, trong ví dụ thứ hai của tôi lớp A sẽ là một máy phát điện, đúng không? – MuriloKunze

Các vấn đề liên quan