Prznenie C++ Microsoftom - Hungarian notation

Prznenie C++ Microsoftom - Hungarian notation
« kdy: 02. 04. 2020, 19:20:57 »
Prosím Vás viete mi vysvetliť aký dôvod má používanie Maďarskej notácie? (Pred názvom identifikátoru skrátený názov typu)

A prečo si Microsoft robí z C++ ...Pascal?

Pri Windows API a MFC všetko čo sa dá premenuje nejakým nezmyselným aliasom, ktorý vyzerá ako z čias MS-DOSu a  Turbo Pascalu.

Napr. "unsigned long" premenuje na pascalovský DWORD (double word), wchar_t* na PCWSTR a const wchar_t* na LPCWSTR a podobne. Neviem či sa mám z toho smiať či plakať. Má to nejaký hlbší význam (ak áno tak aký?) alebo to robí len tak samoúčelne aby nasral vývojárov?

A prečo názvy typov používa všetko veľkým písmenom? potom si myslím že ide o konštanty, chce tým nebodaj MS pritiahnuť vývojárov COBOLU?


alex6bbc

  • *****
  • 1 431
    • Zobrazit profil
    • E-mail
Re:Prznenie C++ Microsoftom - Hungarian notation
« Odpověď #1 kdy: 02. 04. 2020, 19:29:56 »
Ja myslim, ze madarska notace pochazi z dob Win32 API a jedine tam to jeste preziva.
Ze v novejsich systemech (MFC, C#) uz se to nepouziva.

je to hnus a taky se mi to nelibi, ale uz je to historie.

Re:Prznenie C++ Microsoftom - Hungarian notation
« Odpověď #2 kdy: 02. 04. 2020, 19:45:56 »
Citace
Pri Windows API a MFC všetko čo sa dá premenuje nejakým nezmyselným aliasom, ktorý vyzerá ako z čias MS-DOSu a  Turbo Pascalu.
Však Windows API je tak staré, že "z čias MS-DOSu" v zásadě pochází. Všimněte si třeba oblíbeného prefixu LP u typů ukazatelů, tzn. long pointerů (či far pointerů). V době chráněného režimu to nic neznamená, ale v době Win 3.x existovaly ukazatele "krátké" (v rámci segmentu) či "dlouhé/daleké" (segment i offset).

Osobně mám MS pojetí maďarské notace u názvů funkcí raději než jiné (pomlčky či žádné oddělovače). Lépe se to čte, protože člověk jasně vidí rozhranní slov (existují samozřejmě výjimky).

Prefixy u názvů parametrů mi přijdou zbytečné. Možná to mělo nějaký význam v minulosti (pokud takto měla pojmenované parametry každá funkce, nebylo nutné parsovat často jejich typ). A třeba v kernelovém API (jakože v jádře) se myslím vůbec nevyskytují (doba Windows 2000+).

Také bych spíše mluvil o C, ne o C++.

qelurg

  • ****
  • 372
    • Zobrazit profil
    • E-mail
Re:Prznenie C++ Microsoftom - Hungarian notation
« Odpověď #3 kdy: 02. 04. 2020, 20:14:49 »
Cílem bylo snížit chybovost programátorů, přinést větší srozumitelnost api a zdrojových kódů skrze jednotný standard.

Re:Prznenie C++ Microsoftom - Hungarian notation
« Odpověď #4 kdy: 02. 04. 2020, 21:57:46 »
Kód: [Vybrat]
typedef int INT;
typedef LONG HRESULT;

Jestli tohle někomu přináší větší srozumitelnost tak asi bere nějaké drogy. Já bych tohle nevymyslel ani se 4 pivama.


BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:Prznenie C++ Microsoftom - Hungarian notation
« Odpověď #5 kdy: 02. 04. 2020, 22:01:16 »
Ja myslim, ze madarska notace pochazi z dob Win32 API a jedine tam to jeste preziva.
Ze v novejsich systemech (MFC, C#) uz se to nepouziva.

je to hnus a taky se mi to nelibi, ale uz je to historie.

Je to historie. MS se snaží to trochu krotit, ale těžko přepsat veškerou codebase, a že ji má fakt velkou.

Kód: [Vybrat]
typedef int INT;
typedef LONG HRESULT;

Jestli tohle někomu přináší větší srozumitelnost tak asi bere nějaké drogy. Já bych tohle nevymyslel ani se 4 pivama.
Svého času s v C typy psaly kapitálkama. Až časem se tento úzus přesunul na konstanty. A dneska je to opět trochu jinde.

Re:Prznenie C++ Microsoftom - Hungarian notation
« Odpověď #6 kdy: 02. 04. 2020, 22:38:22 »
Vendor lock-in.

alex6bbc

  • *****
  • 1 431
    • Zobrazit profil
    • E-mail
Re:Prznenie C++ Microsoftom - Hungarian notation
« Odpověď #7 kdy: 02. 04. 2020, 23:36:45 »
hele to by mohlo byt zajimave:

int 8 bitu
Int 16 bitu
INt 32 bitu
INT 64 bitu

alex6bbc

  • *****
  • 1 431
    • Zobrazit profil
    • E-mail
Re:Prznenie C++ Microsoftom - Hungarian notation
« Odpověď #8 kdy: 02. 04. 2020, 23:38:35 »
mate radsi franta_pepa_jednicka nebo frantaPepaJednicka nebo snad FrantaPepaJednicka.

pro nejvetsi frajery frAnTa_PepA_JeDNIcka :-)

qelurg

  • ****
  • 372
    • Zobrazit profil
    • E-mail
Re:Prznenie C++ Microsoftom - Hungarian notation
« Odpověď #9 kdy: 03. 04. 2020, 00:09:26 »
Kód: [Vybrat]
typedef int INT;
typedef LONG HRESULT;

Jestli tohle někomu přináší větší srozumitelnost tak asi bere nějaké drogy. Já bych tohle nevymyslel ani se 4 pivama.
Tak tohle už není  maďarská notace, tohle se dělalo kvůli snazší přenositelnosti/upravitelnosti. Když jsi se rozhodl upravit typ, stačilo to udělat na jednom místě.

qelurg

  • ****
  • 372
    • Zobrazit profil
    • E-mail
Re:Prznenie C++ Microsoftom - Hungarian notation
« Odpověď #10 kdy: 03. 04. 2020, 00:12:27 »
mate radsi franta_pepa_jednicka nebo frantaPepaJednicka nebo snad FrantaPepaJednicka.

pro nejvetsi frajery frAnTa_PepA_JeDNIcka :-)
To prvni pouzivam na promenne, to druhe na funkce, to treti na tridy a v trochu umirnenejsi verzi to ctvrte u jazyku, ktere nemaji jmenne prostory.

