9

Tôi có câu hỏi về Mẫu thiết kế Model-View-Controller. Tôi hiểu mô hình nắm giữ dữ liệu. Tôi cũng hiểu Bộ điều khiển (View Controllers) thực hiện logic của ứng dụng. Ví dụ, nếu bánh xe UIPicker chọn hàng 4, thì Trình điều khiển Xem có thể yêu cầu Mô hình cho đối tượng thứ 4 được lưu trữ trong mảng của Mô hình. Tôi hiểu rằng tập tin nib/storyboard sẽ được phân loại là "View". Tuy nhiên, mỗi chế độ xem yêu cầu phải có Bộ điều khiển chế độ xem được kết nối để nối tất cả các cửa hàng với chế độ xem. Làm thế nào tôi giả sử để giữ cho View và View Controller tách ra? Tôi có nên dây tất cả các cửa hàng vào "View Class" và sau đó trong View Controller của tôi tham chiếu lớp "View" của tôi khi thực hiện logic của các cửa hàng đó? Có lẽ tôi chỉ cần một ví dụ mà View và View Controller xử lý các nhiệm vụ khác nhau. Bởi vì nếu không thì lớp "View" bổ sung dường như không có ý nghĩa. Chế độ xem của MVC có đề cập đến Lớp xem không? Làm thế nào hoặc tại sao tôi muốn có lớp View này được tách ra khỏi lớp View Controller của tôi?Mẫu thiết kế MVC. View phù hợp với nó như thế nào?

Trả lời

14

Công việc của một lượt xem là hiển thị dữ liệu và báo cáo sự kiện.

Công việc của bộ điều khiển là phối hợp liên lạc giữa các chế độ xem và kiểu máy.

Công việc của dữ liệu là lưu trữ dữ liệu và cũng để cung cấp logic nghiệp vụ xung quanh dữ liệu đó.

Bạn hỏi:

Tôi đang gặp khó hiểu là "Views" phù hợp

Trong ví dụ của bạn, UIPickerView là quan điểm..

Trong iOS/OSX, bộ điều khiển chế độ xem chỉ là bộ điều khiển của MVC. Nó chỉ xảy ra khi một bộ điều khiển khung nhìn cũng chứa một vùng chứa khung nhìn trống mà bạn có thể thêm tất cả các khung nhìn khác vào. Nhưng vẫn có sự tách biệt rõ ràng của MVC trong iOS/OSX.

Tất cả các lớp như UIButton, UIPickerView, UITableView, v.v. thể hiện chế độ xem. Công việc của bộ điều khiển chế độ xem là cung cấp các chế độ xem đó với dữ liệu từ các mô hình dữ liệu cũng như phản hồi các sự kiện từ các chế độ xem đó cho bạn cơ hội cập nhật các chế độ xem khác và các mô hình dữ liệu.

Bạn cũng tuyên bố:

Tuy nhiên mỗi quan điểm đòi hỏi một View Controller được kết nối với dây lên tất cả các cửa hàng để xem. Làm thế nào tôi giả sử để giữ cho View và View Controller tách ra?

Chúng riêng biệt. Nếu bạn thêm UITableView, đó là chế độ xem riêng. Bạn kết nối nó với một lớp để lớp có thể thực hiện nguồn dữ liệu và phương thức ủy nhiệm. Lớp đó là một lớp điều khiển. Nó là phổ biến cho lớp điều khiển này là một bộ điều khiển xem nhưng nó không phải là. Bạn có thể viết tất cả các loại lớp xem tùy chỉnh độc lập với bất kỳ trình điều khiển chế độ xem cụ thể nào (hoặc bộ điều khiển chung). Nhưng cuối cùng lớp xem đó cần được nối với lớp điều khiển [view] để dữ liệu và sự kiện có thể được xử lý đúng cách.

Bạn hỏi:

thế nào hay tại sao tôi muốn có điều này Xem lớp tách ra khỏi lớp View điều khiển của tôi?

