Neden herkes denetleyicileri bir klasöre, görünümlerini bir başkasına koyuyor?


36

Asp'den ve bir mvc çerçevesine, asp.net mvc'ye veya nancy'ye bürünmeye hazırlanıyorum. Nereye gidersem gideyim, kontrolörler / modüller için klasörler ve görünümler için klasörler görüyorum. Bu sadece şeyleri türüne göre bir kenara atma ile ilgili bir Pavlovian refleksi mi, yoksa daha derin bir bilgelik çalışması var mı? Birlikte açmam muhtemel dosyaları bir arada sakladığım, kayda değer bir rahatlık olan küçük bir konsept kanıt projem var. Bu dosyalar da birbirlerini arayabileceklerinden, daha kısa, daha az kırılgan, göreceli bağlantılarla yapabilirler. Bu desen mvc tarafından zorlanır, çünkü klasör yolu artık otomatik olarak url yoluna karşılık gelmez ve asp.net mvc'de proje şablonları ve yönlendirme, views \ controllers \ schism öğesini zorlar.

Bu microsoft page , alan kavramını tanıtır. Bu yapay ayrılıktan dolayı hantalca büyük uygulamaların nasıl gerçekleştiğinin bir kabulü olarak okunabilir.

İnsanlar “kaygıların ayrışmasına” itiraz edeceklerdir, ancak kaygıların ayrılması ayrı kaynak dosyalara sahip olmakla zaten başarılmıştır. Somut bir kazanç yok, öyle görünüyor ki, sıkı sıkıya bağlı olan bu kaynak dosyaları alıp bunları klasör yapısının karşıt uçlarına göndermekten?

Bununla savaşan başka biri var mı? Herhangi bir ipucu?


3
Arka uç kod dosyalarını görünüm dosyalarından ayırmanın mantıklı olduğunu düşünmüyor musunuz? Zaten yön alıyorsak neden ilgili CSS ve JavaScript dosyalarını da aynı klasöre koymuyorsunuz?
Alternatex

2
Eğer Resharper'ı alırsanız View, kontrol cihazındaki çağrıdaki F12 sizi görünüme getirir ve görünümdeki sağ tıklama menüsündeki ilk seçenek sizi kontrol cihazına götürür ve navigasyon eksikliğiyle ilgili tüm sorun ortadan kalkar.
Pete Kirkham,

4
@Alternatex Üzgünüm ama bir kontrol cihazının "arka uç" olduğunu görmüyorum. Görüşlerine sıkıca bağlı. Görüntü, denetleyici olmadan iyi değil, denetleyici görüntü olmadan kullanılamaz. Bir gün onları birlikte silmek isteyeceksiniz. Bu benim için bir klasörde neyin birbirine ait olduğunun en iyi testidir ?? Birisi bana daha iyi bir yol gösteremezse?
bbsimonbb

2
Görünümler sunum katmanıdır. Denetleyiciler, etki alanınızdan nesneler içerebilen, iş mantığınızı içeren ve dolayısıyla uygulamanızın arka plan mantığını içeren hizmetler içeren bir katmandır. Görünümler yalnızca önemsiz koşullardan ve koleksiyonlardaki yinelemeler için basit döngülerden oluşur, görünümleriniz başka bir şey içeriyorsa, yanlış yaparsınız. Düzenli yapıda olduğu gibi, arka ucu ve ön ucu ayırdınız, bu benim için önerdiğinizden daha iyi bir yapı.
Andy,

10
Bu yüzden bana hiçbir denetleyicinin çanak çömlek olduğunu söyleyecek hiçbir sıkıntı yok, bu yüzden çanak çömlek dolabına giriyor. Görüşler gözlüktür, böylece cam dolaba girerler. Ben biliyorum bir kontrolör çanak çömlek olduğunu, ama biz sadece öğle yemeğinde kullanılan alır şeyler bahsediyoruz çünkü, bir öğle dolap ve yemek dolabı olması harika olurdu teklif ediyorum ya yemekte.
bbsimonbb

Yanıtlar:


38

Kargo kültü programlama olduğunu söylemek isterim , ancak bu yapının teknik nedenleri var. Asp.Net MVC neredeyse her şey için konfigürasyon yaklaşımı üzerine bir anlaşma yaptı. Varsayılan olarak, Razor görünüm motoru, Viewshangi görünümün denetleyiciden döneceğini çözmek için dizinde arama yapar . Bununla birlikte, farklı bir proje yapısı elde etmek için birkaç kırılma vardır ve Microsoft daha akıllıca bir proje yapısı oluşturmamıza izin vermek için Alanlar adlı bir MVC özelliği sunar . Görünümlerin nereye bakılacağını belirtmek için kendi görünüm motorunuzu da uygulayabilirsiniz .