xyz

  • ***
  • 200
    • Zobrazit profil
Re:Prznenie C++ Microsoftom - Hungarian notation
« Odpověď #11 kdy: 03. 04. 2020, 00:20:29 »
To vzniklo dokonce uz v 80. letech, kdy jeste neexistovaly poradne IDE a kod se psal v textovem editoru a pokud byly metody a kod slozitejsi, tak to umoznovalo se vyznat v typu. Navic to ti programatori jeste blbe pochopili, nemelo se to pouzivat pro jednoduche typy, ale rozlezlo se to vsude. Jsou o tom clanky na webu.

Dnes je to historie a nemelo by se to pouzivat. Typ mne ukazuje IDE.

qelurg

  • ****
  • 372
    • Zobrazit profil
    • E-mail
Re:Prznenie C++ Microsoftom - Hungarian notation
« Odpověď #12 kdy: 03. 04. 2020, 06:46:40 »
To vzniklo dokonce uz v 80. letech, kdy jeste neexistovaly poradne IDE a kod se psal v textovem editoru a pokud byly metody a kod slozitejsi, tak to umoznovalo se vyznat v typu. Navic to ti programatori jeste blbe pochopili, nemelo se to pouzivat pro jednoduche typy, ale rozlezlo se to vsude. Jsou o tom clanky na webu.

Dnes je to historie a nemelo by se to pouzivat. Typ mne ukazuje IDE.
Ne každý používá ide a také je rozdíl mít možnost se dotázat jednotlivě na typ v ide a druhá vidět u všech proměnných ten typ v algoritmu současně. Ve složitějších algoritmech se spoustou proměnných to je stále dobrá pomůcka pro lepší srozumitelnost kódu.

Kvalitní název proměnné je k nezaplacení. Lze to používat i více abstraktně, než jen na datové typy. Třeba já jsem si zvykl v JS dávat předponu el u všech proměnných, které odkazují na nějaký html element a els u proměnných, které odkazují na jejich kolekci.

Je to užitečné navzdory tomu, že si v debuggeru mohu na každou proměnnou kliknout a podívat se co obsahuje. Konec konců, můžu tam mít chybu a může obsahovat i něco jiného než má, takže je to naopak nápověda k tomu, že je někde něco špatně. Navíc, když ten debugger v prohlížeči zrovna neběží, neukazuje nic, přesto v něm můžeš koukat do zdrojáků. Takže já to za překonané a 'nemělo by se to používat' nepovažuji.

