Tại sao mọi người đặt bộ điều khiển trong một thư mục và chế độ xem trong một thư mục khác?


36

Tôi đã sẵn sàng để vượt qua asp và vào một khung mvc, asp.net mvc hoặc nancy. Bất cứ nơi nào tôi đi, tôi thấy các thư mục cho bộ điều khiển / mô-đun và thư mục để xem. Đây có phải chỉ là một phản xạ của pavlovian về việc dọn dẹp mọi thứ theo loại, hoặc có một sự khôn ngoan sâu sắc hơn hoạt động? Tôi có một dự án bằng chứng nhỏ, nơi tôi lưu trữ các tệp mà tôi có khả năng mở cùng nhau, một sự thoải mái đáng kể. Vì các tệp này cũng có khả năng gọi cho nhau, nên chúng có thể làm như vậy với các liên kết tương đối ngắn hơn, ít giòn hơn. Mẫu này bị thách thức bởi mvc, vì đường dẫn thư mục không còn tự động tương ứng với đường dẫn url và, trong asp.net mvc, các mẫu dự án và định tuyến thực thi các khung nhìn \ controls \ schism.

Đây trang microsoft giới thiệu các khái niệm về khu vực này. Nó có thể được đọc như là một sự thừa nhận về việc các ứng dụng lớn khó sử dụng trở nên như thế nào vì sự tách biệt giả tạo này.

Mọi người sẽ phản đối "phân tách mối quan tâm", nhưng việc phân tách mối quan tâm đã đạt được bằng cách có các tệp nguồn riêng biệt. Đối với tôi, không có lợi ích cụ thể nào, từ việc lấy các tệp nguồn này được liên kết chặt chẽ và gửi chúng đến các đầu đối diện của cấu trúc thư mục?

Có ai khác chiến đấu với điều này? Lời khuyên nào?


3
Bạn không nghĩ việc tách các tệp mã back-end khỏi các tệp xem là hợp lý? Nếu chúng ta đã định hướng tại sao không đặt các tệp CSS và JavaScript có liên quan vào cùng một thư mục?
Alternatex

2
Nếu bạn nhận được Resharper, thì F12 trong cuộc gọi đến Viewtrong bộ điều khiển sẽ đưa bạn đến chế độ xem và tùy chọn đầu tiên trong menu chuột phải trên chế độ xem sẽ đưa bạn đến bộ điều khiển và toàn bộ vấn đề thiếu điều hướng sẽ biến mất.
Pete Kirkham

4
@Alternatex Tôi xin lỗi nhưng tôi không thấy bộ điều khiển "back-end" như thế nào. Nó được kết hợp chặt chẽ với (các) chế độ xem. Chế độ xem không tốt nếu không có bộ điều khiển, bộ điều khiển không sử dụng nếu không có chế độ xem. Một ngày nào đó bạn sẽ muốn xóa chúng cùng nhau. Điều đó đối với tôi là thử nghiệm tốt nhất về những gì thuộc về nhau trong một thư mục ?? Trừ khi ai đó có thể chỉ cho tôi một cách tốt hơn?
bbsimonbb

2
Lượt xem là lớp trình bày. Bộ điều khiển là lớp chứa các dịch vụ, có thể chứa các đối tượng từ miền của bạn, chứa logic nghiệp vụ của bạn, do đó chứa logic back-end của ứng dụng của bạn. Lượt xem chỉ bao gồm các điều kiện tầm thường và các vòng lặp đơn giản để lặp lại các bộ sưu tập, nếu các khung nhìn của bạn chứa một cái gì đó khác, bạn đang làm sai. Như với cấu trúc thông thường, bạn đã phân tách back-end và front-end, với tôi đây là cấu trúc tốt hơn so với cấu trúc mà bạn đề xuất.
Andy

10
Vì vậy, không thiếu dân gian để nói với tôi rằng một bộ điều khiển là đồ sành sứ để nó đi trong tủ đồ sành sứ. Lượt xem là kính để chúng đi trong tủ kính. Tôi biết rằng một bộ điều khiển là đồ sành sứ, nhưng tôi đề xuất rằng sẽ rất tuyệt nếu có một tủ đựng đồ ăn trưa và tủ đựng đồ ăn tối, vì chúng ta đang nói về những thứ chỉ được sử dụng vào bữa trưa hoặc bữa tối.
bbsimonbb

