Có nên xem và một mô hình giao tiếp hay không?


33

Theo trang wikipedia cho kiến ​​trúc MVC , chế độ xem được mô hình miễn phí thông báo và cũng có thể truy vấn mô hình về trạng thái hiện tại của nó. Tuy nhiên, theo khóa học của Paul Hegarty trên iOS 5 tại Stanford, bài giảng 1, trang 18, tất cả các tương tác phải thông qua bộ điều khiển, với Mô hình và Chế độ xem không bao giờ được biết là phải biết nhau. Tôi không rõ ràng nếu tuyên bố của Hegarty phải được dự định là đơn giản hóa cho khóa học, nhưng tôi muốn nói rằng ông dự định thiết kế như vậy.

Làm thế nào để bạn giải thích hai quan điểm trái ngược này?

Câu trả lời:


26

Đây là một chủ đề gây tranh cãi trong MVC / MVVM. Một số người nói rằng Chế độ xem có thể truy cập trực tiếp vào Mô hình, người khác nói rằng bạn nên bọc Mô hình trong ViewModels để trừu tượng hóa chúng khỏi Chế độ xem. Cá nhân tôi không phải là một fan hâm mộ của một trong hai cách tiếp cận.

Một trong những mục tiêu chính của MVC / MVVM là tách rời UI, logic nghiệp vụ và dữ liệu. Vì vậy, với ý tưởng đó, việc cho phép View truy cập trực tiếp vào các Mô hình sẽ tạo ra sự phụ thuộc mà bạn có thể không muốn có. Mặt khác, việc gói các Mô hình trong ViewModels thường rất tẻ nhạt và không hữu ích lắm vì ViewModels có xu hướng hoạt động đơn giản như một sự truyền qua cho các Mô hình.

Tôi thích cách tiếp cận để các Mô hình của bạn triển khai một giao diện cụ thể, hãy gọi nó là IModel. Lớp ViewModel của bạn sau đó có thể cung cấp các phiên bản của các đối tượng triển khai IModel cho mức tiêu thụ View. View chỉ đơn giản biết nó hoạt động với các đối tượng IModel mà nó nhận được từ ViewModel. Điều này loại bỏ mã trình bao bọc ViewModel bên ngoài cũng như ẩn việc triển khai IModel cụ thể khỏi Chế độ xem. Sau này, bạn có thể trao đổi một triển khai IModel cho một triển khai khác mà không ảnh hưởng đến Xem một bit.


1
Liên quan đến các khía cạnh tẻ nhạt của việc ánh xạ mô hình sang mô hình khung nhìn, cần lưu ý rằng có những công cụ có sẵn có thể làm giảm cơn đau ánh xạ. EG: (.NET AutoMapper) (JAVA modelmapper)
Jesse

+1 Câu trả lời tuyệt vời! Đây là một cách tiếp cận tuyệt vời tùy thuộc vào độ phức tạp của mô hình của bạn, nhưng hầu hết các mô hình ngày nay thuộc loại Thiếu máu . Các yếu tố của mô hình, ít hơn nhiều so với các đối tượng dữ liệu mà không có hành vi, tôi thấy ít hoặc không cần sự trừu tượng như vậy và ít nguy hiểm khi cho phép Chế độ xem của bạn truy cập trực tiếp vào Mô hình của bạn.
maple_shaft

2
Tôi nghe những gì bạn nói; hầu hết các giao diện IModel chỉ đơn giản chứa một loạt các khai báo thuộc tính và một vài khai báo phương thức (nếu có). Nhưng ngay cả khi các Mô hình bị thiếu máu, giao diện vẫn tách riêng Chế độ xem khỏi triển khai cụ thể của chúng. Sự tách biệt này có thể không cần thiết cho mọi dự án, nhưng luôn luôn là một ý tưởng tốt để giữ cho các tùy chọn của bạn mở.
Raymond Saltrelli

1
Tôi bối rối, nếu bạn có một loạt các khung nhìn hoàn toàn khác nhau, làm thế nào bạn có thể dựa vào một giao diện mà không làm lộn xộn nó? Tôi nghĩ Mô hình Chế độ xem thật tuyệt vời .. Bạn tạo Mô hình đủ chung để sử dụng trong ứng dụng của mình và bạn tạo Mô hình Chế độ để sử dụng một hoặc nhiều Mô hình và triển khai thêm các hoạt động chỉ được sử dụng bởi chế độ xem đó.
Người đàn ông Muffin

12

Trên web, mọi người gọi MVC tách rời của họ.

