Mô hình béo và bộ điều khiển gầy nghe giống như tạo mô hình Chúa [đóng]


91

Tôi đã đọc rất nhiều blog ủng hộ cách tiếp cận của người mẫu béo và bộ điều khiển gầy , đặc biệt là. trại Rails. Kết quả là các bộ định tuyến về cơ bản chỉ tìm ra phương thức nào để gọi trên bộ điều khiển nào và tất cả những gì phương thức bộ điều khiển làm là gọi phương thức tương ứng trên mô hình và sau đó đưa ra khung nhìn. Vì vậy, tôi có hai mối quan tâm ở đây mà tôi không hiểu:

  1. Bộ điều khiển và bộ định tuyến thực sự không thực hiện nhiều nhiệm vụ khác nhau ngoài việc chỉ gọi một phương thức trên mô hình giống Chúa dựa trên tuyến đường.
  2. Người mẫu đang làm quá nhiều. Gửi email, tạo mối quan hệ, xóa và sửa đổi các mô hình khác, tác vụ xếp hàng, v.v. Về cơ bản, bây giờ bạn có các đối tượng giống như Chúa để làm mọi thứ có thể hoặc không liên quan đến việc lập mô hình và xử lý dữ liệu.

Bạn ve con đương nay ở đâu vậy? Đây không phải chỉ rơi vào khuôn mẫu của Thượng đế sao?

Câu trả lời:


136

Có thể không phải là ý tưởng tốt nhất nếu xem Rails như một phần chính của mẫu thiết kế MVC. Khuôn khổ cho biết đã được tạo ra với một số thiếu sót cố hữu (tôi đã giải thích kỹ hơn về nó trong một bài đăng khác ) và cộng đồng chỉ mới bắt đầu giải quyết sự cố. Bạn có thể xem việc phát triển DataMapper2 là bước quan trọng đầu tiên.

Một số lý thuyết

Những người đưa ra lời khuyên đó dường như bị ảnh hưởng bởi một quan niệm sai lầm khá phổ biến. Vì vậy, hãy để tôi bắt đầu bằng cách làm rõ nó: Mô hình, trong mẫu thiết kế MVC hiện đại, KHÔNG phải là một lớp hoặc đối tượng. Mô hình là một lớp.

Ý tưởng cốt lõi đằng sau mô hình MVC là Tách mối quan tâm và bước đầu tiên trong đó là sự phân chia giữa lớp trình bày và lớp mô hình. Giống như lớp trình bày được chia thành bộ điều khiển (phiên bản, chịu trách nhiệm xử lý đầu vào của người dùng), khung nhìn (phiên bản, chịu trách nhiệm logic giao diện người dùng) và mẫu / bố cục, lớp mô hình cũng vậy.

Các phần chính của lớp mô hình bao gồm:

  • Đối tượng miền

    Còn được gọi là thực thể miền, đối tượng nghiệp vụ hoặc đối tượng mô hình (Tôi không thích tên sau đó vì nó chỉ làm tăng thêm sự nhầm lẫn). Những cấu trúc này là những gì mọi người thường gọi nhầm là "mô hình". Chúng chịu trách nhiệm chứa các quy tắc nghiệp vụ (tất cả các phép toán và xác nhận cho đơn vị logic miền cụ thể).

  • Tóm tắt lưu trữ:

    Thường được triển khai bằng cách sử dụng mẫu ánh xạ dữ liệu (đừng nhầm lẫn với ORM , đã lạm dụng tên này). Những trường hợp này thường được giao nhiệm vụ lưu trữ thông tin từ và truy xuất vào các đối tượng miền. Mỗi đối tượng miền có thể có một số trình ánh xạ, giống như có một số hình thức lưu trữ (DB, bộ nhớ cache, phiên, cookie, / dev / null).

  • Dịch vụ:

    Các cấu trúc chịu trách nhiệm về logic ứng dụng (nghĩa là tương tác giữa các đối tượng miền và tương tác giữa các đối tượng miền và trừu tượng lưu trữ). Chúng phải hoạt động giống như "giao diện" mà qua đó lớp trình bày tương tác với lớp mô hình. Đây thường là những gì trong mã giống như Rails kết thúc trong bộ điều khiển.

