Exemple bune de notație maghiară?

Această întrebare este de a căuta exemple bune de notație maghiară, astfel încât să putem reuni o colecție a acestora.

Edit: I agree that Hungarian for types isn't that necessary, I'm hoping for more specific examples where it increases readability and maintainability, like Joel gives in his article (as per my answer).

16
Această întrebare a fost creată atunci când Stack Overflow a fost inițial inițiată și nu este cu adevărat tipul de întrebare permisă astăzi pentru acest site. Este încă o resursă utilă și ar trebui păstrată din motive istorice și remizele pe care le aduce site-ului.
adăugat autor Lance Roberts, sursa

21 răspunsuri

Problema de a cere exemple bune de notație maghiară este că fiecare va avea propria idee despre cum arată un bun exemplu. Opinia mea personală este că cel mai bun notație maghiară este nu limba maghiară notatie . Notația a fost inițial menită să denumească destinația destinată utilizării a unei variabile, mai degrabă decât a tipului acesteia, dar este de obicei folosită pentru informații de tip, în special pentru comenzile Form (de exemplu, txtFirstName caseta pentru numele persoanei.). Acest lucru face ca codul să fie mai puțin întreținut, din punct de vedere al lizibilității (de ex., "Prepin nounTerms prepOf nounReadability") și refactoring pentru atunci când tipul trebuie schimbat (există "lParams" în Win32 API care au schimbat tipul).

Probabil că nu ar trebui să o utilizați deloc. Exemple:

  • strFirstName - this can just be firstName since it's obvious what it's for, the type isn't that important and should be obvious in this case. If not obvious, the IDE can help you with that.
  • txtFirstName - this can change to FirstNameTextBox or FirstName_TextBox. It reads better and you know it's a control and not just the text.
  • CAccount - C was used for class names in MFC but you really don't need it. Account is good enough. The uppercase name is the standard convention for types (and they only appear in specific places so they won't get confused with properties or methods)
  • ixArray (index to array) - ix is a bit obscure. Try arrayIndex.
  • usState (unsafe string for State) - looks like "U.S. State". Better go with state_UnsafeString or something. Maybe even wrap it in an UnsafeString class to at least make it type-safe.
37
adăugat
Sunt de acord că ar trebui să o folosim pentru o utilizare intenționată, și sper sper că oamenii vor contribui, pentru ca viitoarele mele aplicații să-mi dau un standard de la început.
adăugat autor Lance Roberts, sursa
Vă mulțumim pentru toate exemplele concrete.
adăugat autor Lance Roberts, sursa
Dacă notația maghiară se folosește în mod consecvent cu intenția inițială a care arată intenția , atunci este bine. Dar o consistență FOLOSINĂ este un hobgoblin al minții tânărului programator.
adăugat autor Mark Cidade, sursa
În PHP, nu toate tipurile sunt evidente doar din numele variabilei. Ce zici de un cod bancar de sortare $ BankSortCode ? Este "int", sau "șir", deoarece are cratime? Înălțimea unui utilizator $ UserHeight ? Ar putea fi "int" dacă este în mm, dar dacă este în picioare/inci și este un "șir" pentru a se potrivi cuvintelor feet/inches sau sau un punct? Eu folosesc un undercore cu camelCase - $ int_BankSortCode , $ str_UserName , $ ary_TeamNames . pentru toate limbile sau scenariile. Deși accept că este, așa
adăugat autor James, sursa
Merită să menționăm Convențiile Generale de Naming de la MSDN ( msdn.microsoft.com/en -US/bibliotecă/ms229045.aspx ). Ei spun: "Nu folosiți notația maghiară".
adăugat autor Fernando, sursa
Puteți face tot felul de argumente care fac anumite avantaje ale practicii de codificare să pară inutile. Să luăm CamelCase ... De ce trebuie să introducem la începutul variabilei? De ce majuscule următoarele cuvinte? userName = UserName = nume de utilizator, toate sunt la fel de ușor de citit și de înțeles. Consistența este esențială atunci când utilizați convenții de codificare, acesta fiind cel mai important lucru și sugerând că notarea maghiară este într-o oarecare măsură mai rău, ignoră totuși faptul că toate convențiile de codare sunt valide și utile, dacă sunt respectate consecvent.
adăugat autor Mike, sursa
@ gutofb7: link-ul dvs. este pentru .NET. Aceasta nu este o întrebare specifică .NET. Trebuie să înțelegem de ce această recomandare a fost făcută (gândiți-vă "Fereastra definiției codului") înainte de a încerca să aplicați acest argument pentru toate mediile și limbile. Există locații în care AppHungarianul este bine folosit, este o binecuvântare, iar toate celelalte metode menționate aici (ierarhiile de clasă, folosind nume lungi lungi, informații de tip codificare de acolo) sunt inferioare.
adăugat autor Rom, sursa
Ultimul punct prezentat aici este primul lucru care mi-a apărut în minte după citirea articolului original al lui Joel. Acesta este unul dintre scopurile ierarhiilor de clasă și folosirea convențiilor de numire pentru ao face nu este optimă.
adăugat autor Nerdfest, sursa