Một số công nghệ, chẳng hạn như C #, sử dụng MVVM vì không có liên kết giữa Chế độ xem và bất kỳ công nghệ nào khác, mọi thứ đều đi qua bộ định vị dịch vụ, ràng buộc các biến.

Trên MVC thuần túy, View nói chuyện trực tiếp với Model và ngược lại. Bộ điều khiển chỉ ở đó khi có bất kỳ thay đổi nào phát sinh.

Và sau đó, có một cái gọi là PAC (Điều khiển trừu tượng trình bày). Trong kiến ​​trúc này, Chế độ xem và Mô hình không nói chuyện với nhau. Bộ điều khiển là người duy nhất được phép làm bất cứ điều gì với Chế độ xem hoặc Mô hình. Mọi người thường nhầm lẫn điều này với MVC.

Bạn sẽ thấy một cách giải thích tốt hơn ở đây: http://www.garfieldtech.com/blog/mvc-vs-pac


7

Đối với tôi, mục tiêu cơ bản của một kiến ​​trúc là nó không cản trở những nỗ lực trong tương lai trong việc tái cấu trúc. Thông thường, các khung nhìn tương tác trực tiếp với các mô hình sẽ có yêu cầu này và tương đối rõ ràng khi không có.

Khi một chế độ xem trở nên quá thân mật với một mô hình, ViewModel có thể là một thứ tuyệt đẹp, nhưng đối với tôi, đó thường là trường hợp mà nó được yêu cầu là thiểu số.


6

Trong MVC , Paul Hegarty đã sai. Bộ điều khiển là về các sự kiện của người dùng, không phải là giao tiếp giữa các mô hình. Trong MVC cổ điển , (các) khung nhìn quan sát (các) mô hình (mẫu Observer).

Với anh chàng ở giữa thực hiện hòa giải, mô hình nên được gọi là MVP , và trên thực tế, hầu hết những gì hiện nay được trình bày dưới dạng MVC, trên thực tế gần với MVP.

Sau đó, có MVVM tương tự như cả hai, nhưng hơi khác một chút và tồn tại từ lâu ... tốt nhất nên xem nó như hai MVC / MVP được liên kết với nhau thông qua đối tượng viewmodel - MVC "client" có viewmodel như mô hình của nó và MVC "máy chủ" có viewmodel như khung nhìn của nó.


1
Hôm nay (đầu năm 2014), với tôi (với nút và ngăn xếp góc của tôi) sự khác biệt này trên "máy khách" MVC và "máy chủ" MVC có vẻ rất phù hợp và bằng cách nào đó đã khai sáng. (cảm ơn bạn)
slacktracer

4

Vì bạn đang hỏi về tài liệu trong các bài giảng của Stanford nói riêng, nên đáng để xem xét hai điều về lập trường của Hegarty:

  1. Như bạn đã đề cập, anh ấy đang dạy một khóa học Khoa học máy tính cấp độ l00. Có rất nhiều nơi trong các bài giảng của anh ấy, nơi anh ấy đơn giản hóa, làm sáng tỏ các chi tiết hoặc nói "chỉ cần làm theo cách này", như người ta có thể phải làm khi dạy những điều cơ bản, tức là bạn phải nắm vững các quy tắc trước khi bạn có thể phá vỡ chúng.
  2. Trải nghiệm của tôi với SDK iOS là ở chỗ nó không thực thi sự tách biệt nghiêm ngặt giữa Chế độ xem và Mô hình, nó hướng rất nhiều vào mô hình đó. Khi viết ứng dụng iOS nói riêng, việc tuân thủ phân tách chế độ xem mô hình sẽ giúp bạn viết mã phù hợp với mong đợi của khung. Tôi ngần ngại khái quát các tuyên bố của Hegarty để phát triển trên các nền tảng khác hoặc nói chung.

1

Tôi đồng ý với Paul Hegarty và tin rằng Chế độ xem không được biết về Mô hình. Nó không khó để đạt được nhưng nó mang lại lợi ích bổ sung cho thiết kế và tính linh hoạt trong tương lai của bạn.

Trong các ứng dụng nhỏ (thường là máy tính để bàn) nơi tôi muốn tránh các lớp ViewModel "giả" và giữ mọi thứ đơn giản, tôi cũng sử dụng giao diện IModel (xem câu trả lời ở trên) và lưu ý rằng Model không biết gì về View (sử dụng thuê bao như trong MVC cổ điển).

Ngoài ra, trong trường hợp này, Bộ điều khiển được chuyển thành khá khớp với Chế độ xem và để đơn giản, tôi không phải lúc nào cũng phân tách chúng rõ ràng.

