web-dev-qa-db-fra.com

Notation hongroise en C #

Avant d’utiliser C #, C++ était mon principal langage de programmation. Et la notation hongroise est profondément ancrée dans mon cœur.

J'ai fait quelques petits projets en C # sans lire un livre en C # ni d'autres directives sur la langue. Dans ces petits projets c # j'ai utilisé quelque chose comme 

private string m_strExePath;

Jusqu'à ce que je lise quelque chose de SO qui disait:

Ne pas utiliser la notation hongroise.

Alors pourquoi? Suis-je la seule personne à avoir m_strExePath ou m_iNumber dans mon code C #?

32
Jason

Joel Spolsky a un très bon article sur ce sujet. En résumé, il existe deux types de notation hongroise utilisés dans la pratique. 

Le premier est "Hongrois système" où vous spécifiez le type de variable en utilisant un préfixe. Des choses comme "str" ​​pour string. C'est une information presque inutile, d'autant plus que les IDE modernes vous diront quand même le type. 

La seconde est "Apps Hungarian" où vous spécifiez le purpose de la variable avec un préfixe. L'exemple le plus courant consiste à utiliser "m_" pour indiquer les variables de membre. Cela peut être extrêmement utile lorsque cela est fait correctement.

Ma recommandation serait d’éviter les «systèmes hongrois» comme la peste mais d’utiliser «applications hongroises» là où il est logique de. Je suggère de lire l'article de Joel. C'est un peu long mais l'explique beaucoup mieux que moi.

La partie la plus intéressante de cet article est que l'inventeur original de la notation hongroise, Charles Simonyi, a créé "Apps Hungarian", mais son article a été horriblement mal interprété, entraînant l'abomination de "Systems Hungarian".

48
17 of 26

Lors de la conception de l'interface utilisateur, j'ai trouvé très utile de conserver la notation hongroise. Les éléments tels que les zones de texte, les étiquettes et les listes déroulantes sont beaucoup plus faciles à comprendre rapidement et vous obtenez souvent des noms de contrôle répétés:

lblTitle = Label
txtTitle = TextBox
ddlTitle = DropDownList

Pour moi, c'est plus facile à lire et à analyser. Sinon, la notation hongroise ne tient pas à cause des avancées d'IDE, en particulier de Visual Studio.

En outre, Joel on Software a un excellent article sur la notation hongroise intitulé: Donner un mauvais code à un faux qui donne de bons arguments pour une notation hongroise.

31
Gavin Miller

Vous n'êtes pas la seule personne, mais je dirais que c'est relativement rare. Personnellement, je ne suis pas un fan de la notation hongroise, du moins pas dans le sens simple qui ne fait que réaffirmer les informations de type déjà présentes dans la déclaration. (Les fans de la "vraie" notation hongroise expliqueront la différence - cela ne m’a jamais dérangé autant, mais je peux comprendre ce qu’ils pensent. Si vous utilisez un préfixe commun pour, par exemple, les unités de longueur par rapport aux unités de poids, vous ne le ferez pas accidentellement. assigne une variable de longueur avec une valeur de poids, même si les deux peuvent être des entiers.)

Cependant, pour les membres privés, vous pouvez pratiquement faire ce que vous voulez - convenez avec votre équipe de ce que devrait être la convention de nommage. Le point important est que si vous souhaitez que votreAPIs'intègre avec le reste de .NET, n'utilisez pas la notation hongroise dans vos membres publics (y compris les paramètres).

29
Jon Skeet

Non, vous n'êtes pas le seul à le faire. Il est juste généralement admis que la notation hongroise n’est pas la meilleure façon de nommer des choses en C # (le IDE gère beaucoup de problèmes que la notation hongroise a tenté de résoudre).

21
Justin Niessner