Nhìn vào UITableViewController. Đây là một ví dụ rõ ràng về sự tách biệt nhưng nó được cung cấp trong một gói khá gọn gàng. Bạn thực sự có một lớp riêng biệt UITableView là chế độ xem. Chế độ xem này chịu trách nhiệm hiển thị chế độ xem và thu thập tương tác của người dùng. Nó là bộ điều khiển xem bảng thực tế cung cấp dữ liệu cho khung nhìn và xử lý các sự kiện của người dùng từ khung nhìn.

Bạn có thể thêm UITableView lượt xem vào bất kỳ chế độ xem nào. Đây là một thành phần xem lại hoàn toàn có thể sử dụng lại được. Mỗi bộ điều khiển bạn kết nối với chế độ xem bảng có thể cung cấp mọi dữ liệu thích hợp và xử lý đúng các tương tác của người dùng.

+1

wow cảm ơn bạn đã trả lời kỹ lưỡng! Tôi cảm thấy như thế này là câu trả lời cụ thể nhất của iOS để trả lời gốc câu hỏi của tôi. Bạn nói rằng View Controller là các đối tượng điều khiển (và không phải là sự pha trộn giữa các bộ điều khiển và các đối tượng xem). Bạn nói lượt xem là thứ bậc của các đối tượng trên chế độ xem trống đi kèm với tệp storyboard/xib. Tôi nghĩ rằng tôi đang nghĩ rằng một đối tượng "Xem" không tồn tại nếu không có một lớp riêng biệt cụ thể cho nó. Có vẻ như nhiều lần đối tượng "View" sẽ không yêu cầu một lớp riêng biệt. Tuy nhiên, một số khung nhìn nhất định (như lượt xem bảng) yêu cầu các lớp xem (như dạng ô xem bảng). – iOSAppGuy

+0

Mọi tiện ích bạn kéo vào bảng phân cảnh hoặc bộ điều khiển xem là một lớp xem riêng biệt. Điều này rõ ràng hơn nhiều khi bạn làm mọi thứ trong mã. – rmaddy

+0

cảm ơn! Câu trả lời này chắc chắn nhận được một dấu kiểm. Điều đó rõ ràng rất nhiều. Không tôn trọng những người khác đã trả lời, nhưng tôi nghĩ tôi nên nói rằng tôi đang làm việc trong việc phát triển xcode cho iOS. Tôi đã ngạc nhiên xem điều khiển xem là một bí ẩn đối với một số - nhưng tôi đoán MVC áp dụng cho các ngôn ngữ khác nhau mà không sử dụng các đối tượng điều khiển xem. – iOSAppGuy

1

Ok, tôi sẽ cố gắng sắp xếp mọi thứ một chút.

Mẫu được gọi là Model-View-Controller, do đó tách rõ ràng Mô hình, Chế độ xem và Bộ điều khiển. Như bạn đã chỉ ra một cách chính xác, ViewController đặt mọi thứ lại với nhau (từ View và Controller :) và thực sự ViewController phá vỡ mô hình MVC mạnh. Tin tốt là: bạn không phải tách chế độ xem và bộ điều khiển nếu bạn đang sử dụng một ViewController (đoán tại sao nó được đặt tên theo cách đó?).

Bây giờ tôi giải thích lý do tại sao nooby của việc thiết kế là những gì nó là:

Khi bạn mạnh mẽ tách View và Controller về cơ bản bạn kiếm được điểm tín dụng đối với thiết kế tốt. Tuy nhiên, khi nó quay ra, hai người họ không tách rời như chúng tôi muốn. Các biểu diễn GUI khác nhau thường yêu cầu triển khai chế độ xem khác nhau cũng như sự thích nghi của bộ điều khiển kiểm soát việc chuyển tiếp Mô hình tới GUI, ví dụ: hiển thị văn bản thuần trên bảng điều khiển so với bản vẽ trên bitmap. Trong trường hợp đầu tiên, Bộ điều khiển của bạn sẽ chuyển một chuỗi tới dạng xem được hiển thị, trong lần thứ hai, nó cũng cần phải thiết lập một số tọa độ để có được văn bản được hiển thị đúng nơi. Do đó, bộ điều khiển của bạn sẽ thay đổi khá thường xuyên.