Cách tiếp cận đơn giản hóa thứ hai của Wikipedia là ổn khi bạn có thể có nhiều chế độ xem cho cùng một mô hình, nhưng tôi không khuyến nghị nếu bạn muốn sử dụng cùng một chế độ xem cho các mô hình khác nhau. Theo bản chất khác nhau, tôi có nghĩa là thực sự khác biệt về bản chất và không chỉ các lớp kiểm tra JUnit mà theo dõi mô hình chính.


1

Tôi tin rằng không có quy tắc cứng và nhanh cho việc này, nó hoàn toàn phụ thuộc vào nhu cầu của bạn.

Bạn sẽ tìm thấy những người có niềm tin khác nhau. Kiến trúc là các khái niệm để giúp thiết kế các giải pháp tốt hơn.

Ngoài giao tiếp ở chế độ xem mô hình, còn có một mâu thuẫn nữa về logic nghiệp vụ trong MVC. Nhiều người tin rằng tất cả logic kinh doanh phải là một mô hình (xem câu hỏi SO này ), mặt khác, liên kết được chia sẻ bởi Florian (trong câu trả lời của anh ấy) nói rằng logic kinh doanh nên nằm trên bộ điều khiển.

Ngoài ra, còn có khả năng phân chia logic nghiệp vụ thành logic ứng dụng (đặt nó trên bộ điều khiển) và đăng nhập tên miền (đưa nó vào mô hình).

Vì vậy, đạo đức của câu chuyện là MVC có nghĩa là mô hình, khung nhìn và bộ điều khiển nên tách biệt. Ngoài ra, bất cứ điều gì phù hợp với bạn nhất.


0

Tôi sử dụng DTO cho giao tiếp xem mô hình.

Ví dụ:

  • Người dùng điền vào Mẫu cập nhật (Chế độ xem)
  • Người dùng gửi mẫu
  • Trình điều khiển liên kết dữ liệu biểu mẫu với UserUpdateDTO
    • DTO và UserModel là POJO nhưng DTO không có id và tên người dùng vì chúng tôi không thể cập nhật tên người dùng.
    • Một điểm khác biệt nữa là lớp Model có các mối quan hệ và liên kết nhưng DTO chỉ lưu trữ dữ liệu và chúng tôi có thể thêm các trình xác nhận hợp lệ JSR 303 vào nó
  • Bộ điều khiển nói nó vào lớp dịch vụ để lưu
  • Lớp dịch vụ nói với lớp DAO để duy trì dữ liệu

-1

Tôi với trại nói rằng quan điểm không bao giờ nên giao tiếp với người mẫu. Bộ điều khiển phải luôn luôn là người quyết định mọi thứ, sau đó quyết định phải làm gì (xác nhận, yêu cầu dữ liệu từ mô hình, v.v.).

Tôi có xu hướng xem nó nhiều hơn như một vấn đề tổ chức mà bất cứ điều gì khác.


-1

Như nhiều người được đề xuất về lý do tại sao và cách xem và mô hình phải tương tác tự do trong các bối cảnh khác nhau, nhưng lý do chính trong iOS để tạo Trình điều khiển là người trung gian giữa chúng là để tránh phụ thuộc Mô hình & Xem trong cơ sở mã của bạn và cho phép chúng tôi sử dụng lại mô hình hoặc chế độ xem theo yêu cầu với sự phát triển của iOS.

Vì chúng tôi có thể cần giữ các bản cập nhật cho Ứng dụng của mình trong UI / UX hoặc Model hoặc đôi khi cả hai, nó không nên tạo mã phụ thuộc chế độ giữa mô hình & chế độ xem. Nếu bạn muốn thay đổi lớp Trình bày của ứng dụng, thì bạn chỉ cần đi và thay đổi nó sau đó bạn vẫn có thể sử dụng lại cùng một Mô hình và ngược lại có thể được thực hiện.

Mặc dù tôi đồng ý rằng MVC trong iOS tạo ra ViewControllers khổng lồ với rất nhiều logic khác nhau và xử lý mọi loại nội dung khác với mục đích của nó. Vì vậy, tốt hơn là bạn nên sử dụng MVVM hoặc Điều khiển trình bày để giúp cơ sở mã của bạn linh hoạt hơn, dễ dàng hơn để đọc và duy trì với ViewControllers nhỏ hơn.

Điều này có thể giúp những người đang tìm kiếm ViewControllers nhỏ hơn trong iOS:

http://blog.xebia.com/simplification-of-ios-view-controllers-mvvm-or-presentation-controls/

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.