Maďarská notace - Hungarian notation

Maďarská notace je konvence pojmenování identifikátorů v počítačovém programování , ve které název proměnné nebo funkce označuje její záměr nebo druh a v některých dialektech její typ . Původní maďarská notace používá ve své konvenci pojmenování záměr nebo druh a někdy se jí říká Apps Hungarian, protože se stala populární v divizi Microsoft Apps při vývoji aplikací Word, Excel a dalších. Když divize Microsoft Windows přijala konvenci pojmenování, použila pro pojmenování skutečný datový typ a tato konvence se rozšířila prostřednictvím Windows API; někdy se tomu říká Systems maďarská notace.

Simonyi : ... BCPL [měl] jediný typ, který byl 16bitovým slovem ... ne že by na tom záleželo.

Booch : Pokud nebudete pokračovat v maďarské notaci.

Simonyi : Absolutně ... na zadané jazyky jsme přešli také později ... Ale ... podívali bychom se na jedno jméno a řekl bych ti o něm přesně hodně ...

Maďarská notace byla navržena tak, aby byla nezávislá na jazyce, a našla své první hlavní použití s programovacím jazykem BCPL . Protože BCPL nemá žádné jiné datové typy než strojové slovo , nic v jazyce samotném nepomáhá programátorovi zapamatovat si typy proměnných. Cílem maďarské notace je napravit to tím, že programátorovi poskytnete explicitní znalosti o datovém typu každé proměnné.

V maďarské notaci název proměnné začíná skupinou malých písmen, která jsou mnemotechnickými znaky pro typ nebo účel této proměnné, za kterým následuje jakékoli jméno, které si programátor vybral; tato poslední část je někdy rozlišována jako křestní jméno . První znak křestního jména může být velký, aby se oddělil od indikátorů typu (viz také CamelCase ). Jinak případ tohoto znaku označuje rozsah.

Dějiny

Původní maďarský zápis, který by se nyní nazýval Apps Hungarian, vynalezl Charles Simonyi , programátor, který pracoval v Xerox PARC kolem roku 1972–1981 a který se později stal hlavním architektem společnosti Microsoft .

Název notace je odkazem na Simonyiho národ původu; Jména maďarských lidí jsou „obrácená“ ve srovnání s většinou ostatních evropských jmen; příjmení předchází křestní jméno . Například poangličtěné jméno „Charles Simonyi“ v maďarštině bylo původně „Simonyi Károly“. Stejně tak název typu předchází „křestnímu jménu“ v maďarské notaci, namísto pojmenovacího stylu „typu poslední“ typu Smalltalk (např. APoint a lastPoint). Tento druhý jmenný styl byl nejběžnější v Xerox PARC během Simonyiho působení.

Název Apps Hungarian byl vynalezen, protože tato konvence byla používána v aplikační divizi Microsoftu. Systems Hungarian se vyvinul později ve vývojovém týmu Microsoft Windows . Simonyiho papír odkazoval na předpony používané k označení „typu“ ukládaných informací. Jeho návrh se z velké části zabýval zdobením názvů identifikátorů na základě sémantických informací o tom, co ukládají (jinými slovy účel proměnné ), v souladu s Apps Hungarian. Jeho návrhy však nebyly zcela odlišné od toho, co se stalo známým jako Systems Hungarian, protože některé z jeho navrhovaných předpon obsahovaly malé nebo žádné sémantické informace (příklady viz níže).

Systémy Maďarsko vs. Aplikace Maďarština

Kde se notace systémů a notace aplikací liší, je účel předpon.

V maďarské notaci Systems kóduje předpona skutečný datový typ proměnné. Například:

  • lAccountNum : proměnná je dlouhé celé číslo ( "l");
  • arru8NumberList : Proměnná je arr ay u nsigned 8 bitovým celých čísel ( );"arru8"
  • bReadLine(bPort,&arru8NumberList) : funkce s návratovým kódem s bajtovou hodnotou.
  • strName : Proměnná představuje řetězec ( "str") obsahující název, ale neurčuje, jak je tento řetězec implementován.

Maďarská notace Apps se snaží kódovat spíše logický datový typ než fyzický datový typ; tímto způsobem naznačuje, co je účelem proměnné nebo co představuje.

  • rwPosition : proměnná představuje řádek ( "rw");
  • usName : proměnná představuje nebezpečný řetězec ( "us"), který je třeba před použitím „dezinfikovat“ (např. v příkladech útoků, které mohou být způsobeny použitím nezpracovaného vstupu uživatele, viz vkládání kódu a skriptování mezi weby )
  • szName : variable is a z ero-terminated s tring ( "sz"); toto byla jedna z původních navrhovaných předpon Simonyiho.

