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ệc và kho 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ụ: MailService
hoặ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ụ, RecogitionService
khô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ã.