Quel est l'attrait de Systems Hungarian? [fermé]

18

Dans Quelles règles de dénomination suivez-vous? , l'auteur dit:

Je préfère également coder en utilisant la notation hongroise de Charles Simonyi.

J'ai rencontré plusieurs programmeurs qui préfèrent encore utiliser le hongrois, principalement de la saveur hongroise Petzold / Systems. Pensez dwLength = strlen(lpszName).

J'ai lu Rendre le code erroné faux et je comprends la raison d'être d'Apps Hongrois, où les informations de type domaine sont incluses dans les noms de variables. Mais je ne comprends pas la valeur d'attacher le type de compilateur au nom.

Pourquoi les programmeurs persistent-ils à utiliser ce style de notation? Est-ce juste de l'inertie? Y a-t-il des avantages qui l'emportent sur la diminution de la lisibilité? Les gens apprennent-ils simplement à ignorer les décorateurs lors de la lecture du code, et si oui, comment continuent-ils à ajouter de la valeur?

EDIT: Beaucoup de réponses expliquent l'histoire, ou pourquoi elle n'est plus pertinente, les deux étant couvertes dans l'article que j'ai cité.

J'aimerais vraiment entendre parler de quelqu'un qui l'utilise encore. Pourquoi l'utilisez-vous? Est-ce dans votre standard? L'utiliseriez-vous s'il n'était pas nécessaire? Souhaitez-vous l'utiliser sur un nouveau projet? Quels sont selon vous les avantages?

AShelly
la source
5
La notation hongroise était à la mode quand j'ai commencé dans l'informatique, mais c'était un environnement complètement codé. Un éditeur de texte simple sans coloration syntaxique, intellisense et des fichiers de code contenant plusieurs centaines de lignes avec toutes les variables déclarées au début. Cela a simplement rendu la vie plus facile en déterminant ce à quoi vous faisiez face. Cependant, avec les outils et les pratiques modernes, le besoin en est allé dans mon option et cela devrait vraiment être consigné dans l'histoire
GrumpyMonkey
1
Je l'ai utilisé il y a des années et je ne l'ai jamais beaucoup aimé. Ça ne me manque pas du tout.
MetalMikester
imo le plus gros problème était d'utiliser des préfixes plutôt que des suffixes - même dans les applications hongroises, la «verrue» contient généralement moins d'informations sémantiques que le reste du nom
jk.

Réponses:

38

Pour le moment, j'utilise toujours le hongrois pour exactement trois raisons , en l' évitant judicieusement pour tout le reste:

  1. Pour être cohérent avec une base de code existante lors de la maintenance.
  2. Pour les commandes, par exemple. "txtFirstName". Nous devons souvent distinguer (par exemple) "firstName" la valeur et "firstName" le contrôle. Le hongrois est un moyen pratique de le faire. Bien sûr, je pourrais taper "firstNameTextBox", mais "txtFirstName" est tout aussi facile à comprendre et contient moins de caractères. De plus, l'utilisation du hongrois signifie que les contrôles du même type sont faciles à trouver et sont souvent regroupés par nom dans l'IDE.
  3. Lorsque deux variables contiennent la même valeur mais diffèrent par type. Par exemple, "strValue" pour la valeur réellement saisie par l'utilisateur et "intValue" pour la même valeur une fois qu'elle a été analysée comme en entier.

Je ne voudrais certainement pas définir mes idées en tant que meilleures pratiques, mais je respecte ces règles car l'expérience me dit que l'utilisation occasionnelle de la maintenabilité du code des avantages hongrois coûte peu. Cela dit, je revois constamment ma propre pratique, donc je pourrais très bien faire quelque chose de différent à mesure que mes idées se développeront.


Mise à jour:

Je viens de lire un article perspicace d'Eric Lippert, expliquant comment le hongrois peut aider à donner à un mauvais code un aspect incorrect. Vaut la peine d'être lu.

