2010-01-07 28 views
6

Trước khi hiển thị mô hình chế độ xem:MVC - Ai định dạng mô hình?

  1. dữ liệu đa ngôn ngữ được bản địa hóa;
  2. ngày, giá trị thời gian được định dạng;
  3. số được định dạng.

Ai thực hiện tất cả định dạng này - Bộ điều khiển hoặc Chế độ xem?

Tôi có đúng là tất cả các định dạng được thực hiện bởi Bộ điều khiển tạo ra cái gọi là ViewModel chỉ chứa giá trị được định dạng và gửi ViewModel này đến Chế độ xem?

Cảm ơn trước!

Trả lời

3

Eric Petroelje đúng, nhưng tôi sẽ xây dựng trợ giúp cho một lớp học để có được nội dung/ngày địa phương, v.v. vì bản địa hóa không phải lúc nào cũng có trong các lượt xem, ví dụ: gửi email có nội dung được bản địa hóa. Tôi sẽ có một cái gì đó như LocalisationHelper.GetString ("MyKey"), hoặc LocalisationHelper.GetDate (Date.Now), nơi LocalisationHelper biết miền địa phương hiện tại của người dùng (có thể từ Session).

Sau đó sử dụng này trực tiếp trong quan điểm nếu có thể:

<%= Html.Encode(LocalisationHelper.GetDate(Date.Now)) %> 
+1

Điều đó dường như phá vỡ khái niệm MVC khi chế độ xem của bạn thực sự sử dụng "Dịch vụ bản địa hóa" tức là hoạt động như bộ điều khiển. –

+1

LocalisationHelper không phải là một dịch vụ, nó sẽ chỉ là một trình định dạng để làm cho trình xem mã của bạn. Nó chỉ đơn giản là định dạng dữ liệu mà Controller của bạn đang cung cấp cho View của bạn. – JonoW

+0

@JonoW Tôi không thể đồng ý với bạn, bởi vì LocalisationHelper biết về phiên người dùng. Nó có nghĩa là nó là nhà nước - vì vậy nó không chỉ là một người trợ giúp tĩnh mà là một dịch vụ thực sự. Nếu không, bạn nên cung cấp nó với tham số Locale. –

1

Tất cả nội dung đó có vẻ như logic lớp trình bày, vì vậy cá nhân tôi nghĩ rằng nó sẽ được hiển thị trong chế độ xem.

ETA:

tôi sẽ không ủng hộ cho việc có các đối tượng lớp dịch vụ xem cuộc gọi theo nghĩa chung chung, nhưng đối với nội địa hóa tôi nghĩ rằng nó có ý nghĩa. Ví dụ: giả sử bạn có nhiều văn bản tĩnh trên các trang mà bạn đã mã hóa và lưu trữ trong cơ sở dữ liệu ở các biểu mẫu được bản địa hóa khác nhau. Tôi không nghĩ rằng nó sẽ có ý nghĩa cho bộ điều khiển phải tra cứu và đặt tất cả các thẻ văn bản trong mô hình. Mặc dù tra cứu mã thông báo văn bản về mặt kỹ thuật là một hoạt động "tầng dịch vụ", tôi vẫn nghĩ rằng nó có ý nghĩa cho chế độ xem để gọi dịch vụ đó trực tiếp thông qua một số lớp tiện ích thay vì có trình điều khiển làm điều đó.

+0

Sau đó, chúng ta nên cung cấp cái nhìn với dữ liệu bổ sung như "tài locale" và xem phải biết làm thế nào để bản địa hoá chuỗi theo miền địa phương và vân vân. Không phải là quá nhiều cho một cái nhìn? –

+0

@Andrey - Tôi nghĩ câu trả lời của JonoW tóm tắt cách xử lý vấn đề nội địa hóa chuỗi khá độc đáo. –

+0

Vui lòng xem nhận xét của tôi. JonoW cung cấp mô hình kết hợp mạnh mẽ trong đó cả bộ điều khiển và chế độ xem đều sử dụng cùng một dịch vụ. Tôi không thấy sự khác biệt giữa bộ điều khiển và xem sau đó. –

1

Quan điểm chịu trách nhiệm cho việc này không điều khiển.

Để giải thích tôi cần phải xây dựng một chút về những gì các "view" là:

Trong cả hai dựa trên web và truyền thống mẫu GUI MVC, các View là chịu trách nhiệm về các đại diện bên ngoài của bất cứ bộ phận của mô hình được hiển thị. Nếu điều đó có nghĩa là "định dạng" dữ liệu từ mô hình thì cũng vậy.

