Je vais faire de mon mieux pour formuler cette question d'une manière qui n'entraîne pas une guerre linguistique ou une liste, car je pense qu'il pourrait y avoir une bonne réponse technique à cette question.
Différentes langues prennent en charge les alias de type à des degrés divers. C # permet de déclarer des alias de type au début de chaque fichier de code, et ils ne sont valables que dans l'ensemble de ce fichier. Des langages comme ML / Haskell utilisent probablement des alias de type autant qu'ils utilisent des définitions de type. C / C ++ est une sorte de Far West, typedef
et #define
souvent utilisé de manière interchangeable pour les types d'alias.
Les avantages de l'alias de type n'invoquent pas trop de litige:
- Il facilite la définition de types composites qui sont décrits naturellement par le langage, par exemple
type Coordinate = float * float
outype String = [Char]
. - Peuvent être raccourcies noms longs:
using DSBA = System.Diagnostics.DebuggerStepBoundaryAttribute
. - Dans des langages comme ML ou Haskell, où les paramètres de fonction n'ont souvent pas de nom, les alias de type fournissent un semblant d'auto-documentation.
L'inconvénient est un peu plus incertain: les alias peuvent proliférer, ce qui rend difficile la lecture et la compréhension du code ou l'apprentissage d'une plate-forme. L'API Win32 est un bon exemple, avec son DWORD = int
et son HINSTANCE = HANDLE = void*
et son LPHANDLE = HANDLE FAR*
et tel. Dans tous ces cas, il est à peine logique de faire la distinction entre un HANDLE et un pointeur vide ou un DWORD et un entier, etc.
En laissant de côté le débat philosophique sur la question de savoir si un roi devrait donner une liberté totale à ses sujets et les laisser être responsables d'eux-mêmes ou s'ils devraient faire intervenir toutes leurs actions douteuses, pourrait-il y avoir un juste milieu qui permettrait les avantages de l'alias de type tout en atténuer le risque d'abus?
Par exemple, le problème des noms longs peut être résolu par de bonnes fonctionnalités de saisie semi-automatique. Visual Studio 2010, par exemple, vous permettra de taper DSBA afin de référencer Intellisense à System.Diagnostics.DebuggerStepBoundaryAttribute. Pourrait-il y avoir d'autres fonctionnalités qui offriraient les autres avantages de l'alias de type de manière plus sûre?
la source
DebuggerStepBoundaryAttribute
est beaucoup plus lisible queDSBA
. Dans le premier cas, vous savez ce que cela signifie. Dans le second, vous n'en avez aucune idée. Imaginez maintenant que vous utilisez vingt alias différents comme celui-ci dans le code. Quelqu'un aurait-il assez de courage pour essayer de lire et de comprendre votre code?Réponses:
Deux caractéristiques me viennent à l'esprit:
Portabilité. Dans des langages comme C, où les types de données comme
int
sont spécifiques à la plate-forme, un alias comme vousDWORD
permet de vous assurer que vous utilisez vraiment un entier signé 32 bits partout, lorsque cela est requis pour votre programme, même lorsque vous le portez sur une plate-forme oùint
est par exemple 16 bits non signé etDWORD
doit donc être un alias poursigned long
.Abstraction. Dans votre programme, vous pouvez utiliser un grand nombre de nombres entiers et à virgule flottante à des fins différentes. En créant des alias comme
SPEED
,HEIGHT
,TEMPERATURE
, il est relativement facile de changer un de ceux par exemple defloat
ladouble
et laisser les autres comme ils sont.la source
Je suis d'accord avec Andrea que vous avez besoin d'encapsulation, mais je ne suis pas d'accord pour dire que cela doit être coûteux.
Je pense que le médium heureux serait des typedefs sûrs, permettant probablement une conversion explicite entre le type réel et le typedef, mais empêchant la conversion implicite.
c'est-à-dire que le principal problème que je vois avec les typedefs dans beaucoup de langues est qu'ils n'introduisent pas réellement un nouveau type mais simplement un alias, bien que cela soit utile, il n'est pas aussi utile qu'un nouveau type qui est comme l'ancien type mais avec un nouveau Nom. Et la composition ou l'héritage sont trop lourds si vous voulez seulement vous assurer de ne pas mélanger quelques variables.
la source
type Name = String
, alors aString
ne peut pas être passé à une fonction attendue aName
, mais l'inverse est possible.Je pense que les alias de type donnent au programmeur paresseux une encapsulation (très) bon marché. Alors peut-être que l'alternative pourrait être simplement d'utiliser une encapsulation appropriée (coûteuse).
Il y a aussi l'argument selon lequel le premier est également beaucoup plus optimisé pour la machine / le langage utilisé que le second, cependant.
la source