Articolul clasic acum, așa cum se menționează în alte postări maghiare, este cel de la site-ul lui Joel:

http://www.joelonsoftware.com/articles/Wrong.html

27
adăugat

p

(pentru pointer). Este destul de mult singurul prefix pe care îl folosesc. Cred că adaugă o mulțime la o variabilă (de exemplu, că un pointer) și ar trebui să fie tratate cu puțin mai respect.

Limba maghiară pentru tipurile de date este oarecum pasivă Acum, IDE-urile vă pot spune ce este tipul (numai în câteva secunde, care se află peste numele variabilei), deci nu este atât de important. Dar tratați un pointer ca și cum datele sale nu sunt bune, așa că doriți să vă asigurați că este evident pentru utilizator ce este chiar dacă el face ipoteze pe care nu ar trebui să le facă atunci când codifică.

16
adăugat
Sunt de acord, deși mi se pare mult mai bine să pună _p la sfârșit. Aceasta face ca dereferențele pointerului structurilor să fie mult mai ușor de citit, de ex. some_struct_p-> some_member (și some_struct_p.some_member ) ar părea evident greșit (în sensul articolului lui Joel)).
adăugat autor hlovdal, sursa
Am avut o întrebare similară și am ajuns la concluzii similare. Trimiteți aici [toamna 2014].
adăugat autor Nick Alexeev, sursa
Da, e vorba despre singura dată când aș lua în considerare și notația ungară.
adăugat autor cheduardo, sursa

t

Datele contaminate. Prefixați toate datele primite dintr-o sursă de încredere pentru a face ca variabila să fie afectată. Toate datele afectate ar trebui curățate înainte de a se realiza o lucrare reală.

15
adăugat

Nu utilizați prefixe specifice limbii.

Folosim:

n: Number 
p: Percentage 1=100% (for interest rates etc)
c: Currency
s: String
d: date
e: enumeration
o: object (Customer oCustomer=new Customer();)
...

Utilizăm același sistem pentru toate limbile:

SQL
C
C#
Javascript
VB6
VB.net
...

Este un economizor de viață.

6
adăugat
p ca un prefix în limbile care susțin indicii, dar nu înseamnă pointer ... înfricoșător!
adăugat autor Greg Beech, sursa
Nu folosim pointeri mult (dacă există). În linia noastră de lucru utilizați o mulțime de rate ale dobânzii (procentaj) și nici un indicator. Totuși, ideea este de a folosi prefixele transversale. Nu sunt prefixele specifice care contează. Alege-l pe al tău.
adăugat autor pkario, sursa
Eu folosesc enSomething pentru variabila care conține enumerarea.
adăugat autor pkario, sursa
Eu folosesc ceva ce nu este doar ceva
adăugat autor Guy Cohen, sursa

Consider că notarea ungară poate fi uneori utilă în limbi dinamice. Mă gândesc în mod special la Server Side Actionscript (în esență doar javascript), dar se poate aplica în altă parte. Deoarece nu există deloc informații reale, notarea ungurească poate uneori să facă lucrurile mai ușor de înțeles.

5
adăugat

Diavolul Avocatul: Cel mai bun exemplu de notație maghiară nu este să-l folosești. : D

Nu obținem niciun avantaj pentru folosirea notației maghiare cu IDE-uri moderne, deoarece cunosc tipul. Aceasta adaugă munca când refactorizăm un tip pentru o variabilă, deoarece numele ar trebui schimbat (și de cele mai multe ori când aveți de-a face cu o variabilă, știți ce tip este oricum).

Puteți obține, de asemenea, în ordonarea probleme cu notația. Dacă folosiți p pentru pointer și a pentru adresă sunați variabila apStreet sau paStreet? Capacitatea de citire este diminuată atunci când nu aveți consecvență și trebuie să folosiți un spațiu minuțios atunci când trebuie să vă amintiți ordinea în care trebuie să scrie notația.

5
adăugat
Notatia maghiara nu ar trebui sa fie folosita pentru tipuri. Ești complet corect acolo. Cu toate acestea, intenția inițială a fost aceea de ao folosi pentru lucruri nespecificate pe tipuri și există utilizări potențiale acolo.
adăugat autor David Thornley, sursa
Sunt de acord că nu trebuie să-l folosiți pentru toate tipurile, sper în exemple bune cum ar fi Joel, în cazul în care aceasta adaugă lizibilității și utilizabilității .;
adăugat autor Lance Roberts, sursa