Neden kargo kültü programlaması olduğunu ve bu konuda haklı olduğunuzu söylüyorum? Bob Amca, beni projenin dizin yapısının bir MVC uygulaması olduğunu söylememesi gerektiği konusunda ikna etti . Bana bunun bir dükkan cephesi veya bir zaman aşımına uğrayan istek sistemi veya başka bir şey olduğunu söylemelidir. Üst düzey yapısı ve mimarisi hakkında bize gereken şey bu şey, değil nasıl o hayata geçirildi.

Kısacası, bu konuda haklı olduğuna inanıyorum, ancak herhangi bir diğer dizin yapısı çerçeveye karşı savaşacak ve Asp.Net MVC çerçevesini bir şeyler yapmayı denemek istemediğinizi söylerken bana güvenecekti. yapmak için tasarlanmadı. Gerçekten daha yapılandırılabilir olması üzücü.


Mimari kaygıları hızla çözmek için, işletme modellerinin (iş değil, görünüm) ve DAL'nin MVC uygulamanızdan çağrılan ayrı bir proje / kütüphanede yaşaması gerektiğine inanıyorum.

Sadece kontrolörün görünümü ile çok sıkı bir şekilde bağlantılı olması ve muhtemelen birlikte değiştirilmesi muhtemeldir. Bağımlılık yoluyla bağlanma ve mantıksal bağlanma arasındaki farkı hatırlamak hepimizde akıllıcadır. Kodun bağımlılıklarının çözülmüş olması, mantıksal olarak daha az eşleştirilemez.


1
Jiletin görünümleri aradığı yeri kontrol etmenin kapsamlı yolu burada . Sadece sebat edebilirim.
bbsimonbb

3
Bob Amca'nın önerildiği gibi x1.25'te izledim. BT mimarları inşa ederse, hepimizin bir gölde yüzerek birbirine bağlı küçük sal gruplarında yaşayacağımızı düşünüyor. Hayat mutlaka daha kolay olmazdı.
bbsimonbb

1
Biraz daha karmaşıklaşıyor. Denetleyicileri ve görünümleri gerçekten birlikte bulmak için, denetleyici ad alanını içerecek şekilde çalışma zamanında görünüm yolunu çözmek isteyeceksiniz. İşte nasıl yapılacağı .
bbsimonbb

1
Ayrıca , Bob Amca'nın anlattığı şeyin akademik karşılığı için özellik odaklı yazılım geliştirmeye ( fosd.net ) bakın.
ng

1
Conway Yasası iş başında. Eminim bu, @Flater şirketinde çalışır. Standart MVC düzeni birçok şirkette çalışır, ancak yine de sözdizimi üzerinden anlamsal olarak gruplandırmayı tercih ederim. Çalıştığım firmalar roller / iş fonksiyonları yerine ürünler etrafında örgütlenmişlerdir. Buradaki tercihimin kökü olduğuna inanıyorum.
RubberDuck

9

Sebep ne olursa olsun, bu kötü bir uygulamadır. Çok OO karşıtıdır, çünkü paketler veya klasörler (ne çağırmak istersen), zayıf bağımlılıklara sahip olmalıdır. İçlerindeki sınıflar (veya dosyalar) güçlü bağımlılıklara sahip olmalıdır.

Tüm görünümleri bir klasöre ve tüm kontrol cihazlarını başka bir klasöre atarak, çok çok sıkı bağlantıya sahip iki paket yaratıyorsunuz. Bu, paketler arası bağımlılıkların zayıf olması ilkesine aykırıdır.

Bir görünüm ve bir kontrolör bir bütünün iki yarısıdır ve birbirlerine ait olmalıdır. Sol taraf çoraplar için bir dolabınız ve sağ taraf çoraplar için bir dolabınız olmazdı.


6

'Neden herkes ...?' Soru: İşte bazı potansiyel sebepler, gerçekte sübjektif bir soru olduğundan, bunların hangi kombinasyonun gerçek bir sebep olduğunu tam olarak bilmiyorum.

  • Mantıksal mimariyi (model, görünüm, denetleyici) eşleşen bir klasör ve ad alanı yapısıyla çoğaltmak için

  • ASP.net MVC proje şablonunu takip etme konvansiyonu ve uygunluğu

  • Ad alanına göre gruplamak için, Controllers/klasör bir .Controllersad alanına yol açacağından

  • Olabilir DI / IoC bazı senaryolara olanak nerede kontrolör sınıfları sadece Sorgulanan / taranmış 'Kontrolörleri' ile biter-/ içeren bir ad alanından (bu yanlış olabilir)

  • T4 şablonlarının modelleri ve denetleyicileri taramasını ve iskeletlemesini sağlamak için görünümler oluşturmak için