La notation hongroise est une terrible erreur, en toute langue. Vous ne devriez pas l'utiliser non plus en C++. Nommez vos variables pour que vous sachiez à quoi elles servent. Ne les nommez pas pour dupliquer les informations de type que IDE peut vous donner de toute façon, et qui peuvent changer (et sont généralement sans importance de toute façon. Si vous savez que quelque chose est un compteur, alors peu importe si c'est un int16, 32 ou 64. Vous savez qu'il agit comme un compteur et, en tant que telle, toute opération valide sur un compteur doit être valide. Même argument pour les coordonnées X/Y. Ce sont des coordonnées. Peu importe. s’il s’agit de flotteurs ou de doubles. Il peut être utile de savoir si une valeur est exprimée en unités de poids, de distance ou de vitesse. Peu importe qu’il s’agisse d’un flotteur.).

En fait, la notation hongroise est apparue comme un malentendu. L'inventeur avait prévu qu'il soit utilisé pour décrire le type "conceptuel" d'une variable (est-ce une coordonnée, un index, un compteur, une fenêtre?)

Et ceux qui ont lu sa description ont supposé que par "type", il entendait le type de langage de programmation (int, float, chaîne terminée par zéro, pointeur de caractère).

Ce n’était jamais l’intention, et c’est une idée horrible. Il duplique des informations que le IDE peut mieux fournir, et qui ne sont pas tout à fait pertinentes en premier lieu, car elles vous encouragent à programmer au niveau d'abstraction le plus bas possible. 

Alors pourquoi? Suis-je la seule personne à avoir m_strExePath ou m_iNumber dans mon code C # ?

Non, malheureusement non. Dites-moi, que serait exePath s'il s'agissait de n'était pas chaîne? Pourquoi ai-je besoin, en tant que lecteur de votre code, de savoir qu'il s'agit d'une chaîne? Ne suffit-il pas de savoir que c'est le chemin de l'exécutable? m_iNumber est simplement mal nommé. quel numéro est-ce? Pourquoi est-ce? Vous venez de me dire deux fois que c'est un nombre, mais je ne sais toujours pas quelle est la signification de ce nombre.

12
jalf

Vous n'êtes certainement pas la seule personne, mais j'espère que vous faites partie d'une tendance à la baisse :)

Le problème avec la notation hongroise est qu’elle essaie d’implémenter un système de types via des conventions de nommage. C'est extrêmement problématique car c'est un système de type avec une vérification humaine. Tous les utilisateurs du projet doivent souscrire au même ensemble de normes, procéder à des examens rigoureux du code et veiller à ce que tous les nouveaux types se voient attribuer le préfixe approprié et correct. En bref, il est impossible de garantir la cohérence avec une base de code suffisamment grande. Au moment où il n'y a pas de cohérence, pourquoi le faites-vous?

De plus, les outils ne supportent pas la notation hongroise. Cela peut sembler un commentaire stupide à la surface mais considérons la refactorisation par exemple. Chaque refactoring dans un système de convention de nommage hongrois doit être accompagné d'un renommage en masse pour garantir le maintien des préfixes. Les renommage en masse sont sensibles à toutes sortes de bugs subtils. 

Au lieu d'utiliser des noms pour implémenter un système de types, utilisez simplement le système de types. Il dispose d'une vérification automatique et d'un support d'outils. Les nouveaux IDE facilitent la découverte du type de variable (intellisense, conseils de survol, etc.) et suppriment réellement le désir initial de notation hongroise. 

10
JaredPar

Un inconvénient de la notation hongroise est que les développeurs changent fréquemment le type de variables au début du codage, ce qui nécessite que le nom de la variable change également.

6
Patrick Peters

à moins que vous n'utilisiez un éditeur de texte plutôt que le VS IDE, la notation hongroise n'a pas beaucoup de valeur et améliore la lisibilité au lieu d'améliorer la lisibilité

5
kloucks

La valeur réelle de la notation hongroise remonte à la programmation en C et à la nature faiblement typée des pointeurs. À la base, à l’époque, le moyen le plus simple de suivre ce type de situation était d’utiliser le hongrois.

Dans des langages tels que C #, le système de frappe vous dit tout ce que vous devez savoir et le IDE vous le présente de manière très conviviale, vous évitant ainsi d'avoir à utiliser le hongrois.

