Le Transtypage… Pas si Explicite que ça !

Charlotte Hfr
5 min readJan 4, 2019

--

Avant tout… Qu’est ce qu’un type de variable ?

Imaginez simplement qu’une variable est une boite… Vous mettriez, vous, vos bijoux dans une boîte à outils ? Votre sandwich dans une boîte à lunettes ? Le type d’une variable correspond tout simplement à ce qu’est censé contenir la boite !

(techdifferences.com)

Revenons à nos moutons… Le transtypage désigne la conversion d’une variable, plus globalement d’une expression d’un type en une expression d’un autre type : on veut transformer notre boite à outils en boite à bijoux. Il est indispensable dans les langages à typage statique (langages dans lesquels les types de variables doivent être connus lors de la compilation. On peut citer Java, C++ ou encore Pascal). Pourquoi devons-nous l’utiliser ?

Eh bien cela peut-être utile :

Exemple 1

Comme on peut le voir, ici, en java, une erreur survient lors de la compilation : nous avons créé un tableau d’entier, il est donc impossible d’y insérer une variable de type double.

Cela parait simple, cependant il suit des règles précises que l’on oublie (trop) souvent… Et nous nous retrouvons alors assommés d’erreurs lors de la compilation !

Le transtypage se fait de manière simple (et il est dit conversion implicite, polymorphisme de coercition ou encore promotion) quand on veut affecter une expression d’un type de hiérarchie moins élevé à une variable d’un type plus élevé…. On peut dire facilement qu’une boîte à clous est une boîte à outils, alors que l’inverse n’est pas forcément vrai.

Illustrons cela avec le transtypage dans le cadre de la programmation orientée objet.

Exemple 2

Regardons maintenant ce qu’il se passe en ce qui concerne les types primitifs (il s’agit des types de données qui ne sont pas des objets, on les retrouve dans de nombreux langages)

Hiérarchie des types primitifs (C#)

Remarquons l’absence du type booléen. Il s’agit bien d’un type primitif, il est cependant incomparable avec les autres dans certains langages. C’est le cas en C#, c’est pourquoi il est absent cette hiérarchie. Notons qu’il est par exemple possible en C de le comparer au type int.

Maintenant, qu’a-t-on le droit de faire ?

Exemple 3

Ces deux derniers cas sont souvent source d’erreur : en effet, ils nécessitent une conversion explicite… Ce n’est pas pour vous embêter ! Globalement, il s’agit même d’une sécurité.

Exemple 4

Un entier est codé sur 4 octets, là où un double l’est sur 8 donc le fait d’être obligé de passer par une conversion explicite est là pour être sur que nous soyons conscients de la perte d’informations lors de cette conversion !

La conversion explicite permet donc un transtypage qui permet d’affecter une expression d’un type de hiérarchie plus élevé à une variable d’un type de hiérarchie moins élevée.

Si on reprend l’exemple de la programmation orientée objet, le transtypage explicite permet d’aller dans le sens mère vers fille, c’est-à-dire que l’on peut écrire :

Exemple 5

On dit que notre boite à outils est une boite à clous, en étant conscients de la perte des nombreuses autres possibilités que nous offrait notre merveilleuse boite à outils…

(https://www.genie-inc.com/7-grands-moments-eureka-de-scientifiques-ingenieurs/)

Mouais… Il y a quand même quelques petites règles à retenir quand même… C’est vraiment impossible de s’en passer ?

Et bien si, c’est possible… Grâce au typage dynamique ! (utilisé dans des langages comme par exemple Javascript ou Python, le principe est de pouvoir typer au besoin lors de l’exécution du programme, on se passe ainsi de la rigueur du transtypage obligatoire dans les langages typés statiquement)

Seulement celui-ci présente certains inconvénients ! Dans les langages à typages dynamiques, les erreurs de type se manifestent au moment de l’exécution, il faut donc vérifier absolument toutes les possibilités (rentrer dans chaque conditions, dans chaque cas, passer par toutes les “branches” de notre programme) pour être certain que le programme fonctionne… Un petit peu risqué si tout cela est à destination d’un utilisateur novice, non ? Alors le fait de coder dans un langage à typage dynamique peut paraître moins lourd… En réalité, c’est le cas seulement si on le fait mal !

On peut aussi noter un gain de mémoire par rapport aux langages dynamiques : dans un langage à typage statique, si le code a été compilé, on sait qu’il n’y a pas d’erreur de type, donc nul besoin de garder en mémoire les types de chaque expression lors de l’exécution…. Contrairement aux langages typés dynamiquement !

En bref, le transtypage rigoureux imposé par les langages typés statiquement est gage de sécurité (particulièrement lorsqu’on est un programmeur débutant !) et permet un gain de mémoire… Alors peut-être est-il bon de se faire violence en retenant toutes ces règles, quand un langage à typage statique semble plus approprié ?

SOURCES :

--

--