2011-07-07 22 views
13

Tôi đang đọc qua cuốn sách tái cấu trúc của Fowler và có chút bối rối về hai mùi mã đó."Chuỗi thông báo" so với "Người trung gian"

"Chuỗi thư" là các cuộc gọi như a.getB().getC().getValue().

"Trung Man" là một phương pháp như

class A 
{ 
    object getCValue() 
    { 
     return b.getCValue(); 
    } 
} 

Con đường tôi hiểu được phần hai là nếu bạn đã có "Message Chuỗi" bạn rút ngắn chúng bằng cách giới thiệu "Trung Men". Và nếu bạn đã có "Người đàn ông trung niên", bạn chuyển chúng thành "Chuỗi thông báo" ...

Bây giờ rõ ràng phải có một số hạn chế đối với điều này hoặc bạn sẽ có một người lập trình vui vẻ. Tôi nên ưu tiên cái nào hơn cái kia?

Thứ nhất là ghép nối lớp với các lớp không liên quan, lớp kia kết nối lớp với cấu trúc. Vì vậy, theo lý thuyết, phương pháp tiếp cận của tôi sẽ là kiểm tra xem liệu bất kỳ thay đổi nào có làm giảm một loại khớp nối nhiều hơn nó làm tăng loại khớp nối khác không. Nhưng là một loại khớp nối tồi tệ hơn và nên được cân nhắc nhiều hơn? I E. chỉ thêm một lớp khớp nối nếu bạn có thể loại bỏ khớp nối cấu trúc X?

Trả lời

7

Ưu tiên nam giới trung gian qua chuỗi tin nhắn còn được gọi là Law of Demeter, có thể tóm tắt là "chỉ nói chuyện với phụ thuộc trực tiếp của bạn".

Một lợi ích của việc sử dụng nam trung gian thay vì chuỗi tin nhắn là bạn phải cung cấp ít mocks hơn khi thực hiện kiểm tra đơn vị. Các lớp học trở nên thực sự khó khăn để kiểm tra khi bạn phải cung cấp mocks không chỉ cho các phụ thuộc trực tiếp của chúng mà còn là các phần gián tiếp của chúng.

Điều này cũng giúp tách biệt các mối quan tâm, vì mã có số A và muốn một số C không cần phải biết rằng có liên quan đến B. Điều này giúp mô đun.

Đối số chính cho chuỗi tin nhắn là bạn không phải viết bản mẫu ở giữa và có thể có ý nghĩa trong một số trường hợp, nhưng tôi nghĩ quy tắc chung nên thích người trung gian hơn.

1

Đó là lựa chọn của bạn. Viết mã theo cách bạn nghĩ sẽ dễ bảo trì hơn. BTW, tôi không nghĩ rằng có một trường hợp "ghép nối lớp với các lớp không liên quan". Thay vào đó, nó là một vấn đề chuyển một mối quan hệ gián tiếp thành một mối quan hệ trực tiếp. Điều này đặc biệt đáng làm khi bạn truy cập lớp gián tiếp nhiều lần từ lớp của bạn. Điều này cũng có thể loại bỏ một số phụ thuộc vào các lớp trung gian, tùy thuộc vào cách bạn thiết lập mối quan hệ trực tiếp.

3

Như Hammar đã nói, đây là tất cả về Luật Demeter. Những thứ như a.getB().getC().getD() là khá nhiều luôn luôn xấu. Họ giới thiệu khớp nối với khách hàng của giao diện A. Thích để giới thiệu một người đàn ông trung niên, chẳng hạn như:

class A 
    def calculateHowManyCowsCanFitOnTheMoon 
     doLocalCalculation(b.performEncapsulatedCalculation()) 
    end 
end 

Bạn muốn thoát khỏi khu vực Trung Man khi nó không phục vụ một mục đích như trên, chẳng hạn như khi nó chỉ kéo dữ liệu từ B. Tôi muốn đi cho đến nay khi nói rằng việc tái cấu trúc cho một người đàn ông trung gian xấu có thể là việc tái cấu trúc Move Field/Move Method.

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