Singurul maghiar care este într-adevăr util este m_ pentru variabilele membre. (De asemenea, folosesc sm_ pentru membrii statici, pentru că acesta este "altul" domeniu care există încă.) Cu monitoare cu ecran lat și compilatoare care iau nume de variabile de opt miliarde de caractere, numele abreviat de tip doar nu merită.

4
adăugat

Am fost puternic împotriva notării maghiare până când am început să citesc despre ea și să încerc să înțeleg intenția inițială a acesteia După ce a citit mesajul lui Joels "Greșit" și articolul "Redescoperirea notei maghiare", mi-am schimbat mintea. Realizat corect Cred că trebuie să fie extrem de puternic.

Wrong by Joel Spolsky
http://www.joelonsoftware.com/articles/Wrong.html

Rediscovering Hungarian Notation
http://codingthriller.blogspot.com/2007/11/rediscovering-hungarian-notation.html

Cred că cei mai mulți Naysayers nu au încercat niciodată realitatea și nu o înțeleg cu adevărat. Mi-ar plăcea să încerc într-un proiect real.

4
adăugat

Notația maghiară (carcasa de cămilă, așa cum am învățat-o) este de neprețuit atunci când moșteniți un proiect software.

Da, puteți "trece" peste o variabilă cu IDE-ul dvs. și să aflați ce clasă este, dar dacă vă apelați prin mai multe mii de linii de cod, nu doriți să vă opriți pentru acele câteva secunde - fiecare .. .. singur .... timp ....

Rețineți - nu scrieți nici un cod pentru dvs. sau pentru echipa dvs. De asemenea, îl scrieți pentru persoana care trebuie să ridice acest cod de 2-5 ani în jos și să o sporească.

4
adăugat
Camel Casing și notație maghiară sunt lucruri diferite. Camel Casing este doar doingThisWithYourNames (fiecare cuvânt începe cu o majusculă). Notația maghiară implică prefixarea unui nume de tip la nume.
adăugat autor Herms, sursa
este utilă numai dacă includeți o legendă pentru prefixe, altfel ar putea fi prea criptică pentru un viitor cititor.
adăugat autor Mark Cidade, sursa
Interesant. Am fost inițial sub presupunerea că au fost aceleași pentru că am folosit mereu aceleași prefixe (str, int, dbl, obj, dat, etc) și asta a fost în două locuri diferite.
adăugat autor David, sursa

Cred că cheia importantă de a lua de la articolul lui Joel, legat mai sus, și notarea maghiară, în general, este să-l folosești când e ceva neobișnuit cu privire la variabila.

Un exemplu, din articol, este codificat în raport cu șiruri de caractere necriptate, nu înseamnă că trebuie să folosiți "us" neagră pentru șiruri nesigure și "s" pentru șiruri de caractere sigure, este necesar să aveți un identificator some indică faptul că un șir este fie sigur, fie nu. Dacă devine standard, devine ușor să vedem când se rupe standardul.

3
adăugat

Consider că singurul punct util este când se declară controalele de interfață, numele txtUn, txtPassword, ddlBirthMonth. Nu este perfect, dar ajută pe forme mari/proiecte.

Eu nu o folosesc pentru variabile sau alte elemente, doar controale.

2
adăugat

The name of the variable should describe what it is. Good variable naming makes Hungarian notation useless.

However, sometimes you'd use Hungarian notation in addition to good variable naming. m_numObjects has two "prefixes:" m_ and num. m_ indicates the scope: it's a data member tied to this. num indicates what the value is.

Nu mă simt împiedicat deloc atunci când citesc codul "bun", chiar dacă conține unele "maghiari". Corect: Am citit codul, nu îl dau pe el. (De fapt, nu folosesc niciodată mouse-ul meu atunci când codul, sau orice voodoo programare-caracteristici specifice de căutare.)