Trường hợp lý tưởng sẽ là triển khai mô hình và bộ điều khiển và chỉ đơn giản cung cấp quan điểm cho bất kỳ điều gì mà bất kỳ ai sẽ thấy trong thực tế trực tiếp. Tuy nhiên, trong các tình huống thực tế, bộ điều khiển rất có thể sẽ thích nghi với chế độ xem trong khi chỉ rời khỏi mô hình. Do đó quyết định thiết kế để kết hợp khung nhìn và bộ điều khiển với một ViewController có chứa một khung nhìn cụ thể và biết cách sử dụng nó chỉ là một cách hợp lý để đi.

+1

-1 Không có "bộ điều khiển xem" trong mẫu thiết kế MVC –

+0

cảm ơn. Nếu tôi hiểu điều này một cách chính xác, khi làm việc với View Controllers, rất có thể tôi sẽ làm việc với một mô hình Model - ViewController thay vì một mẫu M-V-C. Điều này có thể tốt hoặc có thể xấu tùy thuộc vào mức độ phức tạp của ứng dụng của tôi. Vì vậy, có lẽ nếu tôi muốn đi với mô hình M-V-C, khi kéo một đối tượng ViewController vào bảng phân cảnh của tôi, tôi sẽ thay đổi lớp của nó thành một lớp View tùy chỉnh thay thế. Tôi sẽ tạo một lớp khác cho mô hình của tôi và một lớp khác cho bộ điều khiển của tôi. Điều này sẽ giữ cho mọi thứ sạch sẽ và tôi sẽ không bị cám dỗ để dơ bẩn mẫu thiết kế của tôi với một ViewController. – iOSAppGuy

+1

@ tereško không có. Tuy nhiên, như câu hỏi ban đầu cho thấy chủ đề là phát triển iOS/OSX (đó là nơi ViewControllers là từ) và tôi chỉ cố gắng giải thích lý do tại sao các nhà thiết kế đã chọn khái niệm đó trong khi truyền bá MVC. –

0

Để trả lời câu hỏi của bạn, hãy chia nhỏ MVC - Mô hình, Chế độ xem, Bộ điều khiển. Điều gì xảy ra ở đâu?

Mô hình thường được coi là lớp "làm điều gì đó". Điều này giữ logic kinh doanh và logic dữ liệu. Mô hình của bạn phải là FAT, không phải SKINNY, nghĩa là bạn nên có nhiều mã trong Mô hình.

Bộ điều khiển, tôi xem xét lớp "phản hồi". Đây là nơi bạn quyết định điều gì sẽ trả lại cho người dùng, cho dù đó là Chế độ xem hoặc loại phản hồi khác, chẳng hạn như JSON (đặc biệt hữu ích trong các phản hồi RESTful). Bạn cũng có thể sử dụng Mô hình, nhưng bạn không nên xây dựng quá nhiều logic vào chính Bộ điều khiển. Bạn cần có bộ điều khiển SKINNY.

Xem phần lớn là đánh dấu cho trang - HTML cùng với đánh dấu khác để nhận quyền truy cập vào mô hình - điều này phụ thuộc vào khung bạn đang sử dụng. Kinh nghiệm của tôi là với MVC .NET, vì vậy tôi sẽ đi với điều đó.Kết hợp với HTML, bạn sẽ truy cập vào các phần tử Mô hình. Không nên có bất kỳ logic thực sự trong View, nhưng bạn có thể làm những việc như (sử dụng cú pháp Razor)

<div>@foreach person in Model.Users{ 
    <p>@person.FullName</p> 
} 
</div> 

Vì vậy, bạn có thể thấy rằng các View có thể có một số "logic hiển thị" (như, vòng qua người và nhận được FullName) nhưng đó là tất cả các bạn thực sự nên có.

