MVC “Endişelerin Ayrılması” ise, neden Razor Syntax tanıtıldı?


22

Benim sorum MVC tasarım deseni ve Microsoft tarafından sunulan Razor Sözdizimi ile ilgilidir.

MVC tasarım modelini öğrenirken fikrin Endişelerin Ayrılması olarak bilinen bir ilkeye dayandığı söylendi .

Ancak Jilet Sözdizimi, doğrudan C # in Görünümlerini kullanmamıza izin verir .

Bu endişelerin kesişme noktası değil mi?


7
ASP.NET MVC'nin aslında MVC tasarım modelini uygulamadığını söylemeye değer. MVC, modelin ASP.NET MVC'de açıkça olmadığı gibi değişiklikler açısından gözlemlendiğini belirler.
Benjamin Gruenbaum

11
Ayrıca Görünümler hakkındaki düşüncelerinizi değiştirdiyseniz de yardımcı olabilir. Görünümler olmayan istemci tarafı kodu. Bunlar, işlendiğinde istemci tarafı html üreten sunucu tarafı şablonlardır. Sunucu tarafı kodu olarak, C # kodunun olması tamamen kabul edilebilir.
Eric King,

6
@EricKing, keyfi kodlamaya izin veren şablonlama sistemlerinin her zaman en az direnç yolu ile kötü tasarıma, korkunç katman ihlali ve sürdürülemezliğe yol açtığı kısım hariç. Ne yazık ki, her topluluğun kendi başına öğrenmesi gereken bir ders gibi görünüyor.
hobbs

12
@hobbs Wow, tamam. Benim tecrübeme göre değil. Kesinlikle her zaman değil ve (elbette) programcının kısmında gerekli bazı mesleki sorumluluklar var. Ben aracı suçlamıyorum.
Eric King

7
@BenjaminGruenbaum Bu günlerde her "MVC" çalışmamıza benzemiyor mu? Artık Bir ve Sadece Gerçek MVC-Stili hakkında konuşmanın artık verimli olmadığı, ancak Modeller , Görüşler ve Kontrolörlerdeki sorumluluğu makul bir şekilde bölümleyen herhangi bir sistem için kullanılmasının daha bağımlı olacağı noktaya gelince , bunlar birbirine bağlı mıdır?
Alex,

Yanıtlar:


66

Razor sözdizimini endişelerin ayrılması ile karıştırıyorsunuz.

Kaygıların ayrılması, kodunuzu nasıl yapılandırdığınızla ilgilidir.

Görünümlerde C # kullanabilmek bunu engellemez. Bu gibi endişelerin ayrılması ile ilgisi yoktur.

Tabii ki, görünümünüzdeki kodu endişelerin ayrılığına uymayacak şekilde yapılandırabilirsiniz, peki ya sadece görüntüleme amacıyla kullanılan C # kodu? Bu nerede yaşayacak?


1
Ancak C # sunucu tarafı dilidir?
John Strowsky

6
@John - yani? Görüntüleme için tarihleri ​​biçimlendirmeniz gerekiyorsa (ve görüntüleme her zaman müşteri tarafı anlamına gelir), bunları nerede biçimlendirirsiniz? Model? Kontrol eden, denetleyici? Ne. Bunu görünümünde yaparsın.
Oded

16
@John - yani tarihiniz DB'de saklanır, modeli / denetleyiciden görünümünüze geçirirsiniz. HTML'de orada ihtiyacınız var, bu yüzden bir şekilde doğrudan C # ile biçimlendirmek yerine, biçimlendirmek için JS'ye gönderecektiniz. Niye ya? Bu neden daha iyi? Ya da daha doğrusu, bu kaygıların ayrılmasına daha fazla nasıl yaklaşıyor?
Oded

25
@ NPSF3000 - bir dil "sunucu tarafı" veya "müşteri tarafı" değildir. Bu mimari bir ayrım - ve muhtemelen dil uygulamalarından biri (JavaScript bir sunucu tarafı veya müşteri tarafı dilidir - node.js dosyasını hatırlayın).
Oded

14
@FreeAsInBeer - bu, müşteri tarafına ait bir tür mantıktır - Fransa'daki biri, ABD'deki birine göre farklı biçimli tarihleri ​​(ve para birimi / sayıları) görmek ister. Müşteri bunların nasıl gösterilmesi gerektiğini en iyi şekilde "bilir". Bu sunum mantığıdır ve görünümdedir.
Oded