Comme bonne raison de ne pas l'utiliser, il y en a plusieurs. Premièrement, en C # et, à ce titre, C++ et bien d’autres langages, vous créez souvent vos propres types, alors quel serait le hongrois pour un type "MyAccountObject"? Même si vous pouvez choisir des notations hongroises sensibles, le nom de la variable réelle sera un peu plus difficile à lire car vous devez ignorer "LPZCSTR" (ou autre) au début. Le coût de maintenance est plus important, cependant, que se passe-t-il si vous commencez avec une liste et passez à un autre type de collection (quelque chose que je semble faire beaucoup pour le moment)? Vous devez ensuite renommer toutes vos variables utilisant ce type, sans aucun avantage réel. Si vous veniez d'utiliser un nom décent pour commencer, vous n'auriez pas à vous en préoccuper.

Dans votre exemple, si vous avez créé ou utilisé un type plus significatif pour conserver un chemin (par exemple, Chemin), vous devez alors changer votre m_strExePath en m_pathExePath, ce qui est pénible et, dans ce cas, très peu utile.

5
Steve Haigh

Les deux seuls domaines où je vois actuellement une forme de notation hongroise sont les suivants:

  • Variables de membre de classe, avec un soulignement (par exemple, _someVar)
  • Noms de contrôle WinForms et WebForms (btn pour Button, lbl pour Label etc)

Le trait de soulignement principal des variables de membre semble indiquer qu'il est là pour rester plus longtemps avec nous, mais je m'attends à voir la popularité de la hongroise diminuer sur les noms de contrôle.

3
Richard Everett

Si la notation hongroise est profondément ancrée dans le cœur de ton équipe, de ton équipe et de celle de ton entreprise, utilise-la. Ce n’est plus considéré comme une pratique exemplaire dans la mesure où je peux lire des blogs et des livres.

1
Otávio Décio

Si vous maintenez le pointeur sur la variable dans VS, il vous dira de quel type de variable il s’agit. Il n’ya donc aucune raison d’utiliser ces noms de variables cryptiques, d’autant plus que les personnes venant d’autres langues devront peut-être conserver le code et ce sera un obstacle à la lecture facile.

1
James Black

La plupart des notations hongroises décrivent ce qu'est la variable (un pointeur, ou un pointeur vers un pointeur, ou le contenu d'un pointeur, etc.), et ce à quoi elle renvoie (chaîne, etc.).

J'ai trouvé très peu d'utilité pour les pointeurs en C #, en particulier lorsqu'il n'y a pas d'appels non gérés/à l'invocation. De plus, il n'y a pas d'option d'utilisation de void *, il n'est donc pas nécessaire que l'hongrois le décrive.

Le seul reste qui reste du hongrois que j'utilise (et la plupart des autres pays de C #), est de faire précéder les champs privés avec _, comme dans _customers;

1
Steve Dunn

La notation hongroise a trouvé sa première utilisation majeure avec le langage de programmation BCPL . BCPL est l'abréviation de avant le langage de programmation C et est un langage ancien (conçu en 1966) sans type où tout est un Word. Dans cette situation, la notation hongroise peut aider à la vérification à type à l'oeil nu.

Beaucoup d'années ont passé depuis lors ...

Voici ce que dit la dernière documentation sur le noyau Linux (mine en gras):

Le codage du type d'une fonction dans le nom (ce qu'on appelle la notation hongroise ) Endommage le cerveau - le compilateur connaît quand même les types et peut Vérifier ceux-ci , et uniquement confond le programmeur.

Veuillez également noter qu'il existe deux types de notation hongroise:

  • Systèmes Notation hongroise : le préfixe code le type physical .

  • Apps Notation hongroise : Le préfixe code le type de données logical .

La notation hongroise des systèmes n’est plus recommandée en raison de la redondance de la vérification de type, elle-même liée à l’avancement des capacités du compilateur. Toutefois, vous pouvez toujours utiliser la notation Apps Hungarian si le compilateur ne vérifie pas les types de données logiques pour vous. En règle générale, la notation hongroise est bonne si et seulement si elle décrit une sémantique qui n'est pas disponible autrement.

0
Cyker

À un moment donné, vous êtes susceptible d'avoir une propriété

public string ExecutablePath { ... }

