Cercherò di fare del mio meglio per inquadrare questa domanda in un modo che non sfoci in una guerra o lista linguistica, perché penso che ci potrebbe essere una buona risposta tecnica a questa domanda.
Diverse lingue supportano l'alias di tipi a vari livelli. C # consente di dichiarare alias di tipo all'inizio di ogni file di codice e sono validi solo per quel file. Lingue come ML / Haskell usano alias di tipo probabilmente tanto quanto usano definizioni di tipo. C / C ++ sono una sorta di Wild West, con typedef
e #define
spesso usati in modo apparentemente intercambiabile con i tipi di alias.
I lati positivi del tipo aliasing non invocano troppe controversie:
- Rende conveniente definire tipi compositi descritti in modo naturale dalla lingua, ad es.
type Coordinate = float * float
otype String = [Char]
. - I nomi lunghi possono essere abbreviati:
using DSBA = System.Diagnostics.DebuggerStepBoundaryAttribute
. - In linguaggi come ML o Haskell, dove i parametri di funzione spesso non hanno nomi, gli alias di tipo forniscono una parvenza di autodocumentazione.
Il lato negativo è un po 'più incerto: gli alias possono proliferare, rendendo difficile la lettura e la comprensione del codice o l'apprendimento di una piattaforma. L'API Win32 è un buon esempio, con il suo DWORD = int
e il suo HINSTANCE = HANDLE = void*
e il suo LPHANDLE = HANDLE FAR*
e così via. In tutti questi casi non ha alcun senso distinguere tra un HANDLE e un puntatore void o un DWORD e un intero ecc.
Accantonando il dibattito filosofico sul fatto che un re dovrebbe dare completa libertà ai propri sudditi e lasciare che siano responsabili per se stessi o se debbano avere tutte le loro azioni discutibili, potrebbe esserci un mezzo felice che consentirebbe i benefici di digitare aliasing mitigando il rischio di abuso?
Ad esempio, il problema dei nomi lunghi può essere risolto con buone funzionalità di completamento automatico. Visual Studio 2010, ad esempio, ti consentirà di digitare DSBA per indirizzare Intellisense a System.Diagnostics.DebuggerStepBoundaryAttribute. Potrebbero esserci altre funzionalità che potrebbero fornire altri benefici dell'aliasing di tipo più sicuro?