it-swarm-eu.dev

Předponujete názvy proměnných se zkratkou typů proměnných? (Maďarská notace)

V mé současné práci neexistují žádné pokyny pro kódování. Všichni do značné míry kódují tak, jak chce. Což je v pořádku, protože společnost je malá.

Jeden nový muž však nedávno navrhl, aby se vždy používal maďarský zápis. Až dosud někteří z nás používali nějaký maďarský zápis, jiní ne. Víte, je to strojírenská společnost, takže na kódovacích stylech opravdu nezáleží, pokud jsou algoritmy zdravé.

Osobně mám pocit, že tyto malé zkratky typu jsou nadbytečné. Dobře promyšlené jméno obvykle doručuje stejnou zprávu. (Dále, většina našeho kódu musí běžet na některých weirdo DSP, kde koncept jako bool nebo float stejně neexistuje).

Jak se tedy cítíte o maďarské notaci? Používáte to? Proč?

37
bastibe

Když většina lidí řekne „maďarská notace“, hovoří o „ systémy maďarština “.

Systémy Maďarština je zcela zbytečné a nemělo by se jim vyhýbat. Není nutné kódovat typ proměnné v jejím názvu. Nicméně, systém maďarština je vlastně nedorozumění originálu , „skutečného“ maďarštiny: Apps maďarsky.

V Apps maďarštině nekódujete „typ“ v názvu proměnné, zakódujete „druh“ proměnné. Takže ne nWidth, ale pxWidth nebo emWidth (pro "width in pixels" nebo "width in ems"). Ne strName ale sName nebo usName (pro „bezpečné jméno“ nebo „nebezpečné jméno“ - užitečné při přijímání vstupů od uživatelů: nebezpečné řetězce).

Osobně se s tím obvykle také neobtěžuji. Pokud nedělám něco, co výslovně převádí „druh“ hodnoty (například jsem v minulosti použil předponu „px“ a „em“, protože to způsobuje chyby jako pxArea = emWidth * emHeight zřejmé).

Viz také, Joelův článek, „ Aby chybný kód vypadal špatně .“

77
Dean Harding

zájmenoVy slovesoMalo by příslovceNikdy slovesoUživatelské jménoHungariánské podstatné jménoNotace, předložkaJeso sloveso Kolektivní sběratelstvíVšechny příslovceJako srovnávacíKoloslovné adjektivumHard infinitiveTo slovesoČtení.

31
smirkingman

Za prvé:

Víte, je to strojírenská společnost, takže na kódovacích stylech opravdu nezáleží, pokud jsou algoritmy zdravé.

Styl kódování nezáleží na společnosti. Ano, algoritmy musí, aby byly zvukové, ale kód musí musí být udržovatelný pro každého, nejen pro původního vývojáře. Mít kódovací standard, který obsahuje stylové prvky, k tomu vede. Neříkám, že by celý kód měl být identický ve stylu - to by bylo kontraproduktivní, ale měla by existovat určitá konzistence.

Nyní k maďarskému zápisu:

I když to mělo své využití, s moderním IDE, který podporuje chování typu IntelliSense) není nutné do názvu zahrnout typ proměnné. Tato informace je k dispozici jiným způsobem. V horším případě může to ztěžovat čtení kódu, pokud budete muset v budoucnu změnit typ proměnné.

26
ChrisF

Nepoužívejte to. Je nadbytečný a ztěžuje čtení kódu.

21
codeape

Hodně debaty o (systémovém) maďarském notaci závisí na oblasti práce. Býval jsem velmi pevně na straně "žádným způsobem!", Ale poté, co jsem pracoval několik let ve společnosti, kde se používá pro vestavěný vývoj, vidím některé výhody z toho v určitých aplikacích a rozhodně na mně vzrostl .

Systémy maďarština