I am slowed when I read things like m_ubScale (yes, I'm looking at you, Liran!), as I have to look at its usage (no comments!) to find out what it scales (if at all?) and it's datatype (which happens to be a fixed-point char). A better name would be m_scaleFactor or m_zoomFactor, with a comment as a fixed-point number, or even a typedef. (In fact, a typedef would be useful, as there are several other members of several classes which use the same fixed-point format. However, some don't, but are still labeled m_ubWhatever! Confusing, to say the least.)

Cred că limba maghiară era menită a fi un aditiv la numele variabilei, nu un înlocuitor pentru informații. De asemenea, de multe ori, notația maghiară nu adaugă deloc la citire variabilă, pierzând octeți și timp de citire.

Doar meu 2 ¢.

2
adăugat

În plus față de utilizarea "p" pentru pointer, îmi place ideea de a folosi "cb" și "cch" pentru a indica dacă un parametru de dimensiune buffer (sau variabilă) este un număr de octeți sau un număr de caractere (am văzut, rareori - "ce" folosit pentru a indica un număr de elemente). Deci, în loc de a transmite tipul, prefixul transmite folosirea sau intenția.

Recunosc, nu folosesc prefixul așa cum ar trebui, dar îmi place ideea.

2
adăugat

Sunt de acord că notația maghiară nu mai este deosebit de utilă. Am crezut că intenția inițială era de a indica nu tipul de date, ci tipul de entitate. Într-o secțiune de cod care implică numele clienților, angajaților și utilizatorilor, de exemplu, ați putea denumi variabilele locale de șir cusName, empName și usrName. Acest lucru ar ajuta la distingerea între nume de variabile similare de sondare. Aceleași prefixe pentru entități vor fi utilizate în întreaga aplicație. Cu toate acestea, când se utilizează OO și aveți de-a face cu obiecte, acele prefixe sunt redundante în Customer.Name, Employee.Name și User.Name.

2
adăugat
Excelent acolo.
adăugat autor strager, sursa
nu doar datatype, de asemenea, domeniul de aplicare .... :)
adăugat autor Guy Cohen, sursa

O întrebare foarte veche, dar iată câteva prefixe "maghiare" pe care le folosesc în mod regulat:

     

pentru variabilele locale, pentru a distinge localitatea în cazul în care numele poate avea sens într-un context global. Dacă vedeți MyFoo, este folosit numai în această funcție, indiferent de ce altceva facem cu Foos oriunde altundeva.

myStart = GetTime();
doComplicatedOperations();
print (GetTime() - myStart);

și

tmp

     

pentru copii temporare ale valorilor în bucle sau operații în mai multe etape. Dacă vedeți două variabile tmpFoo mai mult decât câteva linii unul de celălalt, ele aproape că nu au legătură.

tmpX = X; 
tmpY = Y;
X = someCalc(tmpX, tmpY);
Y = otherCalc(tmpX, tmpY);

șisometimes old șinew in for similar reasons to tmp, usually in longer loops or functions.

2
adăugat

m

Atunci când utilizați un ORM (cum ar fi hibernare), aveți tendința de a trata obiecte gestionate și neangajate. Schimbarea unui obiect gestionat se va reflecta în baza de date fără a apela o salvare explicită, în timp ce lucrul cu un obiect gestionat necesită un apel salvat explicit. Modul în care vă ocupați cu obiectul va fi diferit în funcție de care este.

2
adăugat

Eu folosesc vreodată p pentru un pointer, și asta-i tot. Și asta doar dacă sunt în C ++. În C# nu folosesc nici o notație ungară. de exemplu.

MyClass myClass;
MyClass* pMyClass;

Asta e tot :)

Edit: Oh, I just realised that's a lie. I use "m_" for member variables too. e.g.

class
{
private:
bool m_myVar;
}
1
adăugat

Ei bine, o folosesc numai cu variabile de control al ferestrelor. Eu folosesc btn_, txt_, lbl_ etc pentru a le detecta. De asemenea, mi se pare util să găsiți numele controlului tastând tipul lui (btn_ etc).

1
adăugat

Mă găsesc folosind "w", care înseamnă "working", ca prefix în loc de "temp" sau "tmp", pentru variabile locale care sunt doar acolo pentru a jockey date în jurul valorii, cum ar fi:

Public Function ArrayFromDJRange(rangename As Range, slots As Integer) As Variant

' this function copies a Disjoint Range of specified size into a Variant Array 7/8/09 ljr

Dim j As Integer
Dim wArray As Variant
Dim rCell As Range

wArray = rangename.Value ' to initialize the working Array
ReDim wArray(0, slots - 1) ' set to size of range
j = 0

For Each rCell In rangename
    wArray(0, j) = rCell.Value
    j = j + 1
Next rCell

ArrayFromDJRange = wArray

End Function
0
adăugat

Nu există un astfel de exemplu ca un bun exemplu de notație maghiară. Doar nu o folosiți. Nici măcar dacă utilizați un limbaj slab tipizat. Vei trăi mai fericit.

Dar dacă aveți într-adevăr nevoie de un motiv să nu-l utilizați, acesta este cel mai preferat, extras din acest link minunat :

Un truc următor în notația maghiară este "modificați tipul unei variabile, dar lăsați numele variabilei neschimbate". Acest lucru este aproape invariabil făcut în aplicațiile Windows cu migrarea din Win16: - WndProc (HWND hW, WORD wMsg, WORD wParam, LONG lParam) la Win32 WndProc (HWND hW, UINT wMsg, WPARAM wParam, LPARAM lParam) că acestea sunt cuvinte, dar se referă cu adevărat la lungi. Valoarea reală a acestei abordări este clară cu migrarea Win64, când parametrii vor fi de 64 de biți, însă prefixele vechi "w" și "l" vor rămâne pentru totdeauna.

0
adăugat