122 votes

Pourquoi ne devrais ' t j’utilise « Notation hongroise » ?

Je sais ce que les hongrois se réfère à donner des informations sur une variable, un paramètre ou d'un type comme préfixe à son nom. Tout le monde semble être rabidly contre elle, même si, dans certains cas, il semble être une bonne idée. Si j'ai l'impression que l'information utile est donnée, pourquoi ne pas le mettre à droite là où il est disponible?

Voir aussi: les gens utilisent les hongrois, les conventions de nommage dans le monde réel?

277voto

Mark Stock Points 1293

VUsage adjHungarian nnotation vmakes nreading ncode adjdifficult.

174voto

Ilya Kochetov Points 11641

La plupart des gens utilisent la notation hongroise dans un mauvais sens et obtiennent de mauvais résultats.

Lire cet excellent article de Joel Spolsky: Faire les Mauvais Code Regarde Mal.

En bref, la Notation hongroise où vous préfixe de vos noms de variables avec leur type (string) Systèmes (en hongrois) est mauvais parce que c'est inutile.

La Notation hongroise comme il a été conçu par son auteur lorsque vous préfixe le nom de la variable avec ses kind (à l'aide de Joel exemple: la sécurité de la chaîne ou dangereux chaîne), ainsi appelé Apps hongrois a son utilité et est toujours précieux.

104voto

DrPizza Points 9355

Joel est mal, et voici pourquoi.

"Demande d'information" dont il parle doit être encodé dans le système de type. Vous ne devriez pas dépendre sur le retournement des noms de variables à assurez-vous que vous ne passez pas dangereux de données pour les fonctions nécessitant de la sécurité des données. Vous devriez faire une erreur de type, de sorte qu'il est impossible de le faire. Des données doivent avoir un type qui est marqué dangereux, de sorte qu'il ne peut tout simplement pas être transmis à une fonction de sécurité. Pour convertir dangereux pour la sécurité doivent être traités avec une sorte de désinfecter la fonction.

Beaucoup de choses que Joel parle de "genre" ne sont pas des sortes; ils sont, en fait, les types.

Ce que la plupart des langues de l'absence, cependant, est un type de système qui est assez expressif pour appliquer ce genre de distinctions. Par exemple, si C avait une sorte de "fort typedef" (où le typedef nom avait toutes les opérations de type de base, mais n'était pas convertible), puis beaucoup de ces problèmes disparaissent. Par exemple, si l'on pouvait dire, strong typedef std::string unsafe_string; d'introduire un nouveau type unsafe_string ne peut pas être converti à un std::string (et pourrait donc participer à la résolution de surcharge etc. etc.) ensuite, nous n'aurions pas besoin idiot de préfixes.

Donc, l'affirmation centrale que le hongrois est pour des choses qui ne sont pas des types qui est faux. Il est utilisé pour les informations de type. Richer type d'informations que la traditionnelle C type d'information, certes; c'est le type d'information qui code pour une sorte de sémantique de détails pour indiquer le but de les objets. Mais c'est toujours des informations sur le type et la bonne solution a toujours été l'encoder dans le système de type. L'encodage dans le système de type est de loin la meilleure façon d'obtenir une validation correcte et l'application des règles. Des noms de Variables ne sont tout simplement pas couper la moutarde.

En d'autres termes, le but ne devrait pas être "faire de mauvais code regarde mal pour le développeur". Il convient de "faire de mauvais code regarde mal pour le compilateur".

46voto

nsanders Points 5282

Je pense qu’il massivement encombre le code source.

Elle aussi ne vous gagnez beaucoup dans un langage fortement typé. Si vous faites toute forme de pitreries incompatibilité de type, le compilateur vous dira à ce sujet.

28voto

JacquesB Points 19878

La notation hongroise n'a de sens que dans des langues sans types définis par l'utilisateur. Dans un cadre moderne fonctionnelle ou OO-langue, vous serait d'encoder de l'information au sujet de la "nature" de la valeur dans le type de données ou de la classe plutôt que dans le nom de la variable.

Plusieurs réponses référence Joels article. Notez cependant que son exemple est en VBScript, qui n'a pas en charge les classes définies par l'utilisateur (pour un long temps au moins). Dans un langage de types définis par l'utilisateur vous permettrait de résoudre le même problème par la création d'un HtmlEncodedString-type, puis laissez la méthode d'Écriture acceptez seulement que. Dans un langage statiquement typé, le compilateur va attraper n'importe quel codage d'erreurs, dans un typées dynamiquement, vous obtiendrez une exception d'exécution - mais en tout cas, vous êtes protégé contre l'écriture clair des chaînes de caractères. Hongrois notations tourne juste le programmeur dans un type humain-vérificateur, avec est le genre de travail qui est généralement mieux traités par le logiciel.

Joel fait la distinction entre systèmes "à la hongroise" et "apps hongrois", où "les systèmes de hongrois" code pour les types intégrés comme int, float et ainsi de suite, et "apps hongrois" encode "types", qui est plus élevée au niveau de méta-informations sur la variable beyound le type de machine, Dans un OO ou moderne fonctionnelle de la langue vous pouvez créer des types définis par l'utilisateur, donc il n'y a pas de distinction entre type et de la "nature" dans ce sens - à la fois peut être représentée par le type de système et des applications ("apps", le hongrois est tout aussi superflue que les "systèmes" hongrois.

Donc, pour répondre à votre question: les Systèmes hongrois ne serait utile que dans un dangereux, langage faiblement typé, où par exemple l'affectation d'un float valeur à une variable int va planter le système. La notation hongroise a été spécialement inventé dans les années soixante pour l'utilisation en BCPL, un joli langage de bas niveau qui ne fait rien de tout type de vérification à tous. Je ne pense pas que n'importe quelle langue en général utilisés aujourd'hui ont ce problème, mais la notation vécu comme une sorte de culte du cargo de programmation.

Apps hongrois a du sens, si vous travaillez avec une langue sans types définis par l'utilisateur, comme héritage VBScript ou les premières versions de VB. Peut-être aussi les premières versions de Perl et PHP. Encore une fois, de l'utiliser dans un cadre moderne languge est pur culte du cargo.

Dans toute autre langue, le hongrois est juste moche, redondant et fragile. Il répète des informations déjà connues du type de système, et vous ne devrait pas se répéter. Utilisez un nom descriptif pour la variable qui décrit l'objectif de cette instance spécifique du type. Utilisez le type de système d'encoder des invariants et des méta-informations sur des "types" ou des "classes" de variables - ie. les types.

L'idée générale de Joels article - pour avoir un code erroné regarde mal - est un très bon principe. Cependant une meilleure protection contre les insectes est-à - lorsque cela est possible - avoir un mauvais code pour être détecté automatiquement par le compilateur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X