Dưới đây là một slideshow nhanh chóng giải thích thêm về MVC, bao gồm cả lý do tại sao giải thích ban đầu của bạn về "Mô hình tổ chức dữ liệu, điều khiển giữ logic" thực sự là không đúng sự thật: http://www.slideshare.net/damiansromek/thin-controllers-fat-models-proper-code-structure-for-mvc

Các Pattern MVC Thiết kế không bao gồm bất cứ điều gì gọi là "ViewController", đó là đến từ một nơi khác.

+0

James - Tôi đang tạo ứng dụng iOS trong Objective C bằng Xcode. Khi xây dựng các khung nhìn đồ họa, các đối tượng được sử dụng được gọi là các bộ điều khiển xem. Ngoài ra còn có các bộ điều khiển xem bảng, vv Khi khởi động một dự án, bạn đã trình bày với một bộ điều khiển xem trống và một lớp bộ điều khiển dạng xem. Mọi người đều dạy xây dựng iOS bằng cách sử dụng bộ điều khiển chế độ xem. Những người này cũng giảng về M-V-C. Khi trình diễn các ứng dụng xây dựng, mọi thứ hòa trộn với các bộ điều khiển xem – iOSAppGuy

+0

Sau một googling ngắn gọn, có vẻ như ViewControllers là loại "bộ điều khiển nâng cao" mà bạn có thể sử dụng để quản lý nhiều Chế độ xem. Tôi phải chỉ ra rằng đây vẫn không phải là một phần của mô hình MVC truyền thống, đó là những gì tôi đã đăng ở trên, đây là điều gì đó khác biệt. MVC có nghĩa là nhiều điều với nhiều người, nhưng cách chấp nhận tiêu chuẩn là những gì tôi đã giải thích. –

1

Thực ra điều bạn hiểu là hoàn toàn sai.

Nguyên tắc cốt lõi đằng sau mẫu thiết kế MVC là Separation of Concerns. Bạn tách lớp mô hình khỏi lớp trình bày và (trong lớp trình bày) bạn tách các khung nhìn khỏi bộ điều khiển.

Mỗi có Pars có một trách nhiệm khác nhau:

  • mô hình lớp chứa tất cả các logic kinh doanh. Điều đó bao gồm sự tương tác với lưu trữ, logic miền và logic ứng dụng.
  • chế độ xem chịu trách nhiệm về logic UI. Trong ngữ cảnh của Web, điều này có nghĩa là chế độ xem tương tác với việc tạo phản hồi cho người dùng
  • điều khiển là phần lấy đầu vào của người dùng và dựa trên đó, thay đổi số lượng của lớp mô hình và chế độ xem hiện tại.

Có rất nhiều quan niệm sai lầm về MVC mà mọi người có xu hướng kéo dài. Ví dụ:

  1. Một số sẽ nhấn mạnh rằng chế độ xem là mẫu câm. Họ không phải.

    Chế độ xem trong mẫu thiết kế MVC là ví dụ đầy đủ chức năng mà giao dịch có thể hoặc không thể sử dụng nhiều mẫu để tạo phản hồi.

  2. Không có "mô hình". Mô hình là một lớp, bao gồm nhiều nhóm lớp khác nhau, mỗi nhóm có nhiệm vụ cụ thể. Tương tự như không có đối tượng "bản trình bày" cho lớp bản trình bày

  3. Bộ điều khiển không gửi dữ liệu từ lớp mô hình đến chế độ xem. Bộ điều khiển chỉ thay đổi trạng thái của các phần khác của bộ ba. Bản thân khung nhìn yêu cầu những gì họ cần từ lớp mô hình.

+1

Bạn nên nhớ rằng câu hỏi không chỉ là về mẫu MVC. Nó là về việc áp dụng các mô hình MVC trong một bối cảnh thế giới thực (cụ thể là iOS - đọc văn bản!). Nó có thể được gắn thẻ sai, nhưng sử dụng ý thức chung của bạn. –