(pas que vous devriez essayer d'éviter les abréviations comme "Exe" aussi). Cela étant le cas, votre question pourrait alors être sans objet la plupart du temps, car vous pouvez utiliser les propriétés automatiques de C # 3.0.

public string ExecutablePath { get; set; }

vous n'avez plus besoin maintenant de trouver un nom pour la variable de sauvegarde. Pas de nom, pas de question/débat sur les conventions de nommage.

De toute évidence, les propriétés implémentées automatiquement ne sont pas toujours appropriées.

0
Ðаn

C'est une question d'efficacité. Combien de temps a été perdu à assigner la mauvaise valeur à une variable. Avoir des déclarations de variables précises revient à gagner en efficacité. C'est une question de lisibilité. Il s'agit de suivre les modèles existants. Si vous voulez de la créativité, faites la conception d'interface utilisateur, faites l'architecture du système. Si votre programmation, elle devrait être conçue pour vous faciliter le travail des membres de l’équipe: pas la vôtre. Un gain d'efficacité de 2% équivaut à une semaine supplémentaire chaque année. C'est 40 heures gagnées. Les gains de productivité humaine sont obtenus en combinant les efficacités.

0
Shawn

Dans un langage tel que C # où il n’existe pas beaucoup de limitations sur la longueur des noms de variable qui existaient jadis dans des langages tels que C et C++, et où IDE fournit un excellent support pour déterminer le type d’une variable, la notation hongroise est redondant.

Le code doit être explicite pour que des noms tels que m_szName puissent être remplacés par this.name. Et m_lblName peut être nameLabel, etc. L'important est d'être cohérent et de créer un code facile à lire et à maintenir - c'est le but de toute convention de dénomination, vous devez donc toujours choisir la convention que vous utilisez en fonction. J’estime que la notation hongroise n’est ni la plus lisible ni la plus facile à maintenir car elle peut être trop concise, elle nécessite une certaine connaissance de la signification des préfixes, elle ne fait pas partie de la langue et est donc difficile à appliquer et à détecter. lorsque le nom ne correspond plus au type sous-jacent.

Au lieu de cela, j'aime remplacer Apps Hungarian (préfixes comme m_) en référençant this pour les membres, en faisant référence au nom de classe pour les variables statiques et à l'absence de préfixe pour les variables locales. Et au lieu de System Hungarian (incluant le type d'une variable dans le nom de la variable), je préfère décrire le rôle de la variable, tel que nameLabel, nameTextBox, count et databaseReference.

0
Jeff Yates

Ça dépend. 

Est-ce qu'il est assez important d'ajouter la description du type de données dans variable/nom d'objet dans votre méthode/classe?

Système notation hongroise> Applications Notation hongroise  

Si vous concevez en langage procédural (par exemple, C) comportant de nombreuses variables globales ou/et une API inférieure traitant des types de données et des tailles précises (par exemple, C__<stdint.h> où plus de 40 notations de types de données différentes sont utilisées pour décrire int), La notation hongroise est plus utile.

Notez cependant que de nombreux programmeurs modernes considèrent que l’ajout d’informations sur le type dans le nom de la variable est abondant car de nombreux IDE modernes disposent d’outils très pratiques (par exemple, Outline d’Eclipse, Symbol Navigator de Xcode, Visual AssistX de Visual Studio, etc.). La notation hongroise système était largement utilisée dans la programmation (par exemple, FORTRAN, C99), lorsque les informations de type n'étaient pas facilement disponibles en tant qu'outil des IDE.

Système notation hongroise <Apps Hongroise Notation  

Si vous travaillez dans une classe ou une méthode de niveau supérieur (par exemple, une classe/méthode de pilote définie par l'utilisateur pour votre application C #), la notation d'un type de données simple peut ne pas être suffisante pour décrire la variable/l'objet. Par conséquent, nous utilisons Apps Hungarian Notation dans ce cas.

Par exemple, si le but de votre méthode est de récupérer le chemin d’exécutable et d’afficher un message d’erreur si non trouvé, au lieu de noter qu’il s’agit d’un type de string, nous notons des informations plus importantes pour décrire la variable/objet pour que les programmeurs puissent mieux comprendre le but de la variable/obejct:

private string mPathExe;
private string msgNotFound;
0
melvynkim