2010-04-22 15 views
8

Wikipedia mô tả các Single Responsibility Principle theo cách này:Việc sử dụng truyền thống của bộ điều khiển trong MVC có dẫn đến vi phạm Nguyên tắc về Trách nhiệm duy nhất không?

Các đơn Trách nhiệm Nguyên tắc khẳng định rằng tất cả các đối tượng nên có trách nhiệm duy nhất, và trách nhiệm đó phải được hoàn toàn đóng gói bởi lớp. Tất cả các dịch vụ của nó phải được liên kết chặt chẽ với trách nhiệm đó.

Việc sử dụng bộ điều khiển truyền thống trong MVC dường như dẫn đến một lập trình viên vi phạm nguyên tắc này. Lấy một bộ điều khiển và chế độ xem sách khách đơn giản. Bộ điều khiển có thể có hai phương thức/hành động: 1) Chỉ mục() và 2) Gửi(). Chỉ mục() hiển thị biểu mẫu. Submit() xử lý nó. Hai phương pháp này có đại diện cho hai trách nhiệm riêng biệt không? Nếu vậy, làm thế nào để tính duy nhất có thể chơi?

Trả lời

8

Có.

Và nếu bạn muốn theo dõi SRP, bạn phân tách Bộ điều khiển của mình thành Người điều phối và Hành động; Dispatcher điều khiển các hành động của nó, và tại thời gian biên dịch (các mẫu C++) hoặc tại thời gian chạy (Java XML, bất cứ điều gì), bạn sẽ soạn các Dispatchers và Actions.

Tại sao chúng ta không thấy điều này thường xuyên hơn? Vì Bộ điều khiển thường là các triển khai "ad hoc", các lớp bê tông cấp lá không được tổng quát hóa và không có nghĩa là được phân lớp. Ở đây, lớp được sử dụng nhiều hơn để mã nhóm thuận tiện, các hành động gần như chắc chắn là không công khai (có thể là riêng tư, có thể được bảo vệ), "chỉ đơn thuần là" chi tiết thực hiện nội bộ.

Lựa chọn cách quyết định hành động nào cần gửi đến, số lượng và tính đa dạng của các hành động có thể có, cao và việc gửi và hành động được kết hợp chặt chẽ. Vì vậy, trong thực tế, nó thường dễ dàng hơn để chỉ đặt mã với nhau ở một nơi.

4

Không, không.

Không có gì vốn có đối với mẫu MVC hoặc các biến thể của nó dẫn đến vi phạm Nguyên tắc về trách nhiệm duy nhất. Cho dù việc thực hiện một bộ điều khiển vi phạm SRP hay không được dựa trên việc hành vi đóng gói có nhiều hơn một lý do để thay đổi (giống như bất kỳ lớp nào khác), không phải vì bất kỳ việc sử dụng mô hình nào được mô tả trước.

Ví dụ bạn đặt ra là một tập con của một biểu mẫu cơ bản trên ứng dụng dữ liệu, trong đó bộ điều khiển chỉ cung cấp các hoạt động CRUD cho một mô hình cụ thể. Các hoạt động CRUD khá gắn kết trong tự nhiên, do đó, điều này thường không cấu thành một sự vi phạm SRP. Trường hợp có nhiều phương thức trên một bộ điều khiển đơn bắt đầu trở thành nghi ngờ là khi các phương thức thể hiện các tương tác hành vi khác nhau trên miền. Điều đó nói rằng, ngay cả khi ai đó cho rằng CRUD đại diện cho bốn mối quan tâm riêng biệt không liên kết, thì không có gì vốn có đối với mẫu MVC buộc bạn phải tạo điều kiện thuận lợi cho mỗi hành động trong cùng một bộ điều khiển.

Đối với một ít lịch sử về mẫu MVC cũng như một số thảo luận về ứng dụng của nó trong phát triển Web, hãy kiểm tra Interactive Application Architecture Patterns.

+0

Tôi đồng ý, nó không tự vi phạm mẫu MVC, nhưng nó khuyến khích bạn - bạn sẽ đặt hành động liên quan đến người dùng mới ở đâu? Tại sao, trong UserController tất nhiên. Khá sớm nó phát triển ngoài tầm kiểm soát, chứa đầy các phương thức hành động không có sự phụ thuộc vào nhau, nhưng được nhóm lại chỉ vì nó thuận tiện. Tôi bắt đầu một cuộc thảo luận [ở đây] (https://gist.github.com/mindplay-dk/5505023) để tranh luận về ý tưởng làm việc với Bộ điều khiển, và nhóm các Hành động vào các không gian tên thay thế. –

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