Câu trả lời:


38

Tôi muốn nói rằng đó là lập trình sùng bái hàng hóa , nhưng có những lý do kỹ thuật cho cấu trúc này. Asp.Net MVC đã có một quy ước về cách tiếp cận cấu hình với hầu hết mọi thứ. Theo mặc định, công cụ xem dao cạo tìm kiếm Viewsthư mục để giải quyết chế độ xem nào sẽ trả về từ bộ điều khiển. Tuy nhiên, có một số hack để có được cấu trúc dự án khác và Microsoft thậm chí còn cung cấp một tính năng MVC có tên là Area để cho phép chúng tôi tạo cấu trúc dự án lành mạnh hơn. Bạn cũng có thể triển khai công cụ xem của riêng mình để chỉ định nơi cần tìm chế độ xem.

Tại sao tôi nói rằng đó là chương trình sùng bái hàng hóa và bạn đã đúng về điều này? Chú Bob đã thuyết phục tôi rằng cấu trúc thư mục của dự án không nên nói với tôi rằng đó là một ứng dụng MVC. Nó sẽ cho tôi biết rằng đó là mặt tiền cửa hàng, hoặc hệ thống yêu cầu tắt thời gian, hoặc bất cứ điều gì. Cấu trúc và kiến ​​trúc cấp cao sẽ cho chúng ta biết điều này là gì chứ không phải nó được thực hiện như thế nào .

Nói tóm lại, tôi tin rằng bạn đúng về điều này, nhưng bất kỳ cấu trúc thư mục nào khác chỉ đơn giản là đang chống lại khung công tác và tin tưởng tôi khi tôi nói rằng bạn không muốn cố gắng làm cho khung Asp.Net MVC làm một cái gì đó Được thiết kế để làm. Thật đáng tiếc rằng nó thực sự không thể cấu hình nhiều hơn.


Để nhanh chóng giải quyết các mối quan tâm về kiến ​​trúc, tôi vẫn tin rằng các mô hình kinh doanh (kinh doanh, không phải xem) và DAL nên sống trong một dự án / thư viện riêng được gọi từ ứng dụng MVC của bạn.

Chỉ là bộ điều khiển thực sự được kết hợp rất chặt chẽ với chế độ xem và có khả năng được sửa đổi cùng nhau. Tất cả chúng ta đều khôn ngoan khi nhớ sự khác biệt giữa khớp nối thông qua sự phụ thuộc và khớp nối logic. Chỉ vì mã đã bị tách rời các phụ thuộc của nó không làm cho nó ít được ghép nối một cách hợp lý.


1
Cách kiểm soát toàn diện nơi dao cạo tìm kiếm quan điểm là ở đây . Tôi chỉ có thể kiên trì.
bbsimonbb

3
Tôi đã xem chú bob, ở x1.25 như đề nghị. Nó khiến tôi nghĩ rằng nếu các kiến ​​trúc sư CNTT xây dựng các tòa nhà, tất cả chúng ta sẽ sống trên những nhóm bè nhỏ gắn liền với nhau, trôi nổi trên hồ. Cuộc sống không nhất thiết phải đơn giản hơn.
bbsimonbb

1
Nó phức tạp hơn một chút. Để thực sự đồng định vị trí các bộ điều khiển và khung nhìn, bạn sẽ muốn giải quyết đường dẫn khung nhìn khi chạy, để bao gồm không gian tên của bộ điều khiển. Đây là cách để làm điều đó .
bbsimonbb

1
Ngoài ra, hãy xem phát triển phần mềm định hướng tính năng ( fosd.net ), cho đối tác học thuật với những gì chú Bob đang mô tả.
ngm

1
Luật của Conway tại nơi làm việc. Tôi chắc chắn rằng nó hoạt động tại công ty của bạn @Flater. Bố cục MVC tiêu chuẩn hoạt động ở nhiều công ty, nhưng tôi vẫn thích nhóm điều theo ngữ nghĩa hơn cú pháp. Các công ty tôi làm việc đã được tổ chức xung quanh các sản phẩm thay vì vai trò / chức năng công việc. Tôi tin rằng đây là gốc rễ của sở thích của tôi ở đây.
RubberDuck

