Voy a hacer mi mejor esfuerzo para enmarcar esta pregunta de una manera que no resulte en una guerra de idiomas o una lista, porque creo que podría haber una buena respuesta técnica a esta pregunta.
Diferentes idiomas admiten alias de tipo en diversos grados. C # permite que los alias de tipo se declaren al comienzo de cada archivo de código, y solo son válidos en todo ese archivo. Los lenguajes como ML / Haskell usan alias de tipo probablemente tanto como usan las definiciones de tipo. C / C ++ son una especie de Salvaje Oeste, typedef
y a #define
menudo se usan de manera intercambiable para tipos de alias.
Las ventajas del alias de tipo no invocan demasiada disputa:
- Hace que sea conveniente definir tipos compuestos que el lenguaje describe de forma natural, por ejemplo,
type Coordinate = float * float
otype String = [Char]
. - Los nombres largos se pueden acortar:
using DSBA = System.Diagnostics.DebuggerStepBoundaryAttribute
. - En lenguajes como ML o Haskell, donde los parámetros de función a menudo no tienen nombres, los alias de tipo proporcionan una apariencia de autodocumentación.
La desventaja es un poco más dudosa: los alias pueden proliferar, lo que dificulta la lectura y comprensión del código o el aprendizaje de una plataforma. La API Win32 es un buen ejemplo, con su DWORD = int
y su HINSTANCE = HANDLE = void*
y su LPHANDLE = HANDLE FAR*
y tal. En todos estos casos, casi no tiene sentido distinguir entre un MANGO y un puntero vacío o un DWORD y un número entero, etc.
Dejando a un lado el debate filosófico de si un rey debería dar total libertad a sus súbditos y dejarlos ser responsables de sí mismos o si deberían intervenir todas sus acciones cuestionables, ¿podría haber un medio feliz que permitiera los beneficios del alias tipográfico mientras mitigar el riesgo de su abuso?
Como ejemplo, el problema de los nombres largos se puede resolver con buenas características de autocompletar. Visual Studio 2010, por ejemplo, le permitirá escribir DSBA para referir Intellisense a System.Diagnostics.DebuggerStepBoundaryAttribute. ¿Podría haber otras características que proporcionarían los otros beneficios del alias de tipo de forma más segura?
fuente
DebuggerStepBoundaryAttribute
es mucho más legible queDSBA
. En el primer caso, sabes lo que significa. En el segundo, no tienes idea. Ahora imagine que usa veinte alias diferentes como este en el código. ¿Alguien tendría el coraje suficiente para tratar de leer y comprender su código?Respuestas:
Dos características me vienen a la mente:
Portabilidad. En lenguajes como C, donde los tipos de datos
int
son específicos de la plataforma, un alias comoDWORD
hace que sea más fácil asegurarse de que realmente está utilizando un entero con signo de 32 bits en todas partes, cuando este es el requisito para su programa, incluso cuando lo transfiere a una plataforma dondeint
está por ejemplo, 16 bits sin signo y, por lo tanto,DWORD
debe ser un alias parasigned long
.Abstracción. En su programa, puede usar muchos números enteros y de coma flotante para diferentes propósitos. Mediante la creación de alias como
SPEED
,HEIGHT
,TEMPERATURE
, es relativamente fácil de cambiar uno de los ejemplo defloat
adouble
y dejar a los demás tal como son.fuente
Estoy de acuerdo con Andrea en que necesita encapsulación, sin embargo, no estoy de acuerdo con que esto deba ser costoso.
Creo que el medio Happy sería typedefs de tipo seguro, probablemente permitiendo la conversión explícita entre el tipo real y el typedef, pero evitando la conversión implícita.
es decir, el principal problema que veo con typedefs en muchos idiomas es que en realidad no introducen un nuevo tipo sino simplemente un alias, aunque esto es útil, no es tan útil como un tipo nuevo que es como el tipo antiguo pero con un nuevo nombre. Y la composición o la herencia son demasiado pesadas si solo quieres asegurarte de no mezclar un par de variables.
fuente
type Name = String
, entoncesString
no se puede pasar a una función esperada aName
, pero es posible lo contrario.Creo que los alias de tipo le dan al programador perezoso (muy) una encapsulación barata. Entonces, tal vez la alternativa podría ser simplemente usar la encapsulación adecuada (costosa).
Sin embargo, también existe el argumento de que el primero también está mucho más optimizado para la máquina / lenguaje en uso que el segundo.
fuente