Warum scheint die .Net-Welt magische Zeichenfolgen statt statisch typisierter Alternativen zu verwenden?

47

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 HomeControllerin Ihrem Code irgendwie nachschlägt . Machen Sie irgendwie eine neue Instanz davon und rufen Sie dann die Funktion Index anscheinend mit einem idParameter irgendeiner Art auf. Und dann gibt es noch andere Dinge wie:

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

Ähnliches gilt auch für XAML. DataContextwird 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.

Earlz
quelle
14
Sinnlose Dynamik war der letzte Schrei, seit unsere CPUs schnell genug waren, um sie auszuführen.
DeadMG
7
Wie? Ich habe solche Beispiele mit LINQ nicht gesehen.
DeadMG
6
Meine bescheidene Vermutung ist, dass die richtig statisch typisierte Alternative zu unpraktisch ist. Das ist ein Thema, das in den meisten Schriftsystemen häufig vorkommt: "Wir möchten dies im Schriftsystem tun, aber es ist nicht aussagekräftig genug." (Oder umgekehrt: "Wir haben dies erfolgreich im Typensystem ausgedrückt, aber es hat die Dinge dreimal so komplex gemacht.") @ GlenH7 Ich kenne nicht alle von LINQ, aber die Bits, die ich verwendet habe, sind nicht vorhanden irgendetwas auch nur annähernd, was dieser Beitrag beschreibt. Möchtest du ein Beispiel geben?
2
@Earlz Noch wichtiger ist, dass anonyme Objekte statisch typisiert werden. Es gibt keine magischen Zeichenketten, der Compiler kennt den Namen und die Art von allem, worum es geht. Speichern Sie für jede andere Verwendung von var.
1
@Earlz das ist interessant, obwohl man argumentieren könnte, dass die Lambda-Syntax das zusätzliche Aufblähen hier ist. Ich vermute, dass sie sich für den Magic String / Convention-Ansatz entschieden haben, da er für viele "gut genug" ist und sie das Werkzeug jederzeit anpassen können, um eine gewisse Orientierung / Sicherheit zu bieten. Es ist ein Kompromiss zwischen Sicherheit und Komfort, IMHO. Die Verwendung eines dynamischen ViewBags deutet ebenfalls auf diese Mentalität hin (nicht, dass ich ihr voll und ganz zustimme).
Daniel B

Antworten:

31

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.

Michael Brown
quelle
3
XAML ist so ausführlich wie es ist ... Unterstützung für Generika hinzuzufügen würde es noch mehr machen (ja, ich weiß, dass das ganze XAML nicht für Menschen gemacht ist Argument). Außerdem sehe ich XAML eher als HTML-ähnliche Programmiersprache. Es sollte sich nicht um den Typ der angezeigten Objekte kümmern, sondern nur darum, wie sie angezeigt werden.
Michael Brown
2
Generika sind in 2.0 angekommen, aber wir haben erst Expressions 3.5 (mit LINQ) erhalten. Ausdrücke sind, welche Macht LINQ und die Community diese Macht genommen haben und damit laufen. Die Technik ist als statische Reflexion bekannt
Michael Brown
1
Guter Punkt zur statischen Reflexion. Ich habe vergessen, dass dies in 3.5
Earlz
2
Dies ist eine großartige Antwort und ich stimme dem Pushback definitiv zu. All diese Dinge vermeide ich wie die Pest, denn wenn es einen Tippfehler oder einen Bug gibt, werden sie nur zur Laufzeit abgefangen, was bedeutet, dass sie sehr leicht übersehen werden können. Sie machen auch Refactoring ganz anders. Vermeiden, vermeiden, vermeiden!
Rocklan
2
Stimmen Sie dem Pushback zu. T4MVC ist ein sprunghaftes Projekt, bei dem viele Zeichenfolgen entfernt und durch stark typisierten Code ersetzt werden sollen.
Carson63000