Le système de type déjà applique un grand nombre de ces fonctions de sécurité. C'est essentiellement ce que c'est pour.
Pour un exemple très simple, cela vous empêche de traiter un flottant comme un int. C'est un aspect de la sécurité - il garantit que le type sur lequel vous travaillez va se comporter comme prévu. Il garantit que seules les méthodes de chaîne sont appelées sur une chaîne. L'assemblage n'a pas cette garantie, par exemple.
Il appartient également au système de types de s'assurer que vous n'appelez pas de fonctions privées sur une classe. C'est une autre caractéristique de sécurité.
Le système de type Java est trop anémique pour appliquer efficacement beaucoup de contraintes intéressantes, mais dans de nombreux autres langages (y compris C++), le système de type peut être utilisé pour appliquer des règles beaucoup plus étendues.
En C++, la métaprogrammation de template vous donne beaucoup d'outils pour interdire le "mauvais" code. Par exemple:
class myclass : boost::noncopyable {
...
};
impose à la compilation que la classe ne peut pas être copiée. La suivante produira des erreurs de compilation:
myclass m;
myclass m2(m); // copy construction isn't allowed
myclass m3;
m3 = m; // assignment also not allowed
De même, nous pouvons assurer à la compilation qu'une fonction de modèle uniquement est appelée sur les types qui remplissent certains critères (par exemple, ils doivent être itérateurs à accès aléatoire, tandis que les bilinéaire ne sont pas autorisés, ou doivent être des types POD, ou ne doivent pas être de type entier (char, short, int, long), mais tous les autres types doivent être légaux
Un exemple de métaprogrammation de modèle en C++ implémente une librairie pour le calcul des unités physiques qui permet de multiplier une valeur de type "meter" par une autre valeur du même type, et détermine automatiquement que le résultat doit être de type "square meter". aleur de type "mile" avec une valeur de type "hour" et obtenir une unité de type "miles par heure".
Encore une fois, une fonction de sécurité qui vous empêche de mélanger vos types et de mélanger accidentellement vos unités. Vous obtiendrez une erreur de compilation si vous calculez une valeur et essayez de l'affecter au mauvais type. essayer de diviser, disons, litres par meters^2
et en affectant le résultat à une valeur de, disons, kilogrammes, entraînera une erreur de compilation.
La plupart de ces opérations nécessitent un travail manuel, mais le langage vous fournit les outils dont vous avez besoin pour créer les vérifications de type souhaitées. Certains de ces éléments pourraient être mieux supportés directement dans la langue, mais les contrôles les plus créatifs devraient être implémentés manuellement dans tous les cas.
Ceci est également discuté dans Podcast 58 (http://blog.stackoverflow.com/2009/06/podcast-58/) – Brian
c'est essentiellement ce qu'est un système de type * *. Sans le système de type, n'importe quelle variable pourrait être traitée comme n'importe quelle autre. Vous seriez en mesure d'accéder à la mémoire hors limites en traitant, disons, un int comme un double. Cela vous permettrait d'obtenir la valeur des 4 octets après la fin de l'int. Ou les entiers non signés vous empêchent de stocker accidentellement des valeurs signées. (bien que la façon dont ils le convertissent en silence ne soit pas idéale) – jalf
Bien, mais il semble qu'il y ait un niveau de propriétés plus élevé que nous pouvons appliquer dans le système de type qui a peu à voir avec la façon dont nous manipulons la représentation des données.Essentiellement, j'imagine que le système de types est davantage intégré dans la logique métier. –