2015-04-16 21 views
5

Trong mẫu Mặt tiền cổ điển, một đối tượng đơn giản thường cung cấp giao diện đơn giản cho một thứ phức tạp hơn.Mẫu mặt tiền so với SRP

Như Gang-of-Bốn đặt nó (càng gần "chính thức" như nó được ...):

mặt tiền (185) Cung cấp một giao diện thống nhất để một bộ giao diện trong một hệ thống phụ . Mặt tiền định nghĩa một giao diện cấp cao hơn làm cho hệ thống phụ dễ sử dụng hơn.

... một mặt tiền chỉ đơn thuần là tóm tắt các giao diện để hệ thống con vật để làm cho họ dễ dàng hơn để sử dụng; nó không định nghĩa bất kỳ chức năng mới nào, và các lớp hệ thống con không biết về nó.

Hoặc, như Unmesh đặt nó trong https://stackoverflow.com/a/5242476:

Một Facade che chắn cho người sử dụng từ các chi tiết phức tạp của hệ thống và cung cấp cho họ một cái nhìn đơn giản của nó mà là dễ sử dụng. Nó cũng decouples mã sử dụng hệ thống từ các chi tiết của các hệ thống con, làm cho nó dễ dàng hơn để sửa đổi hệ thống sau này.

Các đơn Trách nhiệm Nguyên tắc khuyên chúng ta rằng

một lớp hoặc mô-đun nên có một, và chỉ có một, lý do gì để thay đổi.

mỗi Bác Bob (http://en.m.wikipedia.org/wiki/Single_responsibility_principle)

Cho rằng một mặt tiền, do thiết kế, khiên người dùng từ vô số các "lý do để thay đổi", làm thế nào hai ý tưởng này có thể làm việc cùng nhau? Mặt tiền không có nhiều lý do để thay đổi khi số lượng hệ thống phụ mà triển khai của nó phụ thuộc không?

+0

gì sẽ vô số các lý do thay đổi mặt tiền? – PeeHaa

+0

sẽ làm rõ trong bài đăng – goofballLogic

Trả lời

1

Trước hết,

Mẫu và nguyên tắc - là hai điều riêng biệt. Một mô hình là một giải pháp đã được chứng minh cho một vấn đề, trong khi nguyên tắc không là gì ngoài chỉ là một hướng dẫn.

Vì vậy, so sánh chúng sẽ là vô nghĩa, đặc biệt là vì chúng hoàn thành lẫn nhau trong hầu hết các trường hợp.

Đối với định nghĩa SRP của "Một lý do để thay đổi" có thể được giải thích một cách dễ dàng:

Hình ảnh nếu bạn xây dựng đối tượng của một chiếc xe, điều đó sẽ bao gồm động cơ, loại và những thứ tương tự. Vì vậy, việc xây dựng đối tượng đó sẽ trông giống như:

car = new Car(new Engine(), new Type()); 

Vì vậy, nếu bạn muốn thay thế động cơ của xe đó thì sao? Sau đó, bạn chỉ cần thay thế ví dụ của Engine. Đó là một lý do để thay đổi, vì bạn không chạm vào các phần khác của nó.

Đối với mặt tiền, định nghĩa bạn đã cung cấp là quá chung chung. Mặt tiền chỉ là một cách khác để gói những thứ mà có thể không có sẵn trong một số môi trường. Họ chỉ đơn giản là đảm bảo, rằng điều của bạn sẽ làm việc trong mọi môi trường.Ví dụ, có một ví dụ rất nổi tiếng về sự kiện-thính giả trong JavaScript:

function click(object, handler){ 
    if (object.addEventListener != undefined){ 
    // For major browsers 
    object.addEventListener(....); 
    } else if (object.attachEvent != undefined){ 
    // For IE < 7 
    object.attachEvent(...) 
    } else { 
    object.click = handler; 
    } 
} 
+0

Cập nhật câu hỏi của tôi để phản ánh định nghĩa GoF "chính thức" của mặt tiền – goofballLogic

+0

Mặt tiền ví dụ của bạn không thực sự phù hợp với định nghĩa cổ điển của mẫu mặt tiền, ít nhất trong các vòng tròn OO. – goofballLogic

+0

Định nghĩa tôi mô tả xuất phát từ cuốn sách của Ross Harmes và Dustin Diaz được gọi là các mẫu thiết kế JavaScript (Trang 141). Đối với các thay đổi được phản ánh, tôi chỉ cần thực hiện một giao diện cho các "mặt tiền" đó và kể từ bây giờ, việc triển khai sẽ phụ thuộc vào trừu tượng và không dựa trên các triển khai cụ thể, điều này sẽ giải quyết vấn đề của bạn – Yang

4

Về cơ bản, nếu Facade lớp học của bạn thực hiện phụ thuộc Inversion nguyên tắc (nó phụ thuộc vào trừu tượng, nhưng không phải khi ngộ bê tông), bạn sẽ không cần phải sửa đổi nó trong tương lai.

Ngoại lệ - nếu có lỗi hoặc nếu bạn cần thay đổi logic nghiệp vụ của Mặt tiền (ví dụ: tương tác giữa các hệ thống con đó mà nó đóng gói). Nhưng đây không phải là vi phạm SRP.

Btw, có vẻ như nó ngầm đề cập trong đoạn trích:

mặt tiền (185) Cung cấp một giao diện thống nhất để một bộ giao diện trong một hệ thống phụ

+0

yeah rằng loại có ý nghĩa ngoại trừ một phần của nhiệm vụ của mặt tiền là để bảo vệ người tiêu dùng từ những thay đổi trong các hệ thống cơ bản. Nếu đó là giá trị làm, nó không ngụ ý rằng những hệ thống đó là đủ phức tạp mà ngay cả giao diện của họ sẽ thay đổi khi chúng được phiên bản? – goofballLogic

+0

Tôi hiểu ý của bạn là gì. Có, nếu bạn phải cập nhật giao diện của một hệ thống con cụ thể - điều đó có nghĩa là bạn đã vi phạm Nguyên tắc phân đoạn giao diện cho giao diện đó. Và đừng quên về nguyên tắc Open-Closed - tốt hơn là mở rộng giao diện/lớp hiện có, hơn là cập nhật nội dung nội bộ. Có vẻ như bạn phải nhận thức được tất cả các nguyên tắc SOLID trong khi xây dựng lớp mới :) –

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