Net dünyası neden statik olarak yazılmış alternatifler yerine sihirli dizeleri kucaklıyor?


47

Ben de çalışıyorum. Net'te açık kaynaklı projeler yapıyorum. Onunla ilgili en büyük sorunlarımdan biri .Net ile zorunlu değil, etrafındaki topluluk ve çerçevelerle. Her yerde sihirli isimlendirme şemaları ve dizgileri her şeyi yapmanın en iyi yolu olarak görülüyor. Kalın ifade, ama şuna bak:

ASP.Net MVC:

Merhaba dünya rotası:

        routes.MapRoute(
            "Default",                                              // Route name
            "{controller}/{action}/{id}",                           // URL with parameters
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );

Bunun anlamı, ASP.Net MVC'nin bir şekilde HomeControllerkodunuza bakacağıdır . Her nasılsa bunun yeni bir örneğini oluşturup, işlevi Index görünüşte bir idtür parametreyle çağırın . Ve sonra gibi başka şeyler var:

RenderView("Categories", categories);
...or..
ViewData["Foobar"]="meh";

Ve sonra XAML ile de benzer şeyler var. DataContextbir nesne olarak kabul edilir ve istediğiniz tipe çözülmesi için umut etmeli ve dua etmelisiniz. Bağımlılık Özellikleri, sihirli dizeler ve sihirli adlandırma kuralları kullanmalıdır. Ve bunun gibi şeyler:

  MyData myDataObject = new MyData(DateTime.Now);      
  Binding myBinding = new Binding("MyDataProperty");
  myBinding.Source = myDataObject;

Her ne kadar döküm ve çeşitli büyülü çalışma zamanı desteklerine dayanıyor olsa da.

Her neyse, hepsinin buraya gelmesini söylüyorum: .Net dünyasında neden bu kadar iyi tolere ediliyor? Neredeyse her zaman şeylerin ne olduğunu bilmek için statik olarak yazılmış dilleri kullanmıyor muyuz? Yansıma ve tür / yöntem / özellik / neden isimler (dizeler olarak) jenerikler ile delegeler ve hatta kod oluşturma ile karşılaştırıldığında bu kadar çok tercih edilir?

ASP.Net'in yönlendirme sözdiziminin, aslında bir rotanın nasıl işleneceğini çözmek için neredeyse yalnızca yansımaya dayanmasının neden olmadığına dair eksik olduğumu mi düşünüyorsunuz? Bir yöntemin veya özelliğin adını değiştirdiğimde ve aniden işler kırıldığından nefret ediyorum, ancak o yönteme veya özelliğe herhangi bir atıfta bulunmadığı görülüyor ve tabii ki derleyici hatası yok. Neden sihirli tellerin görünür rahatlığı "buna değer" olarak kabul edildi?

Bazı şeylere genellikle statik olarak yazılmış alternatifler olduğunu da biliyorum, ancak bunlar genellikle arka koltukta geçiyor ve hiçbir zaman öğretici veya başka başlangıç ​​materyali olarak görünmüyor.


14
CPU'larımız bunu gerçekleştirmek için yeterince hızlı olduğundan, anlamsız dinamizm, şimdiye kadar öfkeli oldu.
DeadMG

7
Nasıl yani? LINQ ile böyle bir örnek görmedim.
DeadMG

6
Alçakgönüllü tahminim, uygun şekilde statik şekilde yazılmış alternatifin çok garip bir rahatsızlık olduğu yönünde. Bu gerçekten çoğu tip sistemde ortaya çıkan bir tema: “Tipik sistemde bunu yapmak istiyoruz, ancak yeterince anlamlı değil.” (Veya bunun tersi: "Tipik sistemde bunu başarıyla ifade ettik, ancak işleri üç kat daha karmaşık hale getirdi.") @ GlenH7 LINQ’a tamamen aşina değilim ama kullandığım parçalar sergilemedi Bu yazının anlattığı şeyin yanında bile bir şey. Örnek vermek ister misin?