Kramii
la source
Excellente réponse, luciole répond à la question posée.
AShelly
vient de remarquer l'édition créative de mon iphone ... gsub ('luciole', 'entièrement');
AShelly
5
+1 pour l'utilisation quasi-hongroise pour faciliter le regroupement des contrôles d'interface utilisateur dans l'EDI. C'est la seule utilisation qui a encore du sens pour de nouveaux projets, et je ne pourrais tout simplement pas m'en passer. Je sais souvent qu'un contrôle est une zone de texte, mais je ne sais pas s'il s'appelle "FirstName" ou simplement "Name".
Cody Gray
2
J'accepte cette réponse. À propos de l'utilisation de intValue et strValue, vous pouvez également le voir comme valueAsInt et valueAsStr, donc je ne sais pas si je considère cette notation hongroise, c'est plus comme si int et str font partie du nom de la variable.
Michel Keijzers
2
2 Je préfère les suffixes complets car les préfixes peuvent devenir assez stupides (qu'est-ce qu'un tssbou un tsddi? Oui, ils existent). Les abréviations ont aussi le problème de l' uniformité, la prise TextBoxil pourrait y avoir incohérence au sujet que ce soit tbou txt(je l' ai vu personnellement un usage dev « senior » à la fois sur une seule fenêtre). Pour 3, je laisse tomber le hongrois lorsque la variable atteint son type final prévu (par exemple, j'utiliserais valueet strValuedans votre exemple).
Jonathan Dickinson
6

Je ne suis pas un grand fan de l'utilisation de la notation hongroise, mais pensez de cette façon:

  • Nous pouvons également remarquer qu'il est plus rapide de trouver une chaîne se référant à un TextBox dans votre code: en tapant "txt" dans votre champ de recherche.

Non, imaginez le contraire, où chaque élément a son propre nom. Il pourrait être plus lent pour vous de trouver où vous voulez aller, non?

Il en va de même pour ddl lorsque nous voulons faire référence à une DropDownList, c'est plus facile ou non? :)

Les gens ne passeront pas autant de temps à trouver où se trouve cet élément.

L'utilisation du préfixe n'est pas utilisable pour les compilateurs de langages modernes comme C #, mais il est utilisable (lisible) pour les êtres humains.

Junior M
la source
C'est le meilleur exemple de sa valeur pratique que j'ai entendu. (Mais toujours pas assez pour me faire l'adopter :)
AShelly
1
Les préfixes n'étaient jamais pour les compilateurs, toujours pour les gens. Ce qui a changé, ce ne sont pas les compilateurs, mais les IDE qui fournissent des informations de type et des moyens plus efficaces de naviguer dans votre code.
Jeremy
Je ferai de même avec les variables et (en particulier) les widgets - en leur donnant souvent de courts préfixes pour indiquer leur type. Mais pas au point de devenir "hongrois à part entière".
GrandmasterB
4

Les applications hongroises (balises pour désigner les propriétés sémantiques des objets qui ne peuvent pas être exprimées via le système de type) étaient un moyen raisonnable de traiter certaines erreurs courantes lors de l'utilisation des langages faiblement typés du début des années 1980. Ils ne servent à rien dans les langues fortement typées d'aujourd'hui.

Les systèmes hongrois (balises pour désigner de manière redondante le type déclaré d'un objet) n'ont jamais servi à rien d'autre qu'à imposer une apparence superficiellement uniforme à une base de code. Il a été créé et propagé par des gestionnaires non techniques et des programmeurs inexpérimentés, qui ont mal compris l'intention d'Apps Hungarian et pensaient que la qualité du code pourrait être améliorée par des directives de codage complexes.

Les deux styles proviennent de Microsoft. De nos jours, les conventions de dénomination de Microsoft disent catégoriquement «N'utilisez pas la notation hongroise».

Mike Seymour
la source
4

Si vous venez avec le bon système de préfixes, vous pourriez étendre l'usure de vos clés, ce qui réduirait les dépenses pour les claviers de remplacement.


Je suppose que je pourrais développer cela. J'utilise SH sur mon lieu de travail depuis une dizaine d'années, oh (car c'est dans notre standard). Cela n'a jamais aidé à résoudre un problème.

D'un autre côté, j'ai utilisé des variables sans fioritures mais bien nommées dans mon «code maison» pendant presque aussi longtemps. Je n'ai jamais manqué SH.

Aux deux endroits, j'ai écrit du code de protocole qui nécessite des types primitifs de taille fixe. C'est le cas d'utilisation le plus avantageux auquel je puisse penser pour SH. Cela ne m'a pas aidé de savoir quand je l'ai écrit avec SH, et cela ne m'a pas gêné quand j'ai écrit sans SH.

Donc, en conclusion, la seule différence que je peux voir est l'usure de votre clavier.

Kaz Dragon
la source
1
comme le sarcasme là-bas :)
JohnL
4

En fait, j'ai commencé à utiliser SH dans le nouveau code que j'ai écrit ce mois-ci.

Ma mission consistait à réécrire du code Perl dans JS afin qu'il puisse être déplacé vers le côté client de notre application Web. En Perl, SH n'est généralement pas requis à cause des sigils ($ string, @array,% hash).

En JavaScript, j'ai trouvé que SH était inestimable pour suivre les types de structures de données. Par exemple,

var oRowData = aoTableData[iRow];

Cela récupère un objet à partir d'un tableau d'objets à l'aide d'un index entier. L'adhésion à cette convention m'a fait gagner du temps lors de la recherche de types de données. De plus, vous pouvez surcharger les noms de variable succincts ( oRowvs. iRow).

tl; dr: SH peut être formidable lorsque vous avez du code complexe dans un langage faiblement typé. Mais si votre IDE peut suivre les types, préférez-le.

Stefan Majewsky
la source
2

Je suis également curieux de voir la justification. Nous savons pourquoi ils l'ont utilisé dans le passé: manque de support IDE pour les informations de type. Mais maintenant? Autrement dit, je pense que c'est une tradition. Le code C ++ a toujours ressemblé à ceci, alors pourquoi changer les choses? En outre, lorsque vous construisez au-dessus du code précédent qui utilisait la notation hongroise, cela semblerait assez étrange lorsque vous arrêtez soudainement d'utiliser cela ...

Paweł Dyda
la source
2
Le code C ++ ne ressemblait pas toujours à ceci - consultez le livre Bjarne Stroustrup.
JBRWilkinson
@JBRWilkinson: Charles Simonyi a créé la notation hongroise vers 1976 ( c2.com/cgi/wiki?HungarianNotation ). Cette notation est donc antérieure à C ++. Beaucoup sinon la plupart des programmeurs C ++ l'utilisent depuis le premier jour (de leur codage, c'est-à-dire). Je comprends que Bjarne Stroustrup est une exception notable, tout comme Linus Torvalds, mais cela ne change rien aux faits.
Paweł Dyda
2
Je pense que le hongrois a toujours été principalement une chose Microsoft. Je ne l'ai pas vu beaucoup utilisé dans les environnements Unix et Unix.
David Thornley
2

La notation hongroise de Systems était en fait un peu un cock-up, une incompréhension du terme «type». Les développeurs de systèmes l'ont pris littéralement comme type de compilateur (mot, octet, chaîne, ...) par opposition au type de domaine des applications (index de ligne, index de colonne, ...).

Mais je suppose que chaque développeur passe par plusieurs phases de style qui semblent être une excellente idée à l'époque (et le type de préfixe semble être une bonne idée pour un novice) avant de tomber dans les pièges (changer de type, créer de nouveaux préfixes significatifs, etc). Je suppose donc qu'il y a une inertie: des développeurs qui ne s'améliorent pas et qui réalisent pourquoi c'est un mauvais choix, des développeurs coincés avec des normes de codage qui imposent la pratique et des personnes qui utilisent <windows.h>. Il serait trop coûteux pour Microsoft de changer pour se débarrasser de la notation de préfixe (qui est incorrecte à de nombreux endroits: WPARAM?).

Skizz
la source
1
Même l'utilisation prévue est loin d'être optimale car elle crée un système de type privé que le compilateur ne connaît pas et ne peut donc pas taper check.
Larry Coleman
@ Larry: Bien que cela soit certainement vrai, il existe des logiciels qui peuvent analyser le code source et vérifier que le code est conforme à une norme. Ils pourraient être en mesure de s'assurer que les préfixes correspondent dans les expressions.
Skizz
1
Mon idéal lors de l'utilisation de la frappe statique est que l'ensemble des types de compilateur soit un surensemble de l'ensemble des types de domaine. Ensuite, le compilateur peut tout vérifier, aucun module complémentaire requis.
Larry Coleman
0

Il y a une chose qui manque au hongrois. La notation hongroise fonctionne très bien avec la saisie semi-automatique.

Supposons que vous ayez une variable et que le nom soit intHeightOfMonster.

Supposons que vous oubliez le nom de la variable

Il peut s'agir de heightOfMonster ou MonsterHeight ou MeasurementMonsterHeight

Vous voulez pouvoir taper une lettre et obtenir la saisie semi-automatique vous suggérer des noms de variables.

Sachant que le heightOfMonster est un int, vous tapez simplement i et le tour est joué.

Gagner du temps.

user114310
la source