Thiết kế Model-View -___ đúng


14

Tôi đã đọc về Trình điều khiển Chế độ xem Mô hình, Người dẫn chương trình Chế độ xem Mô hình, Chế độ xem Mô hình Chế độ xem, v.v. và nói chung, khái niệm cơ bản có vẻ khá đơn giản để hiểu: giữ cho hình ảnh đẹp và sự khoa học như tách biệt và không biết gì về nhau như khả thi. Không nhận được bơ đậu phộng logic trong sô cô la thiết kế; tuyệt, tôi thích điều đó

Vấn đề là tôi vẫn còn hơi mờ nhạt đối với phần thứ ba đó ... phần không theo mô hình hoặc xem. Mọi người dường như có ý tưởng riêng của họ về việc gọi nó là gì, nên làm gì, đúng đắn, sai lầm gì ... và tôi sẽ cố gắng tìm ra khi Người thuyết trình trở thành ViewModel và khi nào nên xem Không được làm điều đó bởi vì đó là công việc của Người thuyết trình và--

Tôi đang lan man.

Thay vì yêu cầu ai đó giải thích sự khác biệt giữa họ - bởi vì điều đó đã được thực hiện hết lần này đến lần khác (tôi biết; tôi đã đọc nhiều bài viết hơn tôi có thể đếm được) - Tôi tò mò muốn nghe suy nghĩ của một Một vài lập trình viên trên mô hình tôi đã tự mình lắp ghép.

Điều đó nói rằng, bạn sẽ phân loại thiết kế này là gì, và có lẽ quan trọng hơn, bạn có thấy bất cứ điều gì về điều này rõ ràng là hút? Chắc chắn, tôi rất thích nghe tôi làm tốt nếu đây thực sự là thiết kế chắc chắn, nhưng tôi muốn được tư vấn chắc chắn hơn lời khen ngợi.

Lưu ý: Tôi sẽ sử dụng "Cây cầu" cho phần thứ ba bí ẩn của Chế độ xem mô hình-? để tránh bất kỳ đề xuất tiềm thức nào về những gì nó "nên".

Mô hình

  • Là cơ quan có thẩm quyền về dữ liệu.
  • Nhận thông tin về các thay đổi được yêu cầu từ Cầu.
  • Chứa và thực hiện tất cả logic cho cách dữ liệu liên quan đến dữ liệu khác.
  • Thông báo cho Bridge khi dữ liệu thay đổi (đối với dữ liệu mà Bridge đã thể hiện sự quan tâm). Chỉnh sửa từ ngữ: Cho phép người đăng ký bên ngoài (về điều mà họ không biết gì) để theo dõi trạng thái hoặc kết quả tính toán.
  • Không có kiến ​​thức về Chế độ xem.

Lượt xem

  • Có liên quan với việc cung cấp cho người dùng một cách để xem và thao tác dữ liệu.
  • Nhận thông tin về cập nhật dữ liệu từ Cầu.
  • Chứa và thực hiện tất cả logic về cách trình bày dữ liệu và điều khiển cho người dùng.
  • Thông báo cho Bridge khi người dùng đã thực hiện một hành động (có thể) ảnh hưởng đến Model.
  • Thông báo cho Bridge những thông tin mà nó quan tâm.
  • Không có kiến ​​thức về Mô hình.

Cầu

  • Là người điều phối và dịch giả giữa Mô hình và Chế độ xem.
  • Làm cho bất kỳ thay đổi định dạng thích hợp nào đối với thông tin được truyền giữa Mô hình và Chế độ xem.
  • Giữ lại thông tin về "ai cần biết gì".
  • Có kiến ​​thức về cả Mô hình và Chế độ xem.

Ghi chú bổ sung

  • Trong các chương trình phức tạp hơn, thường có nhiều Mô hình. Trong tình huống này, Bridge thường đảm nhận công việc điều phối / dịch giữa nhiều Mô hình và do đó trở thành cơ quan cho những gì Mô hình protocall / API / thiết kế nên được xây dựng. (ví dụ: nếu xây dựng chương trình trò chơi bài và bạn muốn xây dựng mô hình xáo trộn sàn thay thế, bạn nên sử dụng Cầu để xác định những chức năng nào được yêu cầu để giao tiếp đúng với Cầu.)
  • Trong các chương trình đơn giản nhỏ chỉ có một Chế độ xem và Kiểu, Cầu nối "giả định" chức năng nào có sẵn ở hai bên. Tuy nhiên, khi các chương trình trở nên phức tạp hơn, chúng tôi khuyên rằng (các) Chế độ xem và Mô hình báo cáo chức năng của chúng với Cầu để có thể tránh được sự thiếu hiệu quả và các giả định lỗi.

Tôi nghĩ rằng chỉ cần bao gồm nó. Bằng mọi cách, tôi hoan nghênh mọi câu hỏi của bạn về thiết kế tôi có xu hướng sử dụng và tôi cũng khuyến khích mọi đề xuất.

