Nếu MVC là tách biệt các mối quan tâm thì tại sao lại được giới thiệu về Dao động Cú pháp?


22

Câu hỏi của tôi liên quan đến mẫu thiết kế MVC và Cú pháp được giới thiệu bởi Microsoft.

Trong khi học mẫu thiết kế MVC, tôi được cho biết rằng ý tưởng này dựa trên một nguyên tắc được gọi là Tách biệt các mối quan tâm .

Nhưng Razor Syntax cho phép chúng tôi sử dụng C # trong Lượt xem trực tiếp.

Đây không phải là giao điểm của mối quan tâm?


7
Điều đáng nói là ASP.NET MVC không thực sự triển khai mẫu thiết kế MVC. MVC ra lệnh rằng mô hình được quan sát bởi khung nhìn cho những thay đổi rõ ràng không phải là trường hợp trong ASP.NET MVC.
Benjamin Gruenbaum

11
Nó cũng có thể hữu ích nếu bạn thay đổi cách bạn nghĩ về Lượt xem. Lượt xem không phải là mã phía máy khách. Chúng là các mẫu phía máy chủ, khi được xử lý, tạo html phía máy khách. Và là mã phía máy chủ, hoàn toàn có thể chấp nhận rằng có mã C # ở đó.
Eric King

6
@EricKing ngoại trừ phần mà các hệ thống tạo khuôn mẫu cho phép mã tùy ý luôn dẫn đầu, thông qua đường dẫn ít kháng cự nhất, đến thiết kế xấu, vi phạm phân lớp khủng khiếp và không thể nhầm lẫn. Thật không may, nó dường như là một bài học mà mọi cộng đồng phải tự học.
hobbs

12
@hobbs Wow, ok. Không theo kinh nghiệm của tôi. Chắc chắn không phải lúc nào cũng vậy, và (tất nhiên) có một số trách nhiệm nghề nghiệp cần có đối với người lập trình. Tôi không đổ lỗi cho công cụ.
Eric King

7
@BenjaminGruenbaum Không giống như mọi "MVC" -framework ngày nay khác nhau về cách họ quản lý sự phụ thuộc lẫn nhau? Đến mức không còn hữu ích khi nói về The One And Only True MVC-Style, nhưng ở đâu sẽ thực dụng hơn khi sử dụng thuật ngữ cho bất kỳ hệ thống nào phân chia hợp lý trách nhiệm trong Mô hình , Khung nhìnBộ điều khiển, tuy nhiên những thứ này phụ thuộc lẫn nhau?
Alex

Câu trả lời:


66

Bạn đang kết hợp cú pháp Dao cạo với sự phân tách các mối quan tâm.

Việc phân tách các mối quan tâm có liên quan đến cách bạn cấu trúc mã của mình.

Có thể sử dụng C # trong chế độ xem không ngăn chặn điều đó. Nó không có gì để làm với sự tách biệt các mối quan tâm như vậy.

Chắc chắn, bạn có thể cấu trúc mã theo quan điểm của mình để không tuân thủ phân tách mối quan tâm, nhưng còn mã C # được sử dụng cho mục đích hiển thị thì sao? Nơi đó sẽ sống ở đâu?


1
Nhưng C # là ngôn ngữ phía máy chủ?
John Strowsky

6
@ John - vậy sao? Nếu bạn cần định dạng ngày để hiển thị (và luôn hiển thị nghĩa là phía máy khách), bạn sẽ định dạng chúng ở đâu? Ngươi mâu? Bộ điều khiển? Cũng không. Bạn sẽ làm như vậy trong xem.
Oded

16
@ John - vì vậy, ngày của bạn được lưu trữ trong DB, bạn chuyển nó qua mô hình / bộ điều khiển để xem. Bạn cần có trong HTML, vì vậy bạn sẽ xuất nó bằng cách nào đó sang định dạng JS, thay vì định dạng trực tiếp bằng C #? Tại sao? Tại sao điều đó tốt hơn? Hay đúng hơn, làm thế nào là cách tiếp cận nhiều hơn của một mối quan tâm?
Oded

25
@ NPSF3000 - ngôn ngữ không phải là "phía máy chủ" hay "phía máy khách". Đó là một sự tách biệt về kiến ​​trúc - và có thể là một trong những triển khai ngôn ngữ (là JavaScript là ngôn ngữ phía máy chủ hoặc ngôn ngữ phía máy khách - hãy nhớ node.js).
Oded

14
@FreeAsInBeer - đây là loại logic thuộc về phía khách hàng - ai đó ở Pháp sẽ muốn xem ngày (và tiền tệ / số) được định dạng khác với ai đó ở Hoa Kỳ. Khách hàng sẽ "biết" tốt nhất những thứ này sẽ được hiển thị như thế nào. Đây là logic trình bày , và như vậy thuộc về quan điểm.
Oded

35

Thay vì trả lời trực tiếp câu hỏi, câu trả lời của tôi đặt ra giả định trong câu hỏi. Đó là, giả định rằng Dao cạo được xây dựng cho MVC là không chính xác. Tôi làm việc tại Microsoft trong nhóm ASP.NET và có kiến ​​thức đầu tiên về điều này.

