Dlaczego świat .Net wydaje się zawierać magiczne ciągi zamiast statycznie wpisywanych alternatyw?

47

Więc pracuję w .Net. Robię projekty open source w .Net. Jednym z moich największych problemów nie jest konieczność korzystania z .Net, ale ze społecznością i otaczającymi go ramami. Wszędzie wydaje się, że magiczne schematy i ciągi nazewnictwa są traktowane jako najlepszy sposób na zrobienie wszystkiego. Odważne stwierdzenie, ale spójrz na to:

ASP.Net MVC:

Witaj, światowa trasa:

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

Oznacza to, że ASP.Net MVC w jakiś sposób wyszuka HomeControllerTwój kod. W jakiś sposób stwórz jego nową instancję, a następnie wywołaj funkcję Index najwyraźniej z jakimś idparametrem. Są też inne rzeczy:

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

Są też podobne rzeczy z XAML. DataContextjest traktowany jako przedmiot i musisz mieć nadzieję i modlić się, aby to rozwiązał do pożądanego rodzaju. DependencyProperties musi używać magicznych ciągów i konwencji nazewnictwa magicznego. I takie rzeczy:

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

Chociaż bardziej opiera się na rzucaniu i różnych magicznych mechanizmach uruchomieniowych.

W każdym razie mówię to wszystko, aby tu skończyć: Dlaczego jest to tak dobrze tolerowane w świecie .Net? Czy nie używamy języków o typie statycznym, aby prawie zawsze wiedzieć, jakiego rodzaju rzeczy? Dlaczego odbicie i typ / metoda / właściwość / jakiekolwiek nazwy (jako ciągi znaków) są tak bardzo preferowane w porównaniu do nazw ogólnych i delegatów, a nawet generowania kodu?

Czy istnieją odziedziczone powody, dla których brakuje mi powodu, dla którego składnia routingu ASP.Net opiera się prawie wyłącznie na odbiciu, aby faktycznie rozwiązać sposób obsługi trasy? Nienawidzę, kiedy zmieniam nazwę metody lub właściwości i nagle coś się psuje, ale wydaje się, że nie ma żadnych odniesień do tej metody lub właściwości i oczywiście nie ma błędów kompilatora. Dlaczego widoczną wygodę magicznych ciągów uważano za „tego wartą”?

Wiem, że istnieją również statycznie typowane alternatywy dla niektórych rzeczy, ale zwykle zajmują miejsce na drugim końcu i wydaje się, że nigdy nie są w tutorialach ani innych materiałach dla początkujących.

Earlz
źródło
14
Bezcelowy dynamizm stał się modą, odkąd nasze procesory były wystarczająco szybkie, aby go wykonać.
DeadMG
7
Jak to? Nie widziałem takich przykładów z LINQ.
DeadMG
6
Zgaduję, że właściwie wpisana statycznie alternatywa jest zbyt cholernie niewygodna. Jest to motyw, który bardzo często pojawia się w większości systemów typów: „Chcielibyśmy to zrobić w systemie typów, ale nie jest on wystarczająco wyrazisty”. (Lub odwrotnie: „Z powodzeniem wyraziliśmy to w systemie czcionek, ale uczyniło to wszystko trzy razy bardziej złożonym.”) @ GlenH7 Nie jestem zbytnio zaznajomiony z całym LINQ, ale użyte bity nie wykazują cokolwiek nawet w pobliżu tego, co opisuje ten post. Chcesz podać przykład?
2
@Ellz Co ważniejsze, anonimowe obiekty są wpisywane statycznie. Nie ma żadnych magicznych ciągów, kompilator zna nazwę i rodzaj wszystkiego, co się z tym wiąże. Oszczędzaj na każde inne użycie var.
1
@Ellz to interesujące, chociaż można argumentować, że składnia lambda jest tutaj dodatkowym wzdęciem. Domyślam się, że wybrali magiczne podejście / konwencję, ponieważ jest to bardzo proste, „wystarczająco dobre” dla wielu i zawsze mogą dostosować oprzyrządowanie, aby dać pewne wskazówki / bezpieczeństwo. To kompromis między bezpieczeństwem a wygodą, IMHO. Użycie dynamicznego ViewBag również wskazuje na tę mentalność (choć nie w pełni się z tym zgadzam).
Daniel B

Odpowiedzi:

31

W rzeczywistości w świecie .NET istnieje odepchnięcie od tych rzeczy, o których wspomniałeś. Jednak w pierwszym podanym przykładzie silnik routingu otrzymuje konwencję mapowania domyślnej trasy. Sam fakt, że trasy są dynamiczne, uniemożliwia użycie konfiguracji statycznej.

Wspominasz także o XAML / WPF, które były w fazie rozwoju na długo przed wprowadzeniem generycznych do .NET, a powrót do obsługi generycznych opóźniłby już bardzo późny produkt (Longhorn / Vista).

Istnieją przykłady w ramach ASP.NET MVC użycia wyrażeń lambda zamiast magicznych ciągów, a Entity Framework / LINQ posuwa to jeszcze dalej, gdzie język i struktura zapewniają natywną obsługę tworzenia zapytań SQL na statycznym wykresie obiektowym (zamiast konstruowania magiczne ciągi SQL, otrzymasz sprawdzanie poprawności zapytań w czasie kompilacji).

Aby zapoznać się z innymi przykładami konfiguracji statycznej, zobacz mapę struktury i inne nowoczesne kontenery wstrzykiwania zależności oraz inne struktury, które muszą sprawdzać wykres obiektów w czasie wykonywania, ale pozwalają programistom na statyczne dostarczanie wskazówek przy użyciu wyrażeń lambda.

Krótka odpowiedź brzmi, że historycznie .NET nie obsługiwał statycznego przechodzenia wykresu obiektowego do czasu wydania 3.5. Teraz, gdy go mamy, wielu programistów woli go od magicznych ciągów, a wielu dąży do jeszcze głębszego wsparcia, takiego jak operator symbolOf, który działa podobnie do operatora typeOf.

Michael Brown
źródło
3
XAML jest tak szczegółowe, jak jest ... dodanie obsługi generycznych sprawiłoby, że nawet więcej (tak, wiem, że cały XAML nie jest stworzony dla ludzi Argument). Poza tym widzę, że XAML jest bardziej podobny do HTML niż rzeczywisty język programowania. Nie powinno obchodzić go rodzaj wyświetlanych obiektów, tylko sposób wyświetlania.
Michael Brown
2
Generics pojawił się w wersji 2.0, ale nie otrzymaliśmy wyrażeń aż do wersji 3.5 (z LINQ). Wyrażenia to siła LINQ i społeczność przejęła tę moc i działała z nią. Technika ta znana jest jako odbicie statyczne
Michael Brown
1
Dobra uwaga na temat odbicia statycznego. Zapomniałem o tym w 3.5
Earlz
2
To świetna odpowiedź i zdecydowanie zgadzam się z odpowiedzią. Wszystkich tych rzeczy unikam jak zarazy, ponieważ jeśli występuje literówka lub błąd, są one łapane tylko w czasie wykonywania, co oznacza, że ​​można je bardzo łatwo przeoczyć. Sprawiają również, że refaktoryzacja jest wyjątkowo różna. Unikaj unikaj unikaj!
Rocklan
2
Zgadzam się na wypychanie. T4MVC to projekt, który przychodzi mi na myśl, który dąży do usunięcia wielu ciągów i zastąpienia ich silnie napisanym kodem.
Carson63000,