Většina, ale ne všechny předpony, které Simonyi navrhl, mají sémantický charakter. Moderním očím se zdá, že některé předpony představují fyzické datové typy, například szpro řetězce. Takové předpony však byly stále sémantické, protože Simonyi zamýšlel maďarskou notaci pro jazyky, jejichž typové systémy nedokázaly rozlišit některé datové typy, které moderní jazyky považují za samozřejmost.

Níže jsou uvedeny příklady z původního článku:

  • pXje ukazatel na jiný typ X ; obsahuje velmi málo sémantických informací.
  • dje předpona znamenající rozdíl mezi dvěma hodnotami; například dY může představovat vzdálenost podél osy Y grafu, zatímco proměnná právě nazývaná y může být absolutní poloha. To má zcela sémantický charakter.
  • szje řetězec zakončený nulou nebo nulou. V jazyce C obsahuje některé sémantické informace, protože není jasné, zda proměnná typu char* je ukazatel na jeden znak, pole znaků nebo řetězec zakončený nulou.
  • woznačuje proměnnou, která je slovo. To v podstatě neobsahuje vůbec žádné sémantické informace a pravděpodobně by to bylo považováno za Systems Hungarian.
  • boznačuje bajt, který na rozdíl od w může mít sémantické informace, protože v C je jediným datovým typem velikosti bajtu znak , takže se někdy používají k uchovávání číselných hodnot. Tato předpona může vyjasnit nejednoznačnost mezi tím, zda proměnná obsahuje hodnotu, se kterou by se mělo zacházet jako se znakem nebo číslem.

Zatímco zápis vždy používá jako malá písmena počáteční malá písmena, nepředepisuje samotné mnemotechnické pomůcky. Existuje několik široce používaných konvencí (viz příklady níže), ale lze použít libovolnou sadu písmen, pokud jsou v rámci daného souboru kódu konzistentní.

Je možné, že kód pomocí Apps maďarské notace někdy obsahuje Systems Hungarian při popisu proměnných, které jsou definovány pouze z hlediska jejich typu.

Vztah k sigilům

V některých programovacích jazycích je podobná notace nyní nazývaná sigils integrována do jazyka a vynucována kompilátorem. Například, v některých formách BASIC , name$pojmenovává řetězec a count%názvy celé číslo . Hlavní rozdíl mezi maďarskou notací a sigily je v tom, že sigily deklarují typ proměnné v jazyce, zatímco maďarská notace je čistě pojmenovací schéma bez vlivu na strojovou interpretaci textu programu.

Příklady

Za mnemotechnickými pomůckami pro ukazatele a pole , které nejsou skutečnými datovými typy, obvykle následuje typ samotného datového prvku:

  • pszOwner : ukazatel na řetězec zakončený nulou
  • rgfpBalances : Pole s plovoucí desetinnou čárkou hodnoty
  • aulColors : řada nepodepsaných dlouhých (systémy)

Přestože maďarskou notaci lze použít na jakýkoli programovací jazyk a prostředí, společnost Microsoft ji široce přijala pro použití s ​​jazykem C, zejména pro Microsoft Windows , a její použití zůstává do značné míry omezeno na tuto oblast. Zejména používání maďarského notace byl široce evangelizován podle Charles Petzold ‚s ‚Programming Windows‘ , originál (a pro mnoho čtenářů, definitivní) kniha na Windows API programování. Mnoho běžně viděných konstruktů maďarské notace je tedy specifických pro Windows:

  • Pro programátory, kteří se naučili programovat Windows v jazyce C, jsou asi nejpamátnější příklady wParam(parametr velikosti slova) a lParam(parametr s dlouhým číslem) pro funkci WindowProc ().
  • hwndFoo : klika k oknu
  • lpszBar : dlouhý ukazatel na řetězec zakončený nulou

Zápis je někdy v C ++ rozšířen o rozsah proměnné, volitelně oddělený podtržítkem. Toto rozšíření se často používá také bez maďarské specifikace typu:

  • g_nWheels : člen globálního oboru názvů, celé číslo
  • m_nWheels : člen struktury/třídy, celé číslo
  • m_wheels, _wheels : člen struktury/třídy
  • s_wheels : statický člen třídy
  • c_wheels : statický člen funkce