Z toho, co mohu říci, má tendenci být systém maďarsky používán ve vestavěném poli. V PC aplikacích se kompilátor bude zabývat mnoha problémy spojenými s rozdíly mezi (např.) Řetězci, celými čísly a hodnotami s pohyblivou řádovou čárkou. Na hluboce zabudované platformě se více obáváte rozdílů mezi 8bitovými nepodepsanými celými čísly, 16bitovými celými čísly podepsanými atd. Kompilátor (nebo dokonce chvályhodné s vynucenými pravidly MISRA) na ně vždy nebere ohled. V tomto případě mají názvy proměnných jako u8ReadIndex, s16ADCValue může být nápomocný.

Aplikace maďarština

Aplikace Maďarština má určité výhody, pokud jde o PC/Webové aplikace, například nabízí vizuální rozdíl mezi „nebezpečnými“ řetězci a „bezpečnými“ řetězci (tj. Těmi, které zadal uživatel, a těmi, kterým unikl nebo je číst z interních zdrojů nebo cokoli ). Kompilátor o tomto rozlišení neví.

Jaký to má smysl?

Použití (systémů nebo aplikací) maďarštiny je hlavně o tom, jak chybný kód vypadá špatně.

Pokud zkopírujete nebezpečný řetězec přímo do bezpečného řetězce bez úniku, bude vypadat špatně, pokud používáte maďarštinu Apps.

Pokud znásobíte celé číslo podepsané celým číslem bez znaménka, kompilátor (často tiše) povýší podepsaný na (možný obrovský) nepodepsaný, což může mít za následek chybu: Systém Maďarština způsobí, že tento vzhled vypadá špatně.

V obou těchto situacích má maďarská notace (Apps/Systems) tendenci zrychlit formální revizi kódu, protože se méně odkazuje na typ proměnné.

Celkově

Celkově se domnívám, že nejdůležitější věcí je, že máte kódovací standard. Zda to používá systémy maďarsky, maďarsky, maďarsky nebo ne, je věcí osobní nebo skupinové preference, podobně jako volba typů odsazení atd. Existují však určité výhody pro celý vývojový tým, který pracuje se stejnou preferencí.

13
DrAl

Účelem maďarské notace je zakódovat informace do identifikátoru, který nelze jinak kódovat v typovém systému. Můj vlastní názor je, že pokud jsou tyto informace natolik důležité, aby mohly být zakódovány, pak je natolik důležité, aby byly zakódovány v typovém systému, kde je lze řádně zkontrolovat. A pokud informace nejsou důležité, tak proč sakra chcete zaplnit váš zdrojový kód?

Nebo stručně řečeno: informace o typu patří do systému typů. (Poznámka: nemusí to být systém typu statický. Dokud zachytí chyby typu, nestarám se o to kdy, chytí je.)

Několik dalších odpovědí uvádělo měrné jednotky jako přijatelné použití maďarské notace. (Jsem trochu překvapený, že se nikdo ještě nezmínil o klimatickém orbitru NASA Mars, protože se zdá, že se objevuje po celou dobu v diskusích o maďarské notaci).

Zde je jednoduchý příklad v F #:

[<Measure>] type m
[<Measure>] type ft

let someLength      = 48.15<m>
let someOtherLength = 16.2342<ft>

someLength + someOtherLength
// someLength + someOtherLength
// -------------^^^^^^^^^^^^^^^
// error FS0001: The unit of measure 'ft' does not match the unit of measure 'm'.

Podívej, Ma, žádní Maďaři!

Pokud bych byl používal maďarské notace místo typů zde, nepomohlo by mi to trochu:

let mSomeLength       = 48.15
let ftSomeOtherLength = 16.2342

mSomeLength + ftSomeOtherLength
// > val it : float = 64.3842

Kompilátor to nechal rovnou projít. Nyní se spoléhám na lidský, abych zjistil, co je v podstatě typová chyba. Není to pro co typový kontrolor?

Ještě lepší je použití programovací jazyk Frink :

someLength      = 48.15m
someOtherLength = 16.2342ft

someLength + someOtherLength
// 53.09818416 m (length)

// Wanna know the answer in a good old fashioned American unit?
someLength + someOtherLength -> yd
// 58.06888031496062992

// Are you an astrophysicist?
someLength + someOtherLength -> parsec
// 1.7207949554318336148e-15