Bộ điều khiển không định dạng dữ liệu - bởi vì bộ điều khiển chịu trách nhiệm thực hiện mọi việc với mô hình dựa trên các sự kiện/lệnh đến từ thế giới bên ngoài. Bộ điều khiển không có gì để làm với kết quả đầu ra.

Ví dụ:

Tôi muốn hiển thị một giỏ mua hàng với một vài dòng theo thứ tự:

  • Thêm thứ vào giỏ hàng gây ra bộ điều khiển để thay đổi những gì trong mô hình giỏ hàng.
  • Thay đổi ngôn ngữ của tôi khiến trình điều khiển thay đổi cài đặt trong mô hình người dùng để biểu thị ngôn ngữ ưa thích.
  • Bất cứ khi nào giỏ hàng được hiển thị, chế độ xem phải hỏi mô hình cho các dòng đơn đặt hàng và quyết định cách hiển thị - có thể thực hiện công việc nhạy cảm về miền địa phương.
  • Cùng một khách hàng có thể yêu cầu xem giỏ hàng bằng nhiều loại tiền tệ khác nhau. Điều đó chỉ có nghĩa là thay đổi những gì nó trông giống như trong xem. Nó vẫn là cùng một giỏ mua hàng cho cùng một khách hàng với cùng những thứ trong đó.
  • Nếu đây là một ứng dụng web được tạo từ các trang mẫu web, bạn có thể nhúng mã để kéo các thư được bản địa hóa, ví dụ: <%= message_renderer.text(:insufficient_funds) %>. Trong trường hợp này, "message_renderer" và tệp mẫu đều là một phần của chế độ xem.

Chế độ xem không nhất thiết chỉ là mẫu dựa trên web. Ví dụ, trong một số khung công tác dựa trên Java, chúng ta đặt "các đối tượng xem" vào một mẫu tốc độ. Các đối tượng khung nhìn đó được liên kết ngược lại với các đối tượng trong mô hình, nhưng chúng cũng thực hiện hành vi dựng hình và định dạng theo yêu cầu. Đó là một phần của khung nhìn mặc dù chúng không chỉ là một mẫu.

Hơi bối rối với các khung như ruby ​​trên đường ray và groovy trên grails, nơi chúng gọi mẫu là "chế độ xem" - khi chế độ xem thực sự không chỉ là mẫu. Theo truyền thống (trong Smalltalk MVC và trong Swing của Java) xem chỉ là mã có thể thực hiện định dạng, kết xuất và bất kỳ hành vi nào khác liên quan đến hiển thị.

+0

Cảm ơn bạn! Nhưng nội địa hoá vẫn gây ra vấn đề cho tôi. Message_renderer của bạn trông giống như dịch vụ miền trạng thái biết về phiên người dùng (xem thêm các nhận xét của tôi bên dưới). Việc gọi dịch vụ từ chế độ xem có bình thường không? –

+0

Nó không phải là một dịch vụ. Đó là một đối tượng xem - và nó sẽ cần phải kết nối với các đối tượng mô hình để có được thông điệp được bản địa hóa đúng mặc dù bạn không thể thấy được từ đoạn mà tôi đã sử dụng. Tôi rất nghi ngờ về các dịch vụ vì chúng chỉ là những phần chức năng có thể nhìn thấy trên toàn cầu - không có gì để làm với MVC hoặc mã hướng đối tượng! – daf

+0

Vâng, bạn nói rằng Chế độ xem của bạn kết nối với Mô hình để có được ngôn ngữ người dùng. Nếu vậy tại sao không thể xem đó cũng "kết nối với mô hình" để có được các đối tượng để xem theo cách này - "repository.getBooks();"? Bạn không thấy điều gì lạ với mã này? Dường như Bộ điều khiển không cần thiết vì Chế độ xem của bạn có thể "kết nối với Mô hình". Tôi nghĩ rằng có một sai lầm ở đâu đó trong đề xuất của bạn. –

2

Design Patterns 101.

Mẫu là để lưu trữ dữ liệu (thường là cơ sở dữ liệu được hỗ trợ).

Xem để trình bày dữ liệu (không thao tác).

Bộ điều khiển là để thao tác mô hình và chuyển cho mô hình đó (chọn ngôn ngữ phù hợp ví dụ sẽ đến đây).

MVC không nhất thiết có nghĩa là bạn có 3 lớp riêng biệt, nhưng đúng hơn là 3 thành phần hoặc lớp. Đây là trừu tượng và không nhất thiết phải gắn liền với một lớp vật lý. Bên trong lớp điều khiển của bạn, có thể bao gồm bất kỳ số lượng lớp trợ giúp hoặc bất kỳ lớp nào.