Và như mọi khi, cảm ơn bạn đã dành thời gian.


2
Khối View có lỗi sao chép-dán. Tôi đoán viên đạn cuối cùng nên đọc "Không có kiến ​​thức về mô hình." Và câu cuối cùng của ghi chú bổ sung thứ 1 có lẽ nên kết thúc bằng "mô hình" chứ không phải "cầu nối" ??
Julian S.

Câu trả lời:


7

Cụm từ của bạn

"Là người điều phối và dịch giả giữa Người mẫu và Người xem."

chỉ ra rằng Cầu của bạn là Người thuyết trình trong kiến ​​trúc MVP.

MVP và MVC rất giống nhau, ngoại trừ trong MVP, chỉ Người trình bày quan sát Mô hình trong khi trong MVC, Chế độ xem cũng được phép quan sát trực tiếp Mô hình (không có Người thuyết trình là "Cầu nối").

Trách nhiệm người mẫu của bạn

"Thông báo cho Bridge khi dữ liệu thay đổi (đối với dữ liệu mà Bridge đã thể hiện sự quan tâm)."

có lẽ là sai ngữ pháp hoặc có thể là một sai lầm: bạn không muốn Mô hình có sự phụ thuộc vào Cầu / Người trình bày / Trình điều khiển hoặc Chế độ xem. Thay vào đó, bạn sử dụng mẫu Quan sát viên, Sự kiện hoặc Lập trình phản ứng để cho phép Cầu đăng ký thay đổi trong Mô hình. Và sau đó bạn có thể viết lại trách nhiệm của mình là:

"Cho phép những người đăng ký bên ngoài (về điều mà họ không biết gì) để theo dõi kết quả tính toán hoặc trạng thái của nó."

Nếu Model của bạn không có phụ thuộc vào Trình điều khiển hoặc Chế độ xem của bạn, việc kiểm tra sẽ dễ dàng hơn và dễ mang theo hơn.


1
Nếu sự khác biệt chính là nếu Chế độ xem có thể hoặc không thể quan sát Mô hình, thì thiết kế chắc chắn là MVP nhiều hơn; Chế độ xem và Mô hình không bao giờ được phép nói trực tiếp trong thiết kế tôi đang sử dụng.
KoratDragonDen

Trách nhiệm của Người mẫu là một từ ngữ kém, tôi nghĩ vậy. Mô hình không thực sự có manh mối hoặc quan tâm đến ai / cái gì / tại sao những điều muốn nghe nó, mà sẽ chỉ xuất bản bất kỳ thay đổi nào đã được thực hiện cho người đăng ký. Nội dung hoàn toàn tồn tại một mình mà không có người đăng ký dưới bất kỳ hình thức nào và không cố gắng thu hút người đăng ký mới.
KoratDragonDen

1
Âm thanh như bạn đã có một thiết kế tốt, sau đó. PS Lý do để xem xét MVC qua MVP là, nếu không có kỷ luật, Người trình bày có thể trở nên quá tải.
Larry OBrien

1
+1 chỉ đơn giản là nêu rõ sự khác biệt giữa MVC và MVP. Giống như OP, phần còn lại của internet khiến tôi hoàn toàn lạc lối về việc liệu những từ viết tắt này có khác biệt chút ít hay không.
Ixrec

5

Tôi nghi ngờ một trong những điều khiến bạn bối rối là có hai mẫu hoàn toàn khác nhau thường được gọi là bộ điều khiển mô hình-khung nhìn.

Có bản gốc, được triển khai trong smalltalk và rất hữu ích cho các hệ thống gui cục bộ, và có những gì tôi có xu hướng nghĩ là web-mvc, xoay quanh một số trách nhiệm của các khung nhìn và bộ điều khiển để bộ điều khiển có thể ngồi trên máy chủ lượt xem trên máy khách (có thể là html được hiển thị hoặc có thể thông qua ajax).

Mô tả của bạn nghe có vẻ như nó sẽ nằm trong hầu hết các định nghĩa về web-mvc.


Điều đó có thể giải thích tại sao tôi gặp quá nhiều khó khăn trong đầu. Cảm ơn bạn; thật tốt khi biết tôi (có lẽ) không làm gì sai trái khủng khiếp với khái niệm MVC.
KoratDragonDen

Đối với các ứng dụng web một trang hiện đại, chúng tôi quay lại mẫu MVC cổ điển ở phía máy khách.
kevin cline

2

Có rất nhiều cuộc thảo luận trong cộng đồng lập trình về danh pháp chính xác này. Không ai có vẻ đồng ý về nhiều thứ.

Đối với tôi, làm thế nào cây cầu được nối với khung nhìn chủ yếu xác định tên.

  • Nếu có thể có một tập hợp các khung nhìn trên mỗi cây cầu, thì cây cầu là một bộ điều khiển.
  • Nếu luôn có một chế độ xem cho mỗi cây cầu, thì cây cầu là người trình bày.
  • Nếu có thể có một tập hợp các cây cầu trên mỗi khung nhìn, thì cây cầu là một mô hình khung nhìn.