2
@Earlz Daha da önemlisi, adsız nesneler statik olarak yazılır. Sihirli dizeler yoktur, derleyici ilgili her şeyin adını ve türünü bilir. Her kullanım için tasarruf edin var.

1
@Earlz ilginç, ancak lambda sözdiziminin burada ek şişirme olduğu söylenebilir. Tahminime göre, sihirli dize / kongre yaklaşımına gittiler, çünkü ölü basit, birçokları için "yeterince iyi" ve takımları her zaman biraz rehberlik / güvenlik sağlayacak şekilde uyarlayabilirler. IMHO, güvenlik ve kolaylık arasında bir takas. Dinamik bir ViewBag kullanımı da bu zihniyeti ima eder (tam olarak aynı fikirde olduğumdan değil).
Daniel B,

Yanıtlar:


31

Aslında .NET dünyasında bahsettiğiniz bu şeylere karşı bir geri dönüş var. Ancak verdiğiniz ilk örnekte, yönlendirme motoruna varsayılan rotayı eşlemek için bir kural verilmiştir. Rotaların dinamik olması, statik bir konfigürasyon kullanmayı neredeyse imkansız hale getirir.

Ayrıca, her ikisi de jenerikler .NET'e tanıtılmadan önce geliştirilme aşamasında olan ve jenerikleri desteklemeye geri dönerek çok geç bir ürünü (Longhorn / Vista) daha da geciktirmiş olacak olan XAML / WPF'den de bahsediyorsunuz.

Sihirli dizeler yerine lambda ifadeleri kullanma ASP.NET MVC çerçevesi içinde örnekler vardır ve Entity Framework / LINQ, dilin ve çerçevenin statik bir nesne grafiği üzerinde SQL sorguları oluşturmak için yerel destek sağladığı yerlerde daha da ileri götürür sihirli SQL dizeleri, sorgularınızın derleme zamanı doğrulamasını alırsınız).

Diğer statik yapılandırma örnekleri için yapı haritası ve diğer modern bağımlılık enjeksiyon kaplarına ve çalışma zamanında nesne grafiğini incelemesi gereken ancak geliştiricinin lambda ifadeleri kullanarak statik olarak ipuçları sağlamasına izin veren diğer çerçevelere bakın.

Yani kısa cevap tarihsel olarak, .NET 3.5 sürümüne kadar bir nesne grafiğinin statik geçişini desteklemediğidir. Artık sahip olduğumuz için, birçok geliştirici onu sihirli dizgilere tercih ediyor ve birçoğu operatörün bir sembolü olan operatör gibi daha derin bir destek için daha da zorlanıyor.


3
XAML olduğu gibi ayrıntılıdır ... Jenerikler için destek eklemek onu daha da çok yapardı (evet, tüm XAML'nin insanlar için yapılmış olmadığını biliyorum Argüman). Ayrıca, XAML'yi HTML'ye gerçek bir programlama diline nazaran daha yakın buluyorum. Gösterdiği nesnelerin tipini, sadece nasıl göstereceğini umursamamalıdır.
Michael Brown,

2
Jenerikler 2.0'a ulaştı, ancak 3.5'e kadar İfade alamadık (LINQ ile). İfadeler, LINQ ve toplumun bu gücü aldığı ve onunla çalıştığı güçtür. Teknik statik yansıma
Michael Brown

1
Statik yansıma hakkında iyi nokta. Bunun, 3.5
Earlz

2
Bu harika bir cevap ve geri çekilişe kesinlikle katılıyorum. Bunların hepsini veba gibi davranmaktan kaçınıyorum çünkü bir yazım hatası veya böcek varsa sadece çalışma zamanında yakalanırlar, yani çok kolay bir şekilde kaçırılabilirler. Ayrıca refactoring'i son derece farklı kılar. Kaçının kaçının!
Rocklan

2
Pushback üzerinde katılıyorum. T4MVC , çok sayıda dizeyi kaldırmak ve bunları güçlü bir şekilde yazılmış kodla değiştirmek isteyen aklına gelen bir projedir.
Carson63000
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.