9

Dù lý do là gì, đây là thực hành kém. Nó rất chống OO vì các gói hoặc thư mục (bất cứ điều gì bạn muốn gọi chúng), nên có sự phụ thuộc lẫn nhau yếu. Các lớp (hoặc tệp) bên trong chúng nên có sự phụ thuộc lẫn nhau mạnh mẽ.

Bằng cách ném tất cả các khung nhìn vào một thư mục và tất cả các bộ điều khiển trong một thư mục khác, bạn đang tạo hai gói với khớp nối rất chặt chẽ. Điều này đi ngược lại nguyên tắc có các phụ thuộc liên gói yếu.

Một khung nhìn và một bộ điều khiển là hai nửa của một tổng thể và nên thuộc về nhau. Bạn sẽ không có một lần rút tủ cho vớ bên trái và một lần rút khác cho vớ bên phải.


6

Để trả lời 'Tại sao mọi người ...?' câu hỏi: Dưới đây là một số lý do tiềm năng, mặc dù tôi không hoàn toàn chắc chắn sự kết hợp nào của chúng là nguyên nhân thực sự, vì đây thực sự là một câu hỏi chủ quan

  • Để tái tạo kiến ​​trúc logic (mô hình, khung nhìn, bộ điều khiển) với cấu trúc thư mục và không gian tên phù hợp

  • Không theo quy ước & thuận tiện để làm theo mẫu dự án ASP.net MVC

  • Để nhóm theo không gian tên, vì Controllers/thư mục sẽ dẫn đến một .Controllerskhông gian tên

  • Có thể kích hoạt một số tình huống trong DI / IoC trong đó các lớp trình điều khiển chỉ được truy vấn / quét từ một không gian tên có chứa / kết thúc với 'Bộ điều khiển' (điều này có thể sai)

  • Để cho phép các mẫu T4 quét và tạo mô hình & bộ điều khiển để tạo chế độ xem

Bạn luôn có thể tạo và làm theo quy ước của riêng bạn nếu nó có ý nghĩa với dự án của bạn, không ai có thể / sẽ ngăn cản bạn. Nhưng hãy lưu ý rằng nếu bạn làm việc trong một dự án lớn và / hoặc nhóm lớn, thì quy ước mặc định mà mọi người đều biết có thể là một lựa chọn tốt hơn (mặc dù không nhất thiết phải là một dự án đúng!)

Nếu quy ước của bạn dễ thực hiện hơn và không cản trở năng suất, thì bằng mọi cách hãy làm điều đó! và thậm chí có thể viết về nó một hoặc hai bài đăng trên blog để xã hội hóa nó với cộng đồng nhà phát triển và nhận phản hồi


2

Một lý do để giữ các khung nhìn và bộ điều khiển trong các thư mục riêng biệt là khi bạn có các nhà phát triển front end và back end làm việc trong một dự án. Bạn có thể ngăn các nhà phát triển giao diện truy cập mã mặt sau (ví dụ: để hỗ trợ tuân thủ PCI, hạn chế người có quyền truy cập vào mã nhạy cảm).

Một lý do khác là để làm cho việc có "chủ đề" dễ dàng hơn và tắt tất cả các mẫu bằng cách thực hiện một thay đổi nhỏ cho đường dẫn xem.

Lý do thứ ba là để có một mẫu thư mục đơn giản khi chỉ định các khung nhìn trong khung MVC. Việc chỉ định thư mục con và tệp sẽ dễ dàng hơn là một đường dẫn dài đến mỗi chế độ xem.

"Khớp nối chặt chẽ" duy nhất nên là:

  1. Các biến được gửi vào khung nhìn bởi bộ điều khiển.
  2. Hình thành các trường hoặc hành động trong dạng xem, gửi lại cho bộ điều khiển.

Tôi sử dụng một bộ điều khiển chung và cố gắng giữ các tên biến trong chế độ xem chung, để nhiều chế độ xem có thể sử dụng cùng một bộ điều khiển và nhiều bộ điều khiển có thể sử dụng cùng một chế độ xem. Vì lý do này, tôi thích giữ quan điểm hoàn toàn riêng biệt. Mô hình là nơi bạn có thể phân biệt từng "vật" trong ứng dụng của mình - chúng có thể là các đối tượng với danh sách các thuộc tính và phương thức để truy cập / sửa đổi các thuộc tính này.