Tôi đồng ý với một phần của những gì cartoonfox đang nói, mọi thứ được đan xen với nhau. Ví dụ: nếu bạn phát triển chế độ xem cho giỏ hàng nhưng mô hình có chứa thông tin sinh nhật thì mô hình sẽ không hoạt động. Nó chỉ đơn giản là một mẫu thiết kế để giúp loại bỏ sự trùng lặp của nỗ lực. Khi bạn có ít biến hơn và ít nhiễu hơn, sẽ dễ dàng hơn nhiều để tập trung vào những gì cần phải được thực hiện và hiểu nó rất tốt.

Tôi đã thảo luận với nhóm của chúng tôi về cách sử dụng chú thích để hiển thị biểu mẫu trên trang web. Các chú thích này được đặt trong lớp mô hình hoặc thực thể.Bạn sẽ thường xuyên làm việc trực tiếp với các lớp thực thể, do đó, nó loại bỏ khá nhiều phí tổn và sao chép nỗ lực nếu bạn đặt chú thích của mình ở đây. Bởi vì chú thích của bạn được đặt trực tiếp trên lớp mô hình, bạn không thể kết thúc với một cái nhìn cho thông tin sinh nhật, nó chỉ là không thể. Ngoài ra, bằng cách làm theo các mẫu, bạn loại bỏ rác mà không thêm giá trị cho kết quả cuối cùng. Bạn chỉ cần viết logic nghiệp vụ và gần như không có gì khác.

Mặc dù chú thích nằm trong cùng một lớp với lớp mô hình, lớp trình bày hoặc chế độ xem bao gồm các chú thích và lớp trợ giúp. Nó không nhất thiết phải là các lớp hoặc ranh giới riêng biệt.

Ví dụ khác sẽ là. Tôi đã làm việc trên một số "ứng dụng" web PHP trong quá khứ. Tôi sử dụng các ứng dụng vì chúng là một khối mã nguyên khối, ít nhiều là một phương pháp chính duy nhất với tất cả logic trong đó (mà hầu như không phải là một ứng dụng chức năng).

Nếu bạn không trừu tượng mã thành các hàm và chỉ cần sử dụng một phương thức duy nhất, bạn sẽ kết thúc với rất nhiều nỗ lực sao chép. Nếu bạn cố gắng hiểu rằng khối mã nguyên khối, bạn sẽ gặp rắc rối (như tôi, thật khó để biết chuyện gì đang xảy ra, sau đó tôi sẽ tìm một khối mã tương tự ở một nơi khác và bị chết lặng tại sao một vài điều đã được tinh chỉnh theo cách của chúng).

Có thể thực hiện theo bất kỳ cách nào bạn muốn, nhưng các mẫu thiết kế như MVC giúp bạn đơn giản hóa những gì bạn viết để làm việc cũng như dễ dàng quấn đầu xung quanh giải pháp. Một mẫu thiết kế hay cách tiếp cận phổ biến khác là phân chia và chinh phục.

Để trả lời câu hỏi ban đầu của bạn:

Trong Java, dữ liệu cục bộ sẽ được thực hiện một cách minh bạch bởi ứng dụng. Ví dụ, nếu bạn muốn hỗ trợ locale tiếng Anh Mỹ, bạn sẽ tạo ra một tập tin thuộc tính:

messages_en-US.properties

và sau đó đặt tất cả nội dung tiếng Anh Mỹ của mình trong đó. Tùy thuộc vào bao nhiêu nội dung này có thể được, bạn có thể muốn sử dụng một cách tiếp cận khác nhau.

Đối với đơn đăng ký của tôi, tôi có toàn bộ các trang bằng một ngôn ngữ khác nên tôi làm như vậy. Bộ điều khiển của tôi xác định vị trí của máy khách hoặc kết hợp tốt nhất. Sau đó, nó sẽ chọn chế độ xem nào để hiển thị và chuyển mô hình (dữ liệu) cho chế độ xem.

Nếu bạn cần định dạng động cho ngày/giờ của mình, thì trình điều khiển của bạn chịu trách nhiệm xác định loại nào sẽ được sử dụng. Sau đó, chế độ xem của bạn chịu trách nhiệm về việc sử dụng trình chuyển đổi đó để định dạng giá trị.

Tôi đang sử dụng JBoss Seam để mẫu thiết kế MVC vẫn được sử dụng, nhưng trừu tượng hơn. Tôi không có 'bộ điều khiển' thực sự, mà là một kẻ đánh chặn chịu trách nhiệm xử lý một phần chức năng cụ thể (xác định miền địa phương của khách hàng, sau đó một miền khác cho tùy chọn ngày/giờ của họ). Các bộ điều khiển của tôi tương đương với một bộ điều khiển Spring là các thành phần hành động chịu trách nhiệm xử lý các hành động trang.

Walter

Các vấn đề liên quan