DarioSantarelli.Blog("UgiDotNet");

<sharing mode=”On” users=”*” />
posts - 176, comments - 105, trackbacks - 3

My Links

News


This is my personal blog. These postings are provided "AS IS" with no warranties, and confer no rights.




Tag Cloud

Archives

Post Categories

My English Blog

Gli Anonymous Types mi tormentano!!!

Nel mio precedente post ho avanzato alcune mie riserve circa l'utilizzo degli Anonymous Types, sostenendo che possono generare confusione tra gli sviluppatori meno esperti (soprattutto se utilizzati al di fuori di query LINQ) e ricevendo giustamente delle critiche sul fatto che essi, in realtà, possono costituire un comodo espediente. Dico "giustamente" perché era proprio mia intenzione sollevare una riflessione su alcuni aspetti che mi tormentano ed a cui mi piacerebbe dare una risposta definitiva magari anche grazie a voi, senza considerare poi che sto per iniziare ad inserire pesantemente LINQ nei miei futuri progetti aziendali!!!

Prima domanda: se l'Anonymous Type assegnato ad una variabile dichiarata come "var" viene generato in fase di compilazione tramite un'inferenza (o un "implicit typing" se volete), dov'é il suo vero scopo? Qualcuno mi ha risposto intelligentemente: "...tramite projection all'interno di una variabile 'var' hai uno strong type, senza però la preventiva definizione esplicita della rispettiva classe che lo rappresenti. Addirittura, non sei vincolato a conoscere eventuali cambiamenti al tipo che ti viene restituito dalla query LINQ quindi hai il massimo della flessibilità...". mmmmmm... OK!!!
Allora a questo punto mi chiedo: se le due espressioni

var results = [LINQ Expression] IEnumerable<MyComplexType> = [LINQ Expression]


danno lo stesso risultato, con la differenza che la keyword var mi preserva dalla definizione della classe MyComplexType, che magari possiede al suo interno diverse proprietà e metodi, era così fondamentale introdurre questa feature nel compiler? Voglio dire, da così fastidio dichiarare esplicitamente un tipo di dato nel mondo reale? Non è una domanda ironica, anche perché qualcuno le ha risposto con un secco SI fornendo giustificazioni legittime sotto certi punti di vista.
Inoltre mi piacerebbe condividere con voi le seguenti domande/riflessioni: 

  • Dei dati reperiti tramite una espressione LINQ difficilmente verranno sempre utilizzati all'interno dello stesso metodo. Per passare un var contenente una collection ad un metodo esterno, ho quindi bisogno di una rappresentazione diversa degli stessi dati ( es. MioMetodo(myvar.ToArray()) ) ??? Se si (come immagino), ha senso in questo caso l'utilizzo di var?
  • Non si rischia di generare codice poco leggibile, soprattutto se si usa la projection con tipi nidificati?
  • (Di nuovo ;)) Ha senso utilizzare anonymous types al di fuori di una query LINQ?
  • E infine, perché mai è stato scelto "var" come nome? Non rischia di creare confusione tra molti sviluppatori che sono abituati a vedere questa keyword con un altro significato in altri linguaggi come Javascript? (E vi giuro che questo è un problema purtroppo...)

Per il resto, sono sicuramente convinto della potenza di questa feature quindi correggo il titolo del mio precedente post: da "magia inutile" a "magia che alcune volte può essere inutile" ;)

 Technorati tags: *AnonymousTypes , *LINQ

Print | posted on sabato 20 ottobre 2007 18:56 |

Feedback

Gravatar

# re: Gli Anonymous Types mi tormentano!!!

Non sono uno sviluppatore, e lo sai bene, ma come da discussioni verbali avvenute, l'utilizzo di costrutti di questo genere mi sembra un espediente per facilitare programmatori svogliati nella stesura del codice.
Tipizzazione Forte ed Object Oriented sono un binomio inscindibile nella mia testa e quando ho visto questi oggetti sinceramente mi sono un pò sconvolto!

Legittimo (forse) l'utilizzo in LINQ ma fuori di lì vedo solo problemi!

Tutto questo rigorosamente IMHO
20/10/2007 20:37 | Andrea
Gravatar

# re: Gli Anonymous Types mi tormentano!!!

Ciao Andrea,

a scanso di equivoci, tanto il var che gli anonymous types sono strong-typed.

La keyword var, ad esempio, può essere utilizzata solo all'interno di un metodo, e solo quando il tipo completo può essere determinato a compile time, proprio con lo scopo di salvare lo strong-typing (niente a che vedere, quindi, con il tipo variant di VB6, tanto per capirci). Personalmente, ad esempio, la trovo molto comoda nei cicli foreach:

foreach (var item in myObject.Collection) { .... }

Stesso dicasi degli anonymous types: se ne dichiari uno con due proprietà Nome e Cognome, sta' sicuro che non potrai MAI aggiungere un terzo campo dopo la dichiarazione o assegnare al Cognome la data di nascita. Ti dirò di più: fanno anche un simpaticissimo override di Equals e GetHashCode implementando l'uguaglianza sui singoli field e non sulla reference, che avrebbe veramente poco senso.

Quindi, perdonami, ma il tuo sconvolgimento lo capisco fino ad un certo punto :)
21/10/2007 17:43 | Marco De Sanctis
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET