Le typage statique signifie-t-il que vous devez convertir une variable si vous souhaitez modifier son type?

StackOverflow https://stackoverflow.com/questions/600126

Question

Existe-t-il d'autres moyens de changer le type d'une variable dans un langage à typage statique comme Java et C ++, à l'exception du 'casting'?

J'essaie de comprendre quelle est la principale différence en termes pratiques entre le typage dynamique et le typage statique et continue de trouver des définitions très académiques. Je me demande ce que cela signifie en termes de mon code.

Était-ce utile?

La solution

Assurez-vous de ne pas confondre typage statique vs dynamique avec typage fort vs faible.

  • Saisie statique: chaque variable, paramètre de méthode, type de retour, etc. a un type connu au moment de la compilation, déclaré ou inféré.
  • Saisie dynamique: les types sont ignorés / n’existent pas à la compilation
  • Typage renforcé: chaque objet au moment de l’exécution a un type spécifique et vous ne pouvez effectuer que les opérations définies sur ce type.
  • Typage faible: les objets d'exécution n'ont pas de type explicite ou le système tente de convertir automatiquement les types si nécessaire.

Ces deux contraires peuvent être combinés librement:

  • Java est statiquement et fortement typé
  • C est statiquement et faiblement typé (arithmétique de pointeur!)
  • Ruby est dynamiquement et fortement typé
  • JavaScript est typé dynamiquement et faiblement

Généralement, le typage statique signifie que le compilateur intercepte beaucoup d’erreurs, qui sont des erreurs d’exécution dans un langage à typage dynamique. Cela signifie également que vous passez beaucoup de temps à vous soucier des types, souvent inutilement (voir Interfaces). frappe de canard).

Le typage fort signifie que toute conversion entre types doit être explicite, que ce soit par un transtypage ou par l’utilisation de méthodes de conversion (par exemple, l’analyse d’une chaîne de caractères en un entier). Cela signifie plus de travail de dactylographie, mais présente l'avantage de vous permettre de garder le contrôle de tout, alors qu'une dactylographie faible engendre souvent de la confusion lorsque le système effectue une conversion implicite obscure qui vous laisse avec une valeur de variable complètement fausse qui provoque de nombreux appels de méthode. ligne.

Autres conseils

En C ++ / Java, vous ne pouvez pas changer le type d'une variable.

Saisie statique : une variable a un type affecté au type de compilation et cela ne change pas.

Saisie dynamique : le type d'une variable peut changer en cours d'exécution, par exemple. en JavaScript:

js> x="5" <-- String
5
js> x=x*5 <-- Int
25

La principale différence est que dans les langages à typage dynamique, vous ne savez pas avant d'utiliser une méthode au moment de l'exécution si cette méthode existe. Dans les langages à typage statique, la vérification est effectuée à la compilation et la compilation échoue si la méthode n'existe pas.

  

Je me demande ce que cela signifie en termes de mon code.

Le système de types n'a pas nécessairement d'incidence sur l'apparence du code, par exemple. les langues avec typage statique, inférence de type et conversion implicite (comme Scala par exemple) ressemblent beaucoup à des langages à typage dynamique. Voir aussi: Ce qu'il faut savoir avant de débattre des systèmes de type .

Vous n'avez pas besoin de diffusion explicite. Dans de nombreux cas, le casting implicite fonctionne.

Par exemple:

int i = 42;
float f = i; // f ~= 42.0
int b = f;   // i == 42

class Base {
};

class Subclass : public Base {
};

Subclass *subclass = new Subclass();
Base *base = subclass;  // Legal

Subclass *s = dynamic_cast<Subclass *>(base); // == subclass.  Performs type checking.  If base isn't a Subclass, NULL is returned instead.  (This is type-safe explicit casting.)

Cependant, vous ne pouvez pas changer le type d'une variable. Vous pouvez cependant utiliser les unions en C ++ pour réaliser un type de frappe dynamique.

Regardons Java pour son langage typé staitiquement et JavaScript pour la dynamc. En Java, pour les objets, la variable est une référence à un objet. L'objet a un type d'exécution et la référence un type. Le type de la référence doit être le type de l'objet d'exécution ou l'un de ses ancêtres. Voici comment fonctionne le polymorphisme. Vous devez lancer un cast pour monter dans la hiérarchie du type de référence, mais pas vers le bas. Le compilateur s'assure que ces conditions sont remplies. Dans un langage tel que JavaScript, votre variable est simplement cela, une variable. Vous pouvez le faire pointer sur l'objet de votre choix, et vous ne connaissez pas son type avant de l'avoir vérifié.

Pour les conversions, cependant, de nombreuses méthodes, telles que toInteger et toFloat en Java, permettent de convertir et de générer un objet d'un nouveau type avec la même valeur relative. En JavaScript, il existe également des méthodes de conversion, mais elles génèrent également de nouveaux objets.

En réalité, votre code ne devrait pas être très différent, que vous utilisiez un langage typé de manière statique ou non. Ce n'est pas parce que vous pouvez changer le type de données d'une variable dans un langage typé dynamiquement que c'est une bonne idée.

Dans VBScript, par exemple, la notation hongroise est souvent utilisée pour spécifier le type de données préféré d'une variable. De cette façon, vous pouvez facilement repérer si le code mélange des types. (Ce n'était pas l'utilisation originale de la notation hongroise, mais c'est très utile.)

En conservant le même type de données, vous évitez les situations dans lesquelles il est difficile de savoir ce que fait le code et les situations dans lesquelles le code ne fonctionne tout simplement pas correctement. Par exemple:

Dim id
id = Request.QueryString("id") ' this variable is now a string
If id = "42" Then
  id = 142 ' sometimes turned into a number
End If
If id > 100 Then ' will not work properly for strings

En utilisant la notation hongroise, vous pouvez repérer du code mélangeant des types, tel que:

lngId = Request.QueryString("id") ' putting a string in a numeric variable

strId = 42 ' putting a number in a string variable
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top