Cũng có một số cấu trúc có thể nằm trong khoảng trống giữa các nhóm này: DAO , đơn vị công việckho lưu trữ .

Ồ ... và khi chúng ta nói (trong ngữ cảnh web) về một người dùng tương tác với ứng dụng MVC, đó không phải là con người. "Người dùng" thực sự là trình duyệt web của bạn.

Vậy còn các vị thần thì sao?

Thay vì có một số mô hình nguyên khối và đáng sợ để làm việc, bộ điều khiển nên tương tác với các dịch vụ. Bạn chuyển dữ liệu từ đầu vào của người dùng đến một dịch vụ cụ thể (ví dụ: MailServicehoặc RecognitionService). Bằng cách này bộ điều khiển thay đổi trạng thái của lớp mô hình, nhưng nó được thực hiện bằng cách sử dụng một API rõ ràng và không gây rối với các cấu trúc bên trong (điều này sẽ gây ra sự trừu tượng bị rò rỉ).

Những thay đổi như vậy có thể gây ra một số phản ứng tức thì hoặc chỉ ảnh hưởng đến dữ liệu mà phiên bản chế độ xem yêu cầu từ lớp mô hình hoặc cả hai.

Mỗi dịch vụ có thể tương tác với bất kỳ số nào (tuy nhiên, nó thường chỉ là một số ít) đối tượng miền và lưu trữ trừu tượng. Ví dụ, RecogitionServicekhông thể quan tâm ít hơn đến các trừu tượng lưu trữ cho các bài báo.

Đóng ghi chú

Bằng cách này, bạn sẽ có được một ứng dụng có thể được kiểm tra đơn vị ở bất kỳ cấp độ nào, có khả năng ghép nối thấp (nếu được triển khai chính xác) và có kiến ​​trúc rõ ràng dễ hiểu.

Tuy nhiên, hãy nhớ rằng: MVC không dành cho các ứng dụng nhỏ. Nếu bạn đang viết một trang lưu bút bằng mẫu MVC, bạn đang làm sai. Mô hình này có nghĩa là để thực thi luật pháp và trật tự trên các ứng dụng quy mô lớn.

Đối với những người đang sử dụng PHP làm ngôn ngữ chính, bài đăng này có thể phù hợp. Đó là mô tả dài hơn một chút về lớp mô hình với một vài đoạn mã.


Câu trả lời rất hữu ích và đầy đủ! Bạn có biết cuốn sách nào giải thích thêm một chút về mô hình kiến ​​trúc MVC không? Đặc biệt ở phần mô hình mà mọi người đều lầm tưởng "Mô hình đại diện cho dữ liệu và không làm gì khác." và rằng những âm thanh giống như ý tưởng của đối tượng miền, không phải là 'mẫu' -> tomdalling.com/blog/software-design/...
thermz

1
@thermz, afaik , thực sự không có sách nào nói riêng về mẫu MVC. Tôi thường chỉ bảo mọi người đọc PoEAA , và sau đó đi đào. Có lẽ danh sách các liên kết này có thể hữu ích. Tôi thấy rằng, khi mọi người đã nắm chắc các nguyên tắc và khái niệm OOP, thì mô hình này trở nên khá dễ hiểu.
tereško

@ tereško câu trả lời đẹp. Hibernate có đạt được điều này không? Tôi không bị thuyết phục bởi những câu trả lời ở đây -> stackoverflow.com/questions/1308096/...
Ankan-Zerob

@ Ankan-Zerob như bạn có thể nhận thấy, tôi không phải là nhà phát triển java, nhưng từ những gì tôi biết về Hibernate, nó cung cấp một bộ công cụ hoàn chỉnh cho lớp bền bỉ. Nó sẽ cung cấp cho bạn một phần của những gì được mô tả ở đó, nhưng không phải là một lớp mô hình hoàn chỉnh.
tereško

