Perché il mondo .Net sembra abbracciare stringhe magiche invece di alternative tipicamente statiche?


47

Quindi, lavoro in .Net. Realizzo progetti open source in .Net. Uno dei miei maggiori problemi con esso non è necessario con .Net, ma con la comunità e le strutture circostanti. Sembra ovunque che gli schemi e le stringhe di nomi magici siano trattati come il modo migliore per fare tutto. Dichiarazione audace, ma guarda:

ASP.Net MVC:

Ciao itinerario mondiale:

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

Ciò significa che ASP.Net MVC cercherà in qualche modo HomeControllernel tuo codice. In qualche modo crearne una nuova e quindi chiamare Index apparentemente la funzione con un idparametro di qualche tipo. E poi ci sono altre cose come:

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

E poi ci sono cose simili anche con XAML. DataContextviene trattato come un oggetto e devi sperare e pregare che si risolva nel tipo che desideri. DependencyProperties deve utilizzare stringhe magiche e convenzioni di denominazione magica. E cose come questa:

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

Anche se si basa maggiormente sul casting e su vari supporti runtime magici.

Ad ogni modo, dico tutto ciò per finire qui: perché questo è così ben tollerato nel mondo .Net? Non stiamo usando linguaggi tipicamente statici per sapere quasi sempre che tipo di cose sono? Perché la riflessione e il tipo / metodo / proprietà / qualunque nome (come stringhe) preferisce così tanto rispetto a generici e delegati o persino alla generazione di codice?

Ci sono motivi ereditari che mi mancano per cui la sintassi del routing di ASP.Net si basa quasi esclusivamente sulla riflessione per risolvere effettivamente come gestire un percorso? Odio quando cambio il nome di un metodo o di una proprietà e improvvisamente le cose si rompono, ma non sembrano esserci riferimenti a quel metodo o proprietà e non ci sono ovviamente errori del compilatore. Perché l'apparente convenienza delle corde magiche era considerata "degna"?

So che ci sono anche alternative tipicamente statiche ad alcune cose, ma di solito prendono un sedile posteriore e sembrano non essere mai in tutorial o altro materiale per principianti.


14
Il dinamismo inutile è stato di gran moda da quando le nostre CPU sono state abbastanza veloci da eseguirlo.
DeadMG

7
Come mai? Non ho visto nessuno di questi esempi con LINQ.
DeadMG

6
La mia umile ipotesi è che l'alternativa correttamente staticamente tipizzata sia troppo sconveniente. Questo è un tema che si presenta molto con la maggior parte dei sistemi di tipo: "Vorremmo farlo nel sistema di tipi, ma non è abbastanza espressivo". (O al contrario: "Abbiamo espresso con successo questo nel sistema dei tipi, ma ha reso le cose tre volte più complesse.") @ GlenH7 Non ho una grande familiarità con tutto LINQ, ma i bit che ho usato non mostrano qualcosa di simile a ciò che questo post descrive. Ti va di fare un esempio?

2
@Earlz Ancora più importante, gli oggetti anonimi sono digitati staticamente. Non ci sono stringhe magiche, il compilatore conosce il nome e il tipo di tutto ciò che è coinvolto. Risparmia per ogni altro uso di var.

1
@Earlz è interessante, anche se si potrebbe sostenere che la sintassi lambda è il gonfiamento aggiuntivo qui. La mia ipotesi è che abbiano optato per l'approccio con la stringa magica / convenzione perché è molto semplice, "abbastanza buono" per molti, e possono sempre adattare gli strumenti per fornire una guida / sicurezza. È un compromesso tra sicurezza e convenienza, IMHO. L'uso di un ViewBag dinamico suggerisce anche questa mentalità (non che io sia pienamente d'accordo con esso).
Daniel B,

Risposte:


31

In realtà c'è un respingimento nel mondo .NET contro queste stesse cose che hai citato. Nel primo esempio fornito, tuttavia, al motore di routing viene assegnata una convenzione per la mappatura del percorso predefinito. Il fatto stesso che i percorsi siano dinamici rende quasi impossibile utilizzare una configurazione statica.

Si menziona anche XAML / WPF, entrambi in fase di sviluppo molto prima che i generici fossero introdotti in .NET e che tornando a supportare i generici avrebbe ritardato ulteriormente un prodotto già molto recente (Longhorn / Vista).

Ci sono esempi all'interno del framework ASP.NET MVC dell'uso delle espressioni lambda al posto delle stringhe magiche e Entity Framework / LINQ lo porta ancora di più laddove il linguaggio e il framework forniscono supporto nativo per la composizione di query SQL su un grafico a oggetti statici (invece di costruire stringhe SQL magiche, ottieni la convalida del tempo di compilazione delle tue query).

Per altri esempi di configurazione statica, consultare la Structuremap e altri moderni contenitori per l'iniezione di dipendenze e altri framework che devono ispezionare il grafico degli oggetti in fase di esecuzione ma che consentono allo sviluppatore di fornire suggerimenti statici utilizzando espressioni lambda.

Quindi la risposta breve è che storicamente .NET non supportava l'attraversamento statico di un grafico a oggetti fino alla versione 3.5. Ora che ce l'abbiamo, molti sviluppatori lo preferiscono alle stringhe magiche e molti hanno spinto per un supporto ancora più profondo come un operatore SymbolOf che funziona in modo simile all'operatore TypeOf.


3
XAML è prolisso com'è ... l'aggiunta del supporto per i generici lo renderebbe anche più moreso (sì, so che l'intero XAML non è fatto per l'argomento umano). Inoltre, vedo XAML più simile all'HTML di un vero linguaggio di programmazione. Non dovrebbe interessare il tipo di oggetti che sta visualizzando, ma solo come visualizzarlo.
Michael Brown,

2
Generics è arrivato in 2.0, ma non abbiamo ottenuto Expressions fino a 3.5 (con LINQ). Le espressioni sono il potere che LINQ e la comunità hanno preso quel potere e lo corrono. La tecnica è nota come riflessione statica
Michael Brown,

1
Un buon punto sulla riflessione statica. Ho dimenticato che questo è stato introdotto in 3.5
Earlz il

2
Questa è un'ottima risposta e sono decisamente d'accordo con il pushback. Tutte queste cose che evito piacciono la peste perché se c'è un errore di battitura o un bug vengono catturati solo in fase di esecuzione, il che significa che possono essere facilmente persi. Inoltre rendono il refactoring estremamente diverso. Evitare evitare evitare!
Rocklan,

2
D'accordo sul pushback. T4MVC è un progetto che ricorda che aspira a rimuovere molte stringhe e sostituirle con un codice fortemente tipizzato.
Carson63000,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.