Đối với mã được liên kết chặt chẽ, một cách tiếp cận có thể phù hợp với bạn là giữ tất cả các tệp là một phần của gói hoặc "mô-đun" cùng nhau trong một thư mục được đặt tên. Sau đó, bạn có thể sử dụng tập lệnh để sao chép hoặc "biên dịch" các mẫu thô của bạn vào thư mục "lượt xem" chính. Ví dụ:


    lib/my-namespace/my-package/
        -> controllers/
        -> models/
        -> views/
            -> theme/
               -> template-name1
    app/compiled_views/theme/
        -> url/path/template-name1

Thật không may, nếu bạn muốn thay đổi cấu trúc của một chủ đề hiện có, có nhiều kết nối trong và ngoài các thư mục gói để cập nhật các khung nhìn.

Xem xét rằng các lượt xem chỉ là một cách để định dạng dữ liệu, cho dù đó là json, xml, csv hoặc html. Điều này đặc biệt hữu ích nếu bạn muốn ứng dụng của mình cũng hoạt động như một API. Cố gắng tách rời chế độ xem khỏi dữ liệu, bằng cách sử dụng tên biến chung, để bạn có thể sử dụng cùng một mẫu cho nhiều bộ điều khiển hoặc mô hình (hoặc sử dụng bao gồm để giảm thiểu số lượng mã bạn cần duy trì).


1

Không nhất thiết là tất cả mọi người làm điều này. Ví dụ, khung Django của python có khái niệm về một ứng dụng, trong đó các mô đun con của ứng dụng của bạn nằm trong các thư mục của riêng chúng với các mô hình và khung nhìn và mẫu riêng của chúng (các khung nhìn là những gì Django gọi là bộ điều khiển). Tôi tình cờ thích cách làm việc đó bởi vì điều đó có nghĩa là tôi có thể dễ dàng đóng gói một "ứng dụng" và sử dụng lại nó trong các dự án chỉ bằng cách đưa nó vào danh sách ứng dụng trong cài đặt dự án của tôi. Nó cũng dễ dàng hơn để tìm ra nơi các bộ phận khác nhau. Nếu tôi nhìn vào tệp urls.py và thấy một cái gì đó giống như url(r'^users/', include('my_site.users.urls')), tôi biết rằng mô-đun my_site.userschứa tất cả các mã xử lý người dùng. Tôi biết để xem xét các mô-đun my_site.users.viewsmy_site.users.modelskhi tôi muốn xem cách người dùng được tạo và xác thực. Tôi biết rằng tất cả các tuyến đường của tôi được xác định trong my_site.users.url.

Ngoài ra, nếu nó đủ chung chung, tôi có thể sử dụng mô-đun đó trong các trang web khác chỉ bằng cách thay đổi cấu hình hoặc đóng gói nó dưới dạng thư viện và xuất bản dưới dạng OSS.


1

Hãy nhớ rằng đó là cách được Microsoft khuyến nghị để giữ các bộ điều khiển và chế độ xem trong thư mục khác nhau, vì vậy nhiều người sẽ tuân theo cấu trúc được đề xuất,

  1. Một lý do có thể là các bộ điều khiển luôn không có mối quan hệ 1-1 với các khung nhìn, đặc biệt là các khung nhìn một phần có thể được chia sẻ giữa các bộ điều khiển.
  2. Một lý do khác có thể là khi dự án của bạn phát triển, bạn có thể muốn kéo các bộ điều khiển và kiểm tra đơn vị sang (các) dự án khác, nhưng thật khó để làm điều tương tự cho các lượt xem cộng với lượt xem / js / css khi chúng tham chiếu lẫn nhau.

Đã nói rằng có nhiều bài viết về việc làm theo cách của bạn, chẳng hạn như điều này .


"Đó là cách Microsoft khuyến nghị" ... Bạn có thể nói rõ ý của bạn không? Có một bài báo MS thực tế, có thẩm quyền về điều này? Hoặc, đó chỉ là thiết lập dự án mặc định cho ứng dụng MVC? Và, nếu bạn dựa trên cơ sở này, thì có thể thiết lập dự án MVC mặc định là như vậy không vì nó là "mọi người" làm gì ??
Svidgen