// ... or a fundmentalist Christian who refuses to use units invented 
// less than 2000 years ago?
someLength + someOtherLength -> biblicalcubits
// 95.893563822870765006

Stručně řečeno: Nemám rád maďarský zápis. Nikdy byste to neměli používat.

Jak již bylo řečeno, myslím, že použití maďarského zápisu je dobrý nápad. Počkej co?

Ano! V tomto konkrétním případě jste uvedli:

Kromě toho většina našeho kódu musí běžet na některých weirdo DSP, kde stejně neexistuje koncept jako bool nebo float.

Ale to je přesně jediný rozumný případ použití pro Maďarská notace!


PS: Upřímně doporučuji dívat se na Frink. Jeho příručka obsahuje některé z nejúžasnějších prdích vtipů, jaké kdy byly. Je to také docela cool jazyk :-)

9
Jörg W Mittag

SAKRA NE!

Nepoužívejte maďarský zápis ani jiný zápis. Jako programátoři bychom neměli používat „notaci“ pro naše názvy proměnných.

Co bychom měli udělat, je pojmenovat naše proměnné dobře:

  • Vyhněte se příliš obecným jménům. Pokud to není proměnná třídy představující pojmenovaný objekt, řekněme, telefonní účet, nemějte název z. Říkejte tomu phoneBill nebo PhoneBill.
  • Vyhněte se příliš konkrétním jménům. Pokud je něco jasné bez dalších informací, nezahrnujte je. Pokud je to jen řetězcová proměnná indexu pro opakování znaků řetězce a používáte ji pouze jednou ve funkci MyFunc, proč byste ji na Zemi někdy nazvali MyFuncTempStringCharacterIndex? To je smutný vtip. Říkejte tomu Pos nebo dokonce i, pokud chcete. V kontextu příští programátor snadno pochopí, co to znamená.

  • Při nulování toho, jak obecné nebo specifické by mělo být jméno, zvažte doménu, v níž se nachází, a kontext dalších možných významů. V úzkém případě, kdy existují dvě snadno zaměnitelné položky podobného typu, které se používají stejným způsobem, je dobré přijít s předponou nebo příponou označující tento rozdíl. Udržujte to co nejkratší.

Jak již uvedli jiní respondenti, právě v tomto úzkém případě bylo zahájeno „Apps Hungarian“, aby bylo možné rozlišovat mezi měřeními vzhledem k oknu rwTabPosition a relativními k dokumentu rdTabPosition. Ale v aplikaci, která dělá vše související s dokumentem, nepřidávejte žádné další křížky! Ve skutečnosti, proč nepoužít Jörg W Mittagův nápad z toho vyrobit skutečný nový typ? Potom se nemůžete nechat smíchat.

Téměř v jakékoli oblasti přidávání věcí, které mají minimální hustotu významů, snižuje celkovou smysluplnost a snadnost porozumění. Zde je jeden příklad od Ben Franklina . A další příklad: v angličtině je možné ozdobit naše slova svou částí řeči. Je to více informací, že? V případě, že začátečníci s angličtinou zmatení, mohlo by to pro ně být opravdu užitečné, že? Přečtěte si toto a řekněte mi, jak užitečné si myslíte, že je to pro dlouhodobé porozumění a efektivní předávání informací:

vrbDo advote vrbuse nouHungarian nounotation cnjor adjany adjother nounotation. prepAs nouprogrammers, prowe vrbshould should never verbe nouusing "nounotation" prpfor proour adjouriable nounames.

Od přidání informace, udělal jsem, že kompletní bolest číst.

Takže zapomeňte na zápis. Zapomeňte na speciální předpony, které vždy přidáte. Podle mého názoru by jediným skutečným vodítkem mělo být:

Názvy proměnných udržujte co nejkratší , podle potřeby smysluplné a vždy jednoznačný .

6
ErikE

V objektově orientovaném jazyce to nedává smysl - všechno je typ, který je patrný při pokusu o jeho použití.

6
billy.bob