Projenizi mantıklı kılıyorsa, her zaman kendi konvansiyonunuzu oluşturabilir ve uygulayabilirsiniz; Ancak, eğer büyük bir projede ve / veya büyük bir ekipte çalışıyorsanız, herkesin bildiği varsayılan konvansiyonun daha iyi bir seçim olabileceğini unutmayın (mutlaka doğru olanı değil!).

Sözleşmenizin izlenmesi daha kolay ve üretkenliği engellemiyorsa, elbette yapın! ve hatta geliştirici topluluğu ile sosyalleşmek ve geri bildirim almak için bir ya da iki blog yazısı yazabilirsiniz.


2

Görüş ve denetleyicileri ayrı dizinlerde tutmanın bir nedeni, bir proje üzerinde çalışan ön uç ve arka uç geliştiricilere sahip olmanızdır. Ön uç geliştiricilerin arka uç koda erişmelerini önleyebilirsiniz (örneğin, PCI uyumluluğuna yardımcı olmak, hassas koda erişimi olanları kısıtlamak).

Diğer bir sebep de, "temaların" kullanımını kolaylaştırmak ve görünüm yolunda küçük bir değişiklik yaparak tüm şablonları değiştirmek.

Üçüncü bir sebep, MVC çerçevesindeki görünümleri belirtirken basit bir dizin düzenine sahip olmaktır. Her görünüme büyük uzun bir yol yerine alt dizini ve dosyayı belirtmek daha kolaydır.

Tek "sıkı bağlantı":

  1. Değişkenler denetleyici tarafından görünüme gönderilir.
  2. Görünümdeki form alanları veya eylemler, denetleyiciye geri gönderilir.

Genel denetleyici kullanıyorum ve değişken isimlerini görünümde genel tutmaya çalışıyorum, böylece birçok görünüm aynı denetleyiciyi kullanabiliyor ve çoğu denetleyici aynı görünümü kullanabiliyor. Bu nedenle görüşlerini tamamen ayrı tutmayı tercih ediyorum. Model, uygulamanızdaki her "şeyi" ayırt edebildiğiniz yerdir - bu özelliklere erişmek / bunları değiştirmek için bir özellik listesi ve yöntemi olan nesneler olabilir.

Sıkı birleştirilmiş kod için, sizin için işe yarayabilecek bir yaklaşım, bir paketin veya "modülün" parçası olan tüm dosyaları ad alanlı bir dizinde bir arada tutmaktır. Ardından, ham şablonlarınızı ana "görünümler" dizinine kopyalamak veya "derlemek" için bir komut dosyası kullanabilirsiniz. Örneğin:


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

Ne yazık ki, mevcut bir temanın yapısını değiştirmek isterseniz, görünümleri güncellemek için paket dizinlerinin içinde ve dışında daha fazla dokuma vardır.

Görünümlerin, json, xml, csv veya html olsun, verileri biçimlendirmenin bir yolu olduğunu düşünün. Bu, özellikle uygulamanızın bir API olarak çalışmasını istiyorsanız da yardımcı olur. Genel değişken adlarını kullanarak görünümü verilerden ayırmaya çalışın, böylece aynı şablonu birçok denetleyici veya model için kullanabilirsiniz (ya da sürdürmeniz gereken kod miktarını en aza indirmek için içerir).


1

Bunu mutlaka herkes yapmaz. Örneğin, python'un Django çerçevesi, uygulamanızın alt modüllerinin kendi modelleri ve görünümleri ve şablonları ile kendi dizinlerinde yaşadığı bir uygulama kavramına sahiptir (görünümler esasen Django'nun denetleyicileri dediği şeydir). Bu tür şeyleri yapmayı tercih ediyorum çünkü bu, bir "uygulamayı" kolayca paketleyebileceğim ve projelerimdeki uygulamalar listesine ekleyerek projeler arasında yeniden kullanabileceğim anlamına geliyor. Farklı parçaların nerede olduğunu bulmak da daha kolay. Urls.py dosyasına bakar ve bir şey görürsem url(r'^users/', include('my_site.users.urls')), modülün my_site.userskullanıcıları yöneten tüm kodu içerdiğini biliyorum . Modüllere bakmayı my_site.users.viewsve my_site.users.modelsne zaman kullanıcıların nasıl yaratıldığını ve doğrulandığını görmek istediğimi biliyorum . Tüm rotalarımın içinde tanımlandığını biliyorum my_site.users.url.

Ayrıca eğer yeterince genelse, muhtemelen bu modülü değiştirerek veya bir kütüphane olarak paketleyip OSS olarak yayınlayarak bu siteyi diğer sitelerde de kullanabilirim.


1

