Programming Languages Hacks

Importanti regole per linguaggi di programmazione rilevanti come Java, C, C++, C#…

  • Subscribe

  • Lettori

    I miei lettori abituali

  • Twitter

Analisi sull’Uso dei Generics

Posted by Ricibald on May 19th, 2008

Mi va di trattare un argomento “banale”, su cui vi concedo 5 minuti di risposte possibili:

Quali sono gli usi dei generics?

Pensateci, pensateci e pensateci… Dopo che avete pensato a tutte le possibili risposte andate avanti a leggere…

Gli utilizzi dei generics possono essere i seguenti:

  • contenitori: i generics consentono di definire contenitori tipizzati. Possiamo quindi definire una collezione di oggetti Persona, in modo tale che non risulti possibile aggiungere oggetti che non siano di tipo Persona
  • funtori tipizzati: è possibile specificare un delegate generico, da utilizzare in funzioni di decorazione
  • decoratori: consente di aggiungere le funzionalità a un tipo. Immaginiamo di avere una classe Decorator<T>, che non fa altro che aggiungere una funzione Decorate() al tipo T, e consente di ottenere la proprietà avvolta di tipo T tramite il metodo GetValue(). Risulta molto utile questa funzionalità anche in contesti di metainformazioni: immaginiamo infatti di avere una classe Property<T> che rappresenta una proprietà: avremo metodi come GetValue(), SetValue(), IsReadOnly, IsRequired, IsEnabled, Description, … Attraverso questo utilizzo possiamo esprimere in modo fortemente tipizzato il concetto di proprietà (altrimenti saremmo stati costretti a richiedere tramite reflection le proprietà: un approccio fragile, poiché non solleva errori a tempo di compilazione in caso di proprietà inesistente)
  • proxy delle proprietà: come caso particolare dei decoratori, consente di controllare l’accesso a una certa proprietà secondo determinati vincoli di sicurezza. Consideriamo quindi una classe Proxy<T>: all’accesso di T verranno eseguiti controlli di sicurezza o inserimento in cache o altri tipi di controlli
  • vincoli di progettazione: si può pensare di introdurre delle classi a granularità architetturale, come ObjectModel<T>, DataObject<ObjectModel>, BusinessObject<DataObject>: consentono di definire il comportamento comune al bridge che lega le classi. Sappiamo infatti che il BusinessObject richiede al DataObject di creare un ObjectModel. Risulta utile creare delle classi che mettono in comune questo comportamento, in modo che sia scritto una volta per tutte. In generale, questo approccio consente di far rispettare dei vincoli di progettazione in un framework definito
  • scelta sottoclasse concreta a tempo di compilazione: design pattern come Strategy prevedono la definizione della strategia nell’ambito della classe Context, da valutare a runtime. La classe Context potrebbe essere generica: Context<IStrategy>, dove IStrategy rappresenta la strategia scelta. Questo approccio risulta molto utile per definire la classe concreta a tempo di compilazione e ottenere un guadagno prestazionale
  • specializzazione: in C# le proprietà statiche all’interno dei generics consentono di definire una primitiva forma di specializzazione. Queste verranno aggiornate solo con lo stesso tipo T utilizzato e consentono di tracciare informazioni statistiche sull’utilizzo di un certo T.

Leave a Reply

You must be logged in to post a comment.