Réflexions sur les alias / synonymes de type?

10

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, typedefet #definesouvent 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 * floatou type 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 = intet 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?

Rei Miyasaka
la source
Intellisense ou non, System.Diagnostics.DebuggerStepBoundaryAttribute est beaucoup moins lisible en code que DSBA, surtout lorsqu'il est souvent utilisé.
zvrba
@zvrba: en fait, DebuggerStepBoundaryAttributeest beaucoup plus lisible que DSBA. 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?
Arseni Mourzenko

Réponses:

3

Deux caractéristiques me viennent à l'esprit:

Portabilité. Dans des langages comme C, où les types de données comme intsont spécifiques à la plate-forme, un alias comme vous DWORDpermet 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ù intest par exemple 16 bits non signé et DWORDdoit donc être un alias pour signed 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 de floatla doubleet laisser les autres comme ils sont.

user281377
la source
Mais cela ne répond pas à la question ...
Rei Miyasaka
@Rei, vous avez raison, ammoQ n'a pas répondu à la question mais l'a vraiment commentée. Néanmoins, P.SE ne permet pas de commentaires formatés ou longs ... Je pense qu'il ne mérite pas un downvote: son commentaire est sur le sujet et un bon.
Ando
@Andrea, il ne semble pas être le résultat d'avoir lu la question dans son intégralité; mis à part la note sur la portabilité (qui est juste un autre élément à mettre dans la liste des avantages), c'est juste une reformulation.
Rei Miyasaka
2

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.

jk.
la source
1
Je ne pourrais pas être plus d'accord, j'aimerais vraiment voir ce genre de polymorphisme "limité". Si type Name = String, alors a Stringne peut pas être passé à une fonction attendue a Name, mais l'inverse est possible.
Matthieu M.
1

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.

Ando
la source