Unutmayın ki , denetleyicileri ve görünümleri farklı klasörlerde tutmanın Microsoft tarafından önerilen yolu , bu nedenle çoğu önerilen yapıyı izler.

  1. Bunun bir nedeni, denetleyicilerin her zaman görüşlerle birebir ilişkisi olmamasıdır, özellikle kısmi görüşler denetleyiciler arasında paylaşılabilir.
  2. Projeniz büyüdüğünde başka bir sebep olabilir; denetleyicileri ve ünite testlerini başka bir projeye çekmek isteyebilirsiniz, ancak görünümler için aynı şeyi yapmak zordur.

Gibi Senin yöntemini yapmakla ilgili birçok mesaj vardır söyledikten bu .


"Bu, Microsoft'un tavsiye ettiği yoldur" ... Bununla ne demek istediğinizi netleştirebilir misiniz? Bununla ilgili gerçek bir yetkili MS makalesi var mı? Veya, bir MVC uygulaması için sadece varsayılan proje kurulumu mu? Ve eğer bunu ikincisine dayandırıyorsanız, varsayılan MVC proje kurulumunun ne olduğu, çünkü "herkes" in yapması mümkün değil mi?
svidgen

1
Maddeye dayanarak msdn.microsoft.com/en-us/library/... neden olacağı ve görünümleri için üzerinde "önerilen Kontrolörler, hangi" diyor, vs ..
Düşük Uçan Pelikan

0

Kayıt için

Neden kargo kültü programlaması olduğunu ve bu konuda haklı olduğunuzu söylüyorum? Bob Amca, beni projenin dizin yapısının bir MVC uygulaması olduğunu söylememesi gerektiği konusunda ikna etti. Bana bunun bir dükkan cephesi veya bir zaman aşımına uğrayan istek sistemi veya başka bir şey olduğunu söylemelidir. Üst düzey yapı ve mimarlık bize bunun ne olduğu hakkında değil, nasıl uygulandığından bahsetmemelidir.

Soru: Koda kim erişebilir? Programcılar. Son kullanıcılar kodu önemsiyor mu? Hayır. Ve bir programcının yaptığı gibi kod. Veya daha spesifik olarak, türlere dayalı sınıflar (kontrolörler, servis, model vb.). Bu nedenle, mantıklıdır ve kodun davranışını yerine kodun türünü temel alan bir kod bulabilirseniz, bir kodun hatalarını ayıklamak kolaydır. Artı, diyelim ki bir takım proje, biri denetleyiciden sorumlu, diğeri modelden, diğeri diğeri görünümden bir diğeri. Projeyi parçalara ayırmak kolaydır. İyi bir kod, bir sözdizimi şeker kodunu değil, hata ayıklaması kolay bir koddur. Bob Amca yine yanlış.

Projenin davranışını taklit etmeye çalışmak (mağaza önü) kargo kültüdür.


3
Whan I kodları Türleri değil, özellikleri en çok önemsiyorum. Beklenildiği gibi çalışmayan bir özellik gördüğümde, bu kodla ilgili kodda bir sorun olduğunu biliyorum; bunun ne tür bir kod olduğunu bilmiyorum.
Monica'ya

1
“Diyelim ki bir takım projesi, biri denetleyiciden sorumlu, diğeri model, diğeri” Bu tür bir ekip bir şeyleri nakliye etmek için zor zamanlar geçirecek ve yaptıklarında iletişim yükü ve hatalardan çok daha fazla maliyeti olacaktır.
RubberDuck

Kabul edilen cevabın altındaki bir yorum zincirinde belirtildiği gibi, bir noktaya sahipsiniz ama sadece belirli durumlarda Bir şirket MVC projelerine odaklandığında çok çeşitli müşterilere satıyor, bir MVC yapısını tekrar kullanmak mantıklı. Bir şirket bir nişe (örn. Webshoplar) odaklandığında ve muhtemelen birçok farklı teknolojiyi kullandığında, webshop odaklı bir yapıya sahip olmak daha mantıklı olur. Bu Conway Yasası pratik bir uygulamadır . Kod (ve dolayısıyla proje yapısı) şirketin yapısını takip etmelidir.
Flater

@RubberDuck: Her iki şekilde de ek maliyet için bir argüman yapabilirsiniz. Farklı insanlar farklı teknik bileşenler yaptığında, iş mantığı iletişimini arttırdığınız konusunda haklısınız. Ancak, farklı kişilere tamamen farklı özellikler uygularsanız, o zaman herkesin aynı teknik yaklaşımı kullanarak gemide (kalifiye + anlaşmaya varma) emin olma maliyetlerini arttırabilirsiniz. Her iki durumda da, insanların birlikte çalışmasını sağlamak için ek yüke ihtiyacınız var.
Flater

Evet ve geçişler her zaman, IME'yi sona erdirmek için bir özellik uygulayan tek bir çift gelişten daha pahalıya mal olur.
RubberDuck
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.