Jediné místo, kde je maďarština varováno, je slabý typ jazyka, jako je C. Je to dvojnásob důležité s C, protože neexistuje žádný explicitní objekt (má strukturu , ale všechny funkce jsou mimo strukturu). V něčím silnějším, jako je C++, Java a C #, to nepomůže, a ve skutečnosti to zhoršuje. Změny kódu a je mnohem snazší změnit typ, než je změnit všechna místa, která používáte název proměnné. Je to také zbytečná práce, která má tendenci se ignorovat.

Máte-li měrné jednotky, může to pomoci kódovat to ve jménu - ale nakonec to může být také další šum. Například prohlásíme standardní měrnou jednotku pro různé věci, se kterými v našem kódu pracujeme. Používáme například přechody nebo stupně, metry nebo stopy, rámy nebo milisekundy? Jakmile je standard nastaven na kód, kdykoli čteme v jedné měrné jednotce, vždy převedeme okamžitě na standardní měrnou jednotku pro kód.

Moje rada: Začněte s aktuálními body bolesti a vyberte přiměřenou normu pro tuto část kódu. Nadměrná specifikace kódovacího standardu je kontraproduktivní. Je velmi důležité mít názvy proměnných a polí, které uvádějí, co představují, a většinu času můžete typ bezpečně odvodit z konceptu.

6
Berin Loritsch

Účel identifikátoru je důležitější než jeho typ. Pokud ve svých programech používáte popisné názvy pro identifikátory, nemusíte používat maďarské notace. isConnected je vždy čitelnější a srozumitelnější než boolConnected.

5
Mudassir

Použili jsme maďarský zpět, když jsem byl programátorem C++, a bylo to skvělé. Typ proměnné (např. BSTR, CString, LPCTSTR nebo char *) můžete vidět bez hledání deklarace. V těchto dnech byste hledali prohlášení provedením:

  1. ctrl-home
  2. ctrl-F
  3. název proměnné
  4. vstoupit

Takže na tom záleželo docela dost. Ale někde kolem roku 2000 se stalo několik věcí:

  • editory se staly dostatečně inteligentní, aby zobrazovaly typ proměnné jako popis
  • editoři měli zkratku „Přejít na deklaraci“ a rychlý způsob, jak se vrátit zpět
  • C++ se používalo méně a většina ostatních jazyků měla méně proměnných typů. Například v C # jste si jisti, že lastName je System.String, protože existuje pouze jedna třída řetězců.

Byl jsem jedním z posledních, který se přepnul z maďarštiny, a když jsem si přečetl starý zdrojový kód, ve skutečnosti mě to otrávilo.

2
Andomar

Nenávidím maďarský zápis, raději používám podtržítka k vymezení názvů proměnných.

Kromě toho, když vložíte typ jako první písmeno na začátek názvu vaší proměnné, jako je tento: float fvelocity; vect vDirection; string ** ppszWord;

automatické doplňování je všechny třídí a máte potíže s hledáním toho, co chcete, a lidé mají tendenci používat to, co považují za lepší, a už to není notace.

Jen ráda píšu ThingsLikeThat, když musím být o proměnné velmi popisný, protože šetří místo a skutečnost, že existují čepice, ji činí čitelnější.

Obvykle dělám své metody a třídy s tím, že první písmeno je Velká a malá písmena pro názvy proměnných a podtržítko pro názvy proměnných (toto poslední považuji za užitečné).

Vážně dávám přednost lidem, aby se o tato pravidla starali: Použijte čárky, aritmetiku a rovnátka s příslušnými mezerami:

void f(int a, char b);
int a = b + 4 / (3 + 4);

Ne více než 80 znaků na řádek, nebo AT NEJLEPŠÍCH 90 znaků, použijte víceřádkové argumenty pro funkce nebo dlouhé if:

if
(
    checkthat(a, b) == checkthis(b, d) &&
    checkthat(d, b) == checkthis(v, d)
)
2
jokoon

Souhlasím s většinou, je to starý styl.

U moderních IDE vám rychlý ukazatel nad proměnnou ukáže typ.

1
ozz