3
@johnny không xa như tôi biết. Hầu hết cái gọi là "mvc framework" của php là các biến thể của Rails. Và, như một phần của khóa học, hầu hết chúng đều đi kèm với một số giải pháp ORM dựa trên bản ghi đang hoạt động (những thứ này nổi tiếng là dễ vỡ đối với các thay đổi của DB). Bạn có thể triển khai một cái gì đó như thế này với SF2.x hoặc ZF2.x, nhưng quan điểm của một khuôn khổ không phải để triển khai / thực thi một kiến ​​trúc cụ thể mà là cung cấp các công cụ. Ngoài ra, khi nói đến MVC, nó được thực hiện bởi mã ứng dụng chứ không phải khuôn khổ.
tereško

5

Nếu các lớp "mô hình" được triển khai kém thì có, mối quan tâm của bạn là có liên quan. Một lớp mô hình không nên thực hiện Email (nhiệm vụ cơ sở hạ tầng).

Câu hỏi thực sự là mô hình trong MVC ngụ ý gì. Nó không bị giới hạn trong các lớp POCO với một số phương thức. Mô hình trong MVC có nghĩa là Dữ liệu và Logic kinh doanh. Coi nó như một tập hợp các mô hình POCO lõi cổ điển.

Xem ==== Bộ điều khiển ==== Mô hình ---> Lớp Quy trình nghiệp vụ -> Các mô hình cốt lõi

Đưa vào các tổ hợp Cơ sở hạ tầng và các lớp Truy cập Dữ liệu và sử dụng tiêm để đưa chúng vào BPL thì quy trình của bạn đang sử dụng MVC như dự định.

BPL có thể gọi các mẫu UoW / Respository và thực thi các quy tắc nghiệp vụ và gọi các tính năng của Cơ sở hạ tầng bằng cách các Đối tượng được đưa vào hoặc người bảo vệ giao diện.

Vì vậy, khuyến nghị giữ bộ điều khiển mỏng không có nghĩa là lớp "người" trong mô hình Core cổ điển phải có 50 phương thức và gọi trực tiếp Email. Bạn đúng khi nghĩ rằng điều này là sai.

Bộ điều khiển Có thể vẫn được yêu cầu để khởi tạo và đưa các lớp Cơ sở hạ tầng vào BPL hoặc lớp lõi nếu được gọi trực tiếp. Cần có một lớp nghiệp vụ hoặc ít nhất là các lớp điều phối các cuộc gọi trên các lớp mô hình Đối tượng Cổ điển. Vâng, đó là "quan điểm" của tôi anyway ;-)

Để sử dụng MVC chung, mô tả wiki http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

Một Blog nhỏ nói về chữ "M" trong MVC. http://www.thedeveloperday.com/skinny-controllers/


1
Nếu bạn không đồng ý ít nhất là đủ lịch sự để biện minh cho quan điểm của bạn
phil soady

-1

Tôi nghĩ bạn có thể phân biệt giữa một mô hình béo (có thể được đặt tên là Ứng dụng hoặc Ứng dụng) và một số mô hình béo được chia thành các nhóm hợp lý (Doanh nghiệp, Khách hàng, Đơn hàng, Tin nhắn). Sau đó là cách tôi cấu trúc các ứng dụng của mình và mỗi mô hình gần như tương ứng với một bảng cơ sở dữ liệu trong cơ sở dữ liệu quan hệ hoặc tập hợp trong cơ sở dữ liệu tài liệu. Các mô hình này xử lý tất cả các khía cạnh của việc tạo, cập nhật và thao tác dữ liệu tạo nên mô hình, cho dù nó đang nói chuyện với cơ sở dữ liệu hay gọi một API. Bộ điều khiển rất mỏng chịu trách nhiệm về việc gọi mô hình thích hợp và chọn một mẫu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.