1
Dựa trên bài viết msdn.microsoft.com/en-us/l Library / Nói nó có nội dung "Bộ điều khiển, được khuyến nghị", v.v. để xem, v.v.
Low Flying Pelican

0

Đối với hồ sơ

Tại sao tôi nói rằng đó là chương trình sùng bái hàng hóa và bạn đã đúng về điều này? Chú Bob đã thuyết phục tôi rằng cấu trúc thư mục của dự án không nên nói với tôi rằng đó là một ứng dụng MVC. Nó sẽ cho tôi biết rằng đó là mặt tiền cửa hàng, hoặc hệ thống yêu cầu tắt thời gian, hoặc bất cứ điều gì. Cấu trúc và kiến ​​trúc cấp cao sẽ cho chúng ta biết điều này là gì chứ không phải nó được thực hiện như thế nào.

Câu hỏi: Ai có quyền truy cập vào mã?. Lập trình viên. Người dùng cuối có quan tâm đến mã không? Không. Và, những gì một lập trình viên làm, mã. Hay cụ thể hơn, các lớp dựa trên các loại (bộ điều khiển, dịch vụ, mô hình, v.v.). Vì vậy, nó có ý nghĩa và thật dễ dàng để gỡ lỗi một mã, nếu bạn có thể tìm thấy một mã dựa trên loại mã, thay vì trong hành vi của mã. Thêm vào đó, giả sử một dự án nhóm, một người chịu trách nhiệm về bộ điều khiển, một mô hình khác, một dao khác và một khung nhìn khác. Thật dễ dàng để tách dự án thành các phần. Một mã tốt là một mã dễ gỡ lỗi, không phải là mã đường cú pháp. Chú Bob lại sai rồi.

Cố gắng bắt chước hành vi của dự án (một mặt tiền cửa hàng) là sùng bái hàng hóa.


3
Khi tôi viết mã tôi quan tâm nhất về các tính năng, không phải các loại. Khi tôi thấy một tính năng không hoạt động như mong đợi, tôi biết có gì đó không đúng trong mã liên quan đến tính năng đó trong khi tôi không nhất thiết phải biết đó là loại mã nào.
Ngừng làm hại Monica

1
Một người cho rằng một dự án nhóm, một người chịu trách nhiệm về bộ điều khiển, một người mẫu khác, một người dao dao như vậy Một đội sẽ gặp khó khăn trong việc vận chuyển bất cứ thứ gì và khi họ làm điều đó sẽ tốn nhiều chi phí hơn trong giao tiếp và lỗi.
RubberDuck

Như được thiết lập trong một chuỗi nhận xét theo câu trả lời được chấp nhận, bạn đã có một điểm nhưng chỉ trong một số trường hợp nhất định. Khi một công ty tập trung vào các dự án MVC mà họ bán cho nhiều khách hàng khác nhau, việc giữ cấu trúc MVC có ý nghĩa cho việc tái sử dụng. Khi một công ty tập trung vào một phân khúc thích hợp (ví dụ như các hội thảo) và có thể sử dụng nhiều công nghệ khác nhau, sẽ có ý nghĩa hơn khi có một cấu trúc định hướng webshop. Đây là một ứng dụng thực tế của Luật Conway . Mã (và do đó cũng là cấu trúc dự án) phải tuân theo cấu trúc của công ty.
Flater

@RubberDuck: Bạn có thể đưa ra một đối số để tăng thêm chi phí. Bạn đúng rằng khi những người khác nhau thực hiện các thành phần kỹ thuật khác nhau, rằng bạn đã tăng giao tiếp logic kinh doanh. Tuy nhiên, nếu bạn có những người khác nhau thực hiện đầy đủ các tính năng khác nhau, thì bạn có thể đã tăng chi phí để đảm bảo mọi người đều tham gia (có kỹ năng + đồng ý) với việc sử dụng cùng một phương pháp kỹ thuật. Dù bằng cách nào, bạn cần liên lạc trên đầu để đảm bảo mọi người làm việc cùng nhau.
Flater

Có và bàn giao luôn có giá cao hơn so với việc có một cặp nhà phát triển thực hiện kết thúc tính năng để kết thúc IME.
RubberDuck
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.