Dao cạo không bắt đầu như một công cụ xem cho MVC. Nó được tạo ra cho các trang web ASP.NET , có lẽ là xa nhất mà bạn có thể đi về phía ít quan tâm nhất của quang phổ. Nó được tạo ra như là một thay thế hiện đại cho ASP.NET Web Forms / Classic ASP và tất nhiên nhiều khung lập trình máy chủ tương tự khác. Ý tưởng của dao cạo là tạo ra các chuyển tiếp gần như liền mạch giữa HTML (đánh dấu) và C # (mã).

Chỉ sau đó, nhóm (bao gồm cả bản thân tôi) mới quyết định rằng cú pháp Dao cạo sẽ có ý nghĩa rất lớn vì lợi ích của công cụ xem cho MVC, được viết bởi cùng một nhóm.

Về việc liệu Dao cạo có cho phép, cản trở, cải thiện hoặc thay đổi khái niệm phân tách mối quan tâm trong ASP.NET MVC hay không, câu trả lời của Oded được đặt ra.


2
Yay, downvote mà không có một bình luận. Tôi đã sửa đổi câu trả lời của mình để làm rõ rằng tôi đang đặt câu hỏi về giả định được đưa ra trong câu hỏi ban đầu. Theo tôi thấy, câu hỏi không thể trả lời trực tiếp vì nó có tiền đề không hợp lệ.
Eilon

Vì tò mò, có công cụ tạo khuôn mẫu nào khác được xem xét cho ASP MVC không?
Tây Bắc

2
@NWard Có một số công cụ xem bên thứ 3 cho ASP.NET MVC tại thời điểm đó, nhưng chúng tôi đã không xem xét chúng quá mạnh mẽ. Chúng tôi cảm thấy rằng Dao cạo dễ hiểu hơn (HTML là HTML, C # là C #) và cũng hoạt động tốt hơn với dự án ASP.NET Web Pages.
Eilon

1
@Alex oh Tôi chắc chắn không thể lấy tín dụng cho tất cả các Dao cạo, nhưng tôi đánh giá cao nhận xét của bạn!
Eilon

1
@ateri Sau một thời gian ngắn, nó là số lớn ở phía trên bên trái của câu trả lời.
Đánh dấu

9

Bạn đang nhầm lẫn giữa "tách công nghệ" với "tách mối quan tâm". Ý tưởng cơ bản đằng sau phần "Chế độ xem" của MVC là mã trong "Chế độ xem" không trực tiếp thực hiện bất kỳ quyền truy cập dữ liệu hoặc logic nặng nào, thay vào đó, phần còn lại dành cho các phần "Mô hình" và "Trình điều khiển". "Bộ điều khiển" biến đổi dữ liệu, thực hiện bất kỳ logic cần thiết nào và định tuyến nó đến "Chế độ xem" chính xác. Chế độ xem cũng có thể thực hiện chuyển đổi dữ liệu, nhưng tôi có xu hướng giữ chúng hoàn toàn là mỹ phẩm, chẳng hạn như biến đổi ngày được đề cập ở trên.


điều này dường như không cung cấp bất cứ điều gì đáng kể qua các điểm được thực hiện và giải thích trong các câu trả lời trước, đặc biệt là điểm này
gnat

4
+1 Công thức một cách ngắn gọn và rõ ràng và với trọng tâm giải thích khác với các câu trả lời trước đó.
Alex

@gnat Tôi chỉ muốn làm rõ sự nhầm lẫn của anh ấy nằm ở đâu và sau đó nhanh chóng giải thích nguyên tắc phân tách mối quan tâm áp dụng cho mẫu thiết kế MVC. Có lẽ tôi nên dành nhiều thời gian hơn cho "tách mối quan tâm" nghĩa là gì?
whoisthemachine

0

Tôi có thể nghĩ về một Don't do itví dụ hoàn hảo .

Hãy nói rằng chúng tôi có một ProductContoder:

public class ProductController()
{
    public ViewResult Discontinued()
    {
        var db = new ProductsDb();
        var products = db.Products.Where(x => x.Discontinued).ToList();
        return new ViewResult(products);
    }
}

Với dao cạo, chúng tôi có một giải pháp thay thế

public class ProductController()
{
    public ViewResult Discontinued()
    {
        var db = new ProductsDb();
        var products = db.Products.ToList();
        return new ViewResult(products);
    }
}

và theo quan điểm của chúng tôi:

@model IEnumerable<Product> 

@foreach (var item in Model.Where(x => x.Discontinued)) {
    ....
}

Tôi nghĩ khá rõ ràng rằng giải pháp thứ hai chỉ cảm thấy rất sai. Nếu bạn làm điều gì đó như thế này, đừng đổ lỗi cho dao cạo râu - hãy tự trách mình.

Và đừng quên: Có thể sử dụng C # trong chế độ xem không phải là một tính năng dao cạo, điều đó cũng có thể với các chế độ xem ASP.NET. Với dao cạo, nó chỉ đơn giản hơn một chút.

Nếu bạn đang tìm kiếm một công cụ mẫu có nhiều đường ray như bạn nên xem nancy.fx với công cụ xem siêu đơn giả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.