35

Doğrudan soruya cevap vermek yerine, cevabım soruda yapılan varsayımı sorguluyor. Yani, Jilet'in MVC için inşa edildiği varsayımı yanlıştır. Microsoft’ta ASP.NET ekibinde çalışıyorum ve bu konuda ilk elden bilgim var.

Jilet MVC için bir görüntüleme motoru olarak başlamadı. Muhtemelen spektrumun en az ayrılan endişesi olan tarafına gidebileceğiniz kadarıyla ASP.NET Web Sayfaları için yaratılmıştır . ASP.NET Web Formları / Klasik ASP'ye ve elbette diğer birçok benzer sunucu programlama çerçevesine modern bir alternatif olarak yaratılmıştır. Razor'un fikri, HTML (biçimlendirme) ve C # (kodu) arasında neredeyse kesintisiz geçişler oluşturmaktı.

Ancak daha sonra (kendimi içeren), Razor sözdiziminin aynı ekip tarafından yazılmış olan MVC'nin bir görüntüleme motoru uğruna çok anlamlı olacağına karar verdi.

Razor’ın ASP.NET MVC’deki endişelerin ayrılması kavramını engellediği, engellediği, geliştirdiği veya değiştirdiği konusunda, Oded’in cevabı çok açık.


2
Yay, yorum yapmadan oy ver. Asıl soruda yapılan varsayımı sorguladığımı açıkça ortaya koymak için cevabımı değiştirdim. Gördüğüm gibi, soru doğrudan yanıtlanamaz çünkü geçersiz bir öncül var.
Eilon

Meraktan, ASP MVC için düşünülmüş başka şablonlama motorları var mıydı?
NWard

2
@Seçenek O sırada ASP.NET MVC için bir dizi 3. taraf görüntüleme motoru vardı, ancak onları çok fazla düşünmedim. Razor'un anlaşılmasının daha kolay olduğunu düşündük (HTML HTML, C # C #) ve ASP.NET Web Pages projesi ile daha da güzelleşti.
Eilon

1
@Alex oh Kesinlikle tüm Jilet için kredi alamam, ama yorumunuzu takdir ediyorum!
Eilon

1
@ateri Kısa bir süre sonra, cevabın sol üstündeki büyük sayıdır.
Mark Hurd

9

“Teknolojilerin ayrılmasını” “kaygıların ayrılması” ile karıştırıyorsunuz. MVC'nin "Görünüm" bölümünün arkasındaki temel fikir, "Görünüm" deki kodun doğrudan "Model" ve "Kontrolör" bölümlerine bırakılmak yerine doğrudan herhangi bir veri erişimi veya ağır mantık gerçekleştirmemesidir. "Kontrolör" verileri dönüştürür, gerekli mantığı uygular ve doğru "Görünüm" e yönlendirir. Görüntü veri dönüşümleri de yapabilir, ancak yukarıda belirtilen tarih dönüşümü gibi onları tamamen kozmetik tutma eğilimindeyim.


Bu yapılan puan üzerinden sağlam teklif şey gibi görünüyor ve önceki cevaplar özellikle izah etmez bu bir
tatarcık

4
+1 Kısa ve net bir şekilde ve önceki cevaplardan farklı bir açıklama odağıyla formüle edilmiştir.
Alex

@gnat Sadece kargaşasının nerede yattığını açıklığa kavuşturmak ve endişelerin ayrılması ilkesinin MVC tasarım modeline nasıl uygulandığını hızlıca açıklamak istedim. Belki de "endişelerin ayrılması" ne demek için daha fazla zaman harcamalıydım?
whoisthemachine

0

Mükemmel bir Don't do itörnek düşünebilirim .

Bir Ürün Kontrolcümüz olduğunu varsayalım:

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

Ustura ile bir alternatifimiz var

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

ve bize göre:

@model IEnumerable<Product> 

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

İkinci çözümün çok yanlış hissettirdiği oldukça açık. Böyle bir şey yaparsanız, ustura suçlamayın - kendinizi suçlayın.

Ve unutmayın: C # görünümlerinde kullanmak bir ustura özelliği değildir, ASP.NET görünümlerinde de mümkün olmuştur. Ustura ile sadece biraz daha basit.

Sizin gibi daha fazla ray olan bir şablon motoru arıyorsanız, Süper basit görünüm motoruyla nancy.fx dosyasına bir göz atın.

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.