U vlastního kódu si to člověk udělá po svém, ale když pak trasuješ kód nějaké knihovny a chceš si ji třeba přizpůsobit, je to k nezaplacení. Viz obtížnost pochopit minifikovaný javascript.

Re:Prznenie C++ Microsoftom - Hungarian notation
« Odpověď #13 kdy: 03. 04. 2020, 09:31:27 »
Navic to ti programatori jeste blbe pochopili, nemelo se to pouzivat pro jednoduche typy, ale rozlezlo se to vsude.
Dnes je to historie a nemelo by se to pouzivat. Typ mne ukazuje IDE.

Je to ještě horší, nemělo se to vůbec používat na datové typy. Mělo se to používat na kontext. Například sText vs. usText (safe vs. unsafe).

Doporučuju přečíst https://www.joelonsoftware.com/2005/05/11/making-wrong-code-look-wrong/

Můžete přeskočit pár kapitol a začít u "I'm hungary".

Ne každý používá ide a také je rozdíl mít možnost se dotázat jednotlivě na typ v ide a druhá vidět u všech proměnných ten typ v algoritmu současně. Ve složitějších algoritmech se spoustou proměnných to je stále dobrá pomůcka pro lepší srozumitelnost kódu.

Kvalitní název proměnné je k nezaplacení. Lze to používat i více abstraktně, než jen na datové typy. Třeba já jsem si zvykl v JS dávat předponu el u všech proměnných, které odkazují na nějaký html element a els u proměnných, které odkazují na jejich kolekci.

Kvalitní název proměnné je důležitý, ale datový typ na každém řádku C/C++ opravdu nepotřebujete. Ta prefixová (maďarská notace) idea vznikla v týmu pro Word a používala se pro kontextové rozlišení proměnných. Typicky totiž pracovali se souřadnicemi v několika soustavách (okno, dokument, obrazovka).

A "System hungarian" notace to nejenže začala používat pro jednoduché typy, ale navíc zmizel i ten kontext! Takže to bylo zhoršení po všech stránkách.

V Javascriptu to může pořád být užitečné, protože je to hodně dynamický jazyk. Ale univerzálně to neplatí. A tazatel se ptá právě na použití v kontextu Windows, kde tu ideu někdo velice špatně pochopil.

qelurg

  • ****
  • 372
    • Zobrazit profil
    • E-mail
Re:Prznenie C++ Microsoftom - Hungarian notation
« Odpověď #14 kdy: 03. 04. 2020, 09:58:38 »
Ne každý používá ide a také je rozdíl mít možnost se dotázat jednotlivě na typ v ide a druhá vidět u všech proměnných ten typ v algoritmu současně. Ve složitějších algoritmech se spoustou proměnných to je stále dobrá pomůcka pro lepší srozumitelnost kódu.

Kvalitní název proměnné je k nezaplacení. Lze to používat i více abstraktně, než jen na datové typy. Třeba já jsem si zvykl v JS dávat předponu el u všech proměnných, které odkazují na nějaký html element a els u proměnných, které odkazují na jejich kolekci.

Kvalitní název proměnné je důležitý, ale datový typ na každém řádku C/C++ opravdu nepotřebujete. Ta prefixová (maďarská notace) idea vznikla v týmu pro Word a používala se pro kontextové rozlišení proměnných. Typicky totiž pracovali se souřadnicemi v několika soustavách (okno, dokument, obrazovka).

A "System hungarian" notace to nejenže začala používat pro jednoduché typy, ale navíc zmizel i ten kontext! Takže to bylo zhoršení po všech stránkách.

V Javascriptu to může pořád být užitečné, protože je to hodně dynamický jazyk. Ale univerzálně to neplatí. A tazatel se ptá právě na použití v kontextu Windows, kde tu ideu někdo velice špatně pochopil.

Také záleží na dalších okolnostech. Ve funkci, která má pár řádků a krátkou životnost je to jiné, než u proměnných, které mají dlouhou životnost a objevují se na různých místech programu. Rozlišování datových typů se hodí hlavně tam, kde pracuji se stejným obsahem, ale s různými datovými typy. Jr to potřeba brát s rozumem, používat to tam, kde to má přínos. Ale chápu potřebu molocha, jako je microsoft, že se snaží mít jednotné api napříč projektem, na kterém pracují stovky lidí. Tam je třeba disciplinovanost, byť je občas ne zcela smyslná. Kdo si vzpomíná na rané verze php, ten ví, tam to byl pěkný kočkopes, jak v názvech, tak třeba v pořadí parametrů. A výsledkem byla zbytečně vyšší chybovost.