Dans tous les projets que j'ai démarrés dans des langages sans systèmes de type, j'ai fini par inventer un système de type runtime. Peut-être que le terme «système de type» est trop fort; à tout le moins, je crée un ensemble de validateurs de type/plage de valeurs lorsque je travaille avec des types de données complexes, et ensuite je ressens le besoin d'être paranoïaque quant à l'endroit où les types de données peuvent être créés et modifiés.Comment évite-t-on de créer un système de type ad-hoc dans des langages typés dynamiquement?
Je n'y avais pas réfléchi à deux fois jusqu'à maintenant. En tant que développeur indépendant, mes méthodes ont fonctionné dans la pratique sur un certain nombre de petits projets, et il n'y a aucune raison qu'ils cessent de travailler maintenant.
Néanmoins, cela doit être faux. Je me sens comme si je n'utilisais pas correctement les langues dynamiquement typées. Si je dois inventer un système de types et l'appliquer moi-même, je peux aussi bien utiliser un langage qui a des types pour commencer.
Alors, mes questions sont les suivantes:
- Y at-il des paradigmes de programmation existants (pour les langues sans types) qui permettent d'éviter la nécessité d'utiliser ou d'inventer des systèmes de type? Y a-t-il des recommandations communes sur la façon de résoudre les problèmes que le typage statique résout dans les langages dynamiquement typés (sans réinventer pudiquement les types)?
Voici un exemple concret pour vous d'envisager. Je travaille avec datetimes et timezones en erlang (un langage dynamique et fortement typé). Ceci est un type commun, je travaille avec:
{{Y,M,D},{tztime, {time, HH,MM,SS}, Flag}}
... où {Y,M,D}
est un tuple représentant une date valide (toutes les entrées sont des nombres entiers), tztime
et time
sont des atomes, HH,MM,SS
sont des nombres entiers représentant un sain d'esprit 24 h temps, et Flag
est l'un des atomes u,d,z,s,w
.
Ce type de données est généralement analysé à partir d'une entrée, donc pour garantir une entrée valide et un analyseur correct, les valeurs doivent être vérifiées pour l'exactitude du type, et pour les plages valides. Plus tard, les instances de ce type de données sont comparées entre elles, ce qui rend le type de leurs valeurs d'autant plus important que tous les termes se comparent. À partir de erlang reference manual
number < atom < reference < fun < port < pid < tuple < list < bit string
étant passé de beaucoup de java, à beaucoup de groovy, vous résolvez le problème avec des tests unitaires, et acceptez simplement le fait que vous ne savez pas jusqu'à l'exécution le vrai type d'un objet. En fait, le vrai type d'un objet n'a pas d'importance si vous tapez du canard. – dstarh
Vous semblez être en train de fusionner dynamiquement typé et faiblement typé. Il existe une distinction entre typage fort typé et typage faible et typage statique versus typage dynamique. –
Je serais intéressé de voir un exemple du type de code qui a conduit à cette question. –