Đôi khi mọi thứ không quá rõ ràng. Ví dụ: người thuyết trình có thể được kết nối với chế độ xem tổng hợp được tạo từ nhiều lần xem hoặc bộ điều khiển có thể được tạo mà không có bất kỳ kiến ​​thức nào về quan điểm của nó. Mặc dù vậy, tôi nghĩ rằng các quy tắc của tôi là một khởi đầu tốt.


Là một lưu ý phụ, tôi muốn kết hợp các trách nhiệm như thế này:

Mô hình

Trách nhiệm chính: Dữ liệu bền bỉ
Vai trò thứ cấp: Xác thực cập nhật, thông báo cho người quan sát cập nhật

Lượt xem

Trách nhiệm chính: Dữ liệu hiện tại
Vai trò thứ cấp: Chấp nhận đầu vào, hiện tại UX

Cầu

Trách nhiệm chính: Cập nhật dữ liệu
Vai trò thứ cấp: Làm sạch đầu vào, đồng bộ hóa dữ liệu và chế độ xem


0

Mặc dù mô hình được đề xuất của bạn có vẻ chính xác trên bề mặt và chắc chắn sẽ hoạt động trong các trường hợp nhỏ, vì ứng dụng của bạn trở nên phức tạp hơn, bạn sẽ không gặp phải vấn đề gì khi cập nhật những gì, ai lắng nghe ở đâu và tại sao tôi lại cố gắng để kiểm soát rất nhiều Mô hình từ bên trong rất nhiều Chế độ xem, tất cả những người cần truy cập vào nhau, v.v.

Tôi khuyên bạn nên mở rộng ý tưởng của mình bằng cách sử dụng mẫu sau (lấy từ bài nói chuyện của kẻ thù của Amy Palamenez ):

Mô hình

  • Đồng bộ hóa trạng thái với kho lưu trữ dữ liệu
  • Xử lý xác nhận dữ liệu mới / cập nhật
  • Tăng sự kiện khi họ thay đổi trạng thái

Lượt xem

  • Kết xuất mẫu
  • Xử lý các sự kiện Model
  • Xử lý các sự kiện DOM
  • Làm trung gian cho sự tương tác giữa Model và DOM

Bộ điều khiển

  • Quản lý nhiều nhất một vài Mô hình & Lượt xem
  • Theo dõi Lượt xem trong một container

Mô-đun

  • Nhóm hợp lý của Bộ điều khiển và Khung nhìn & Mô hình của nó
  • Có thể kiểm tra
  • Nhỏ và có thể bảo trì (Trách nhiệm duy nhất)
  • Tọa độ (thông qua Bộ điều khiển) trạng thái và sự kiện của Chế độ xem & Mô hình mà nó chứa
  • Tự do trình bày quan điểm của riêng mình
  • Không được tự do chọn nơi trình bày Quan điểm của mình

Trình quản lý bố cục

  • Chịu trách nhiệm bố trí thành phần
  • Xác định hệ vỏ ứng dụng trong DOM với các khu vực mà Mô-đun có thể trình bày nội dung của chúng

Điều phối

  • Lắng nghe các sự kiện (thông qua luồng PubSub toàn cầu)
  • Chịu trách nhiệm tải các Mô-đun mới dựa trên Sự kiện
  • Tắt các Mô-đun đã tải cho Trình quản lý Bố cục
  • Quản lý toàn bộ vòng đời của Mô-đun (tạo, dọn dẹp, lưu trữ, v.v.)
  • Ví dụ về sự kiện:
    • Thay đổi tuyến đường (bao gồm tuyến đường tải ban đầu)
    • Tương tác người dùng
    • Sự kiện mô-đun nổi lên từ một sự kiện Mô hình do thay đổi trạng thái phía máy chủ, v.v.

Ứng dụng

  • Chịu trách nhiệm thiết lập tổng thể, Khởi tạo những thứ như:
    • Điều phối
    • Bộ định tuyến
    • Luồng PubSub
    • Người khai thác gỗ
    • Vân vân

Kiểu mẫu này cho phép ứng dụng của bạn có thể ghép lại được, đơn vị được kiểm tra, loại bỏ sự phức tạp mà một cây cầu sẽ xây dựng theo thời gian, giữ cho các mối quan tâm được phân tách độc đáo, v.v.

Như Amy chỉ ra: Cẩn thận không xây dựng máy chủ trên máy khách. Và hãy cẩn thận để không rơi vào học thuyết "Tôi đang tạo một khuôn khổ MV *, do đó tôi phải ___!" Thay vào đó, hãy lấy tất cả những ý tưởng này (và các câu trả lời khác ở đây) và tìm ra những gì phù hợp nhất với ứng dụng và nhóm của bạn.

Tôi đặc biệt khuyên bạn nên xem Enemy of the State của Amy Palamenez (từ đó những ý tưởng này xuất hiện), hoặc ít nhất là xem qua các slide từ buổi nói chuyện .

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.