V JavaScript kódu pomocí jQuery , je $předpona se často používá k označení, že proměnná má objekt jQuery (versus obyčejný DOM objekt nebo nějakou jinou hodnotu).

Výhody

(Některé z nich platí pouze pro Systems Hungarian.)

Příznivci tvrdí, že výhody maďarské notace zahrnují:

  • Typ symbolu je patrný z jeho názvu. To je užitečné při pohledu na kód mimo integrované vývojové prostředí - například při kontrole kódu nebo výtisku - nebo když je deklarace symbolu v jiném souboru od místa použití, například funkce.
  • V jazyce, který používá dynamické psaní nebo který není zadán, přestávají být dekorace, které odkazují na typy, nadbytečné. V takových jazycích proměnné obvykle nejsou deklarovány jako uchovávající určitý typ dat, takže jediným vodítkem, jaké operace s nimi lze provádět, jsou rady dané programátorem, jako je schéma pojmenování proměnných, dokumentace a komentáře. Jak bylo uvedeno výše, maďarská notace se rozšířila v takovém jazyce ( BCPL ).
  • Formátování názvů proměnných může zjednodušit některé aspekty refaktoringu kódu (zatímco ostatní aspekty jsou náchylnější k chybám).
  • V bloku kódu lze použít více proměnných s podobnou sémantikou: dwWidth, iWidth, fWidth, dWidth.
  • Názvy proměnných si snadno zapamatujete, protože znáte pouze jejich typy.
  • Vede k konzistentnějším názvům proměnných.
  • Při čtení kódu lze snadno detekovat nevhodné přetypování typů a operace pomocí nekompatibilních typů.
  • V komplexních programech s mnoha globálními objekty (VB/Delphi Forms) může základní zápis předpony usnadnit hledání součásti uvnitř editoru. Například při hledání řetězce btnmohou být nalezeny všechny objekty Button.
  • Užší použití maďarské notace, například aplikace pouze pro členské proměnné , pomáhá vyhnout se kolizi pojmenování .
  • Tištěný kód je pro čtenáře přehlednější v případě datových typů, převodu typů, přiřazení, zkrácení atd.

Nevýhody

Většina argumentů proti maďarské notaci je proti maďarské notaci Systems , nikoli maďarské notaci Apps . Některé potenciální problémy jsou:

  • Maďarská notace je nadbytečná, když typovou kontrolu provádí kompilátor. Kompilátory pro jazyky poskytující přísnou kontrolu typu, například Pascal , zajišťují, že použití proměnné je automaticky v souladu s jejím typem; kontroly očima jsou nadbytečné a podléhají lidské chybě.
  • Většina moderních integrovaných vývojových prostředí zobrazuje proměnné typy na vyžádání a automaticky označuje operace, které používají nekompatibilní typy, čímž je zápis do značné míry zastaralý.
  • Maďarská notace se stává matoucí, když se používá k reprezentaci několika vlastností, jako v a_crszkvc30LastNameCol: konstantní referenční argument , obsahující obsah databázového sloupce LastNametypu varchar (30), který je součástí primárního klíče tabulky .
  • Při změně nebo přenesení kódu může dojít k nekonzistenci. Pokud se změní typ proměnné, bude buď dekorace v názvu proměnné v rozporu s novým typem, nebo bude nutné změnit název proměnné. Zvláště dobře známým příkladem je standardní typ WPARAM a doprovodný formální parametr wParam v mnoha deklaracích funkcí systému Windows. Písmeno „w“ znamená „slovo“, kde „slovo“ je původní velikost slova hardwarové architektury platformy. Původně to byl 16bitový typ na 16bitových slovních architekturách, ale byl změněn na 32bitový na 32bitových slovních architekturách nebo 64bitový typ na 64bitových slovních architekturách v novějších verzích operačního systému při zachování jeho původní název (jeho skutečný základní typ je UINT_PTR, tj. celé číslo bez znaménka, které je dostatečně velké na to, aby obsahovalo ukazatel). Sémantická impedance, a tedy zmatek a nekonzistence programátorů mezi platformami, je za předpokladu, že 'w' v těchto různých prostředích znamená dvoubajtové 16bitové slovo.
  • Znát použití proměnné většinou znamená znát její typ. Kromě toho, pokud použití proměnné není známo, nelze ji odvodit z jejího typu.
  • Maďarská notace snižuje výhody používání kódových editorů, které podporují dokončení u názvů proměnných, protože programátor musí nejprve zadat specifikátor typu, který se s větší pravděpodobností srazí s jinými proměnnými než při použití jiných schémat pojmenování.
  • Znepřehledňuje kód proměnné pomocí předpon typu a rozsahu, takže je kód méně čitelný.
  • Další informace o typu mohou nedostatečně nahradit popisnější názvy. Například sDatabase neříká čtenáři, co to je. název_databáze může být popisnější název.
  • Pokud jsou názvy dostatečně popisné, mohou být další informace o typu nadbytečné. Například firstName je s největší pravděpodobností řetězec. Pojmenování sFirstName tedy pouze přidává do kódu nepořádek.
  • Je těžší si pamatovat jména.
  • V bloku kódu s podobnými názvy lze použít více proměnných s různou sémantikou: dwTmp, iTmp, fTmp, dTmp .
  • Umístění identifikátorů datového typu nebo záměru jako předpony křestního jména pole nebo proměnné podvrací schopnost v některých programovacích prostředích přeskočit na název pole nebo proměnné, abecedně, když uživatel začne psát název. Jedním z takových programovacích prostředí je například FileMaker. Při použití jednoho z těchto programovacích prostředí může být vhodnější místo toho použít příponu Daná jména s takovými identifikačními znaky.

Pozoruhodné názory

  • Robert Cecil Martin (proti maďarské notaci a všem ostatním formám kódování):

    ... v dnešní době jsou HN a jiné formy kódování typů jednoduše překážkami. Ztěžují změnu názvu nebo typu proměnné, funkce, člena nebo třídy. Ztěžují čtení kódu. A vytvářejí možnost, že systém kódování uvede čtenáře v omyl.

  • Linus Torvalds (proti maďarskému Systems):

    Kódování typu funkce do názvu (takzvaná maďarská notace) je poškozeno mozkem-kompilátor typy stejně zná a může je kontrolovat a programátora to jen mate.

  • Steve McConnell (pro maďarské aplikace):

    Ačkoli maďarská konvence pojmenování již není široce používána, základní myšlenka standardizace přesných a přesných zkratek má i nadále hodnotu. Standardizované předpony vám umožňují přesně zkontrolovat typy, když používáte abstraktní datové typy, které váš kompilátor nutně nemusí zkontrolovat.

  • Bjarne Stroustrup (proti Systems Hungarian pro C ++):

    Ne, nedoporučuji „maďarštinu“. Považuji „maďarštinu“ (vložení zkrácené verze typu do názvu proměnné) za techniku, která může být užitečná v netypových jazycích, ale je zcela nevhodná pro jazyk, který podporuje generické programování a objektově orientované programování-oba zdůrazňují výběr operací na základě typu a argumentů (známý jazyku nebo podpoře běhu). V tomto případě „sestavení typu objektu na jména“ jednoduše komplikuje a minimalizuje abstrakci.

  • Joel Spolsky (pro maďarské aplikace):

    Pokud si dobře přečtete Simonyiho noviny, zjistil, že jde o stejný druh konvence pojmenování, jakou jsem použil ve svém příkladu výše, kde jsme se rozhodli, že to usznamená nebezpečný řetězec a sbezpečný řetězec. Oba jsou typ string. Kompilátor vám nepomůže, když jeden přiřadíte druhému a Intellisense [ inteligentní systém pro dokončení kódu ] vám neřekne bupkis . Ale jsou významově odlišní. Musí být interpretovány odlišně a musí se s nimi zacházet odlišně a bude třeba zavolat nějaký druh funkce převodu, pokud přiřadíte jeden druhému nebo budete mít chybu za běhu. Pokud máte štěstí. Aplikace Apps Hungarian má stále ohromnou hodnotu v tom, že zvyšuje kolokaci v kódu, což usnadňuje čtení, zápis, ladění a údržbu kódu, a co je nejdůležitější, dělá špatný kód špatně ... (Systémy Maďarsko) bylo jemné, ale úplné nepochopení Simonyiho záměru a praxe.

  • Pokyny pro návrh společnosti Microsoft odrazují vývojáře od používání maďarské notace Systems při výběru názvů prvků v knihovnách tříd .NET, ačkoli to bylo běžné na předchozích vývojových platformách Microsoftu, jako je Visual Basic 6 a dřívější. Tyto pokyny k návrhu mlčí o konvencích pojmenování místních proměnných uvnitř funkcí.

Viz také

Reference

externí odkazy