Also arbeite ich in .Net. Ich mache Open Source Projekte in .Net. Eines meiner größten Probleme ist nicht notwendigerweise .Net, sondern die Community und die Frameworks, die es gibt. Überall scheint es so, als würden magische Namensschemata und Strings als der beste Weg angesehen, alles zu tun. Mutige Aussage, aber sieh es dir an:
ASP.Net MVC:
Hallo Weltstrecke:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
Dies bedeutet, dass ASP.Net MVC HomeController
in Ihrem Code irgendwie nachschlägt . Machen Sie irgendwie eine neue Instanz davon und rufen Sie dann die Funktion Index
anscheinend mit einem id
Parameter irgendeiner Art auf. Und dann gibt es noch andere Dinge wie:
RenderView("Categories", categories);
...or..
ViewData["Foobar"]="meh";
Ähnliches gilt auch für XAML. DataContext
wird als Objekt behandelt und man muss hoffen und beten, dass es sich zu dem Typ auflöst, den man will. Für DependencyProperties müssen magische Zeichenfolgen und Namenskonventionen verwendet werden. Und solche Dinge:
MyData myDataObject = new MyData(DateTime.Now);
Binding myBinding = new Binding("MyDataProperty");
myBinding.Source = myDataObject;
Obwohl es mehr auf Casting und verschiedene magische Laufzeitunterstützungen setzt.
Jedenfalls sage ich das alles, um hier zu landen: Warum wird das in der .Net-Welt so gut toleriert? Verwenden wir nicht statisch typisierte Sprachen, um fast immer zu wissen, was für Dinge das sind? Warum werden Reflektion und Typ / Methode / Eigenschaft / beliebige Namen (als Zeichenfolgen) im Vergleich zu Generika und Delegaten oder sogar zur Codegenerierung so bevorzugt?
Gibt es erbliche Gründe, die mir fehlen, weil die Routingsyntax von ASP.Net fast ausschließlich auf Reflexion beruht, um tatsächlich zu ermitteln, wie eine Route gehandhabt wird? Ich hasse es, wenn ich den Namen einer Methode oder Eigenschaft ändere und plötzlich etwas kaputt geht, aber es scheint keine Verweise auf diese Methode oder Eigenschaft zu geben und es gibt natürlich keine Compilerfehler. Warum wurde die offensichtliche Bequemlichkeit von magischen Saiten als "wert" angesehen?
Ich weiß, dass es zu einigen Dingen auch häufig statisch typisierte Alternativen gibt, aber sie treten normalerweise in den Hintergrund und scheinen nie in Tutorials oder anderem Anfängermaterial vorzufinden.
quelle
var
.Antworten:
Tatsächlich gibt es in der .NET-Welt einen Rückstoß gegen genau diese Dinge, die Sie erwähnt haben. Im ersten Beispiel, das Sie angegeben haben, wird dem Routingmodul eine Konvention zum Zuordnen der Standardroute gegeben. Die Tatsache, dass die Routen dynamisch sind, macht es nahezu unmöglich, eine statische Konfiguration zu verwenden.
Sie erwähnen auch XAML / WPF, die sich beide in der Entwicklung befanden, lange bevor Generika in .NET eingeführt wurden, und die Unterstützung von Generika hätte ein bereits sehr spätes Produkt (Longhorn / Vista) noch weiter verzögert.
Das ASP.NET MVC-Framework enthält Beispiele für die Verwendung von Lambda-Ausdrücken anstelle von magischen Zeichenfolgen, und das Entity Framework / LINQ geht noch weiter, wenn die Sprache und das Framework die systemeigene Unterstützung für das Erstellen von SQL-Abfragen über ein statisches Objektdiagramm bieten (anstatt zu konstruieren) Magic SQL-Strings (Sie erhalten eine Überprüfung der Kompilierungszeit Ihrer Abfragen).
Weitere Beispiele für die statische Konfiguration finden Sie in Structuremap und anderen modernen Dependency-Injection-Containern sowie in anderen Frameworks, die das Objektdiagramm zur Laufzeit untersuchen müssen, dem Entwickler jedoch die statische Bereitstellung von Hinweisen mithilfe von Lambda-Ausdrücken ermöglichen.
Die kurze Antwort lautet also, dass .NET das statische Durchlaufen eines Objektgraphen in der Vergangenheit bis zur Version 3.5 nicht unterstützt hat. Jetzt, da wir es haben, bevorzugen viele Entwickler es gegenüber magischen Zeichenfolgen und viele haben sich für eine noch umfassendere Unterstützung eingesetzt, beispielsweise für einen symbolOf-Operator, der ähnlich wie der typeOf-Operator funktioniert.
quelle