Яке звернення до системи Угорська? [зачинено]


18

У яких рекомендаціях щодо іменування ви дотримуєтесь? , автор каже:

Також я вважаю за краще використовувати код угорських позначень від Чарльза Симоні.

Я зіткнувся з кількома програмістами, які все ще вважають за краще використовувати угорську, переважно в угорському стилі Petzold / Systems. Подумайте dwLength = strlen(lpszName).

Я читав "Неправильний код виглядає невірно" і розумію обґрунтування угорської програми, де інформація про тип домену міститься в назвах змінних. Але я не розумію значення прикріплення типу компілятора до імені.

Чому програмісти все ще наполягають на використанні цього стилю позначення? Це просто інерція? Чи є якісь переваги, які переважують зниження читабельності? Люди просто вчаться ігнорувати декораторів під час читання коду, і якщо так, то як вони продовжують додавати вартість?

EDIT: Дуже багато відповідей пояснюють історію, або чому вона більше не актуальна, обидві вони висвітлені в статті, яку я цитував.

Мені дуже хотілося б почути від когось там, хто все ще користується цим. Для чого ти його використовуєш? Це у вашому стандарті? Чи використовуєте ви його, якщо цього не потрібно? Ви б використали його для нового проекту? Які ви бачите переваги?


5
Угорська нотація викликала всю гнів, коли я починав займатися інформаційними технологіями, але це було повністю кодує середовище. Простий текстовий редактор, без підсвічування синтаксису, файлів intellisense та коду, де довжина декількох сотень рядків із усіма змінними, оголошеними на початку. Це просто полегшило життя в розробці того, з чим ви мали справу. Однак із сучасними інструментами та практикою потреба в цьому з'явилася в моєму варіанті, і це дійсно має бути
віднесено

1
Я використовував це років тому і ніколи не любив це дуже. Я цього зовсім не сумую.
MetalMikester

Найбільшою проблемою в них було використання префіксів, а не суфіксів - навіть у програмах угорщини 'wart' зазвичай містить менш семантичну інформацію, ніж решта імені
jk.

Відповіді:


38

На даний момент я все ще вживаю угорську з точно трьох причин , розумно уникаючи її для всього іншого:

  1. Щоб відповідати існуючій кодовій базі при технічному обслуговуванні.
  2. Для контролю, наприклад. "txtFirstName". Нам часто потрібно розрізняти (скажімо) значення "firstName" і "firstName" управління. Угорська надає зручний спосіб зробити це. Звичайно, я міг би набрати "firstNameTextBox", але "txtFirstName" так само легко зрозуміти і має менше символів. Більше того, за допомогою угорської мови засоби керування одного типу легко знайти, і вони часто групуються за назвою в IDE.
  3. Коли дві змінні містять однакове значення, але відрізняються за типом. Наприклад, "strValue" для значення, фактично набраного користувачем, і "intValue" для того самого значення, як тільки воно було проаналізовано, як у цілому.

Я, звичайно, не хотів би формулювати свої ідеї як найкращу практику, але я дотримуюся цих правил, оскільки досвід говорить про те, що час від часу використання угорських переваг кодує ремонтопридатність, але коштує мало. Однак, я постійно переглядаю свою власну практику, тому я можу зробити щось інше в міру розвитку моїх ідей.


Оновлення:

Я щойно прочитав проникливу статтю Еріка Ліпперта, в якій пояснюється, як угорська може допомогти зробити неправильний код невірним. Ну варто прочитати.


Відмінна відповідь, світляк відповідає на поставлене запитання.
AShelly

щойно помітив творче редагування мого iphone ... gsub ("світлячок", "повністю");
AShelly

5
+1 для використання квазі-угорської для полегшення групування елементів управління інтерфейсом у IDE. Це єдине використання, яке досі має сенс для нових проектів, і я просто не міг жити без нього. Я часто знаю, що елемент керування - це текстове поле, але не знаю, чи називається він "FirstName" або просто "Name".
Коді Грей

2
Я згоден на цю відповідь. Щодо використання intValue та strValue, ви також можете бачити це як valueAsInt та valueAsStr, тому я не знаю, чи вважаю це угорське позначення, він більше схожий на те, що int та str є частиною назви змінної.
Мішель Кейзерс

2
2 Я віддаю перевагу повним суфіксам, оскільки префікси можуть отримати досить нерозумно (що таке a tssbчи так tsddi? Так, вони існують). Скорочення також мають проблеми однорідності, приймаючи TextBoxтам може бути неузгодженість про це tbабо txt(я особисто бачив «старший» використовувати Dev як на одному вікні). Для 3 я скидаю угорську, коли змінна досягне свого кінцевого призначеного типу (наприклад, я б використовував valueі strValueу вашому прикладі).
Джонатан Дікінсон

6

Я не великий прихильник використання угорської нотації, але думаю так:

  • Ми також можемо помітити, що швидше знайти рядок, що посилається на TextBox у вашому коді: ввівши "txt" у вікні пошуку.

Не уявляйте навпаки, де кожен елемент має своє ім’я. Вам може бути повільніше знаходити, куди ви хочете піти, правда?

Те ж саме стосується і DDL, коли ми хочемо звернутися до DropDownList, легше чи ні? :)

Люди не витратять стільки часу, щоб знайти, де цей елемент.

Використання префікса не підходить для сучасних компіляторів мов, таких як C #, але воно є корисним (для читання) для людей.


Це найкращий приклад його практичної цінності, який я чув. (Але все одно недостатньо, щоб змусити його прийняти :)
AShelly

1
Префікси ніколи не були для компіляторів, завжди для людей. Що змінилося - це не компілятори, а IDE, які надають інформацію про тип та більш ефективні способи навігації коду.
Джеремі

Я буду робити те ж саме зі змінними та (особливо) віджетами - часто даючи їм короткі префікси для позначення їх типу. Але не до того, щоб на них виходив "повний угорський".
GrandmasterB

4

Угорські програми (теги для позначення семантичних властивостей об'єктів, які неможливо виразити через систему типів) були розумним способом боротьби з деякими поширеними помилками при використанні слабо типізованих мов початку 1980-х. Вони мало виконують цілі в сучасних сильно набраних мовах.

Системи угорської мови (теги для надмірного позначення оголошеного типу об'єкта) ніколи не виконували жодної мети, крім накладення поверхнево рівномірного вигляду на основі коду. Він був створений та розповсюджений нетехнічними менеджерами та недосвідченими програмістами, які неправильно зрозуміли наміри угорської програми Apps і вважали, що якість коду може бути покращена складними вказівками щодо кодування.

Обидва стилі виникли в Microsoft. У ці дні у конвенціях Microsoft про іменування категорично йдеться про "не використовувати угорські позначення".


4

Якщо ви знайдете правильну систему префіксів, ви можете поширити зношеність своїх клавіш, що зменшить витрати на заміну клавіатур.


Я думаю, що я міг би розширити це. Я використовував SH на своєму робочому місці протягом останніх, о, десять років або близько того (тому що це є в нашому Стандарті). Це ніколи не допомагало вирішити проблему.

З іншого боку, я використовував неприховані, але добре названі змінні у своєму домашньому коді майже однаково довго. Я ніколи не пропускав SH.

В обох місцях я написав код протоколу, який вимагає примітивних типів фіксованого розміру. Це найвигідніший випадок використання, який я можу придумати для SH. Це не допомогло мені сказати, коли я пишу з SH, і не завадило мені, коли я написав без SH.

Отже, на закінчення, єдина різниця, яку я бачу, - це зношеність вашої клавіатури.


1
як сарказм там :)
JohnL

4

Я фактично почав використовувати SH в новому коді, який я написав цього місяця.

Моє завдання передбачало переписання деякого коду Perl в JS, щоб його можна було перемістити на клієнтську частину нашого веб-додатку. У Perl SH зазвичай не потрібні через сигіли ($ string, @array,% хеш).

У JavaScript я виявив, що SH є безцінним для відстеження типів структур даних. Наприклад,

var oRowData = aoTableData[iRow];

Це отримує об'єкт з масиву об'єктів за допомогою цілого індексу. Дотримання цієї конвенції дозволило мені досить довго шукати типи даних. Крім того, ви можете перевантажувати стислі імена змінних ( oRowпроти iRow).

tl; dr: SH може бути чудовим, якщо у вас складний код слабко набраною мовою. Але якщо ваш IDE може відстежувати типи, віддайте перевагу цьому.


2

Мені також цікаво бачити обґрунтування. Ми знаємо, чому вони використовували його в минулому: відсутність підтримки IDE для інформації про тип. Але тепер? Простіше кажучи, я думаю, що це традиція. Код C ++ завжди виглядав так, тож навіщо змінювати речі? Крім того, коли ви будуєте поверх попереднього коду, який використовував угорські позначення, це виглядало б досить дивно, коли ви раптом перестанете використовувати це ...


2
Код C ++ не завжди виглядав так - перевірте книгу Bjarne Stroustrup.
JBRWilkinson

@JBRWilkinson: Чарльз Симоні створив угорську нотацію близько 1976 року ( c2.com/cgi/wiki?HungarianNotation ). Тож ця позначення насправді передує C ++. Багато з них, якщо не більшість програмістів на C ++, використовують його з першого дня (тобто їх кодування). Я розумію, що Bjarne Stroustrup є помітним винятком, як і Лінус Торвальдс, але це не змінює фактів.
Paweł Dyda

2
Я думаю, що угорська завжди була насамперед справою Microsoft. Я не бачив, щоб він використовувався дуже багато в Unix та Unix-подібних середовищах.
Девід Торнлі

2

Поняття "Угорська Угорщина" насправді було певним підходом, нерозумінням поняття "тип". Розробники систем сприйняли це буквально як тип компілятора (слово, байт, рядок, ...) на відміну від типу домену додатків (індекс рядків, індекс стовпців, ...).

Але я здогадуюсь, що кожен розробник проходить декілька фаз стилю, які в той час здаються чудовою ідеєю (а тип префіксації здається початківцю хорошою ідеєю), перш ніж потрапляти в підводні камені (змінюючи тип, створюючи нові, значущі префікси, тощо). Тож я думаю, що є інертність: від розробників, які не покращуються і розуміють, чому це поганий вибір, від розробників, що дотримуються стандартів кодування, які доручають практиці та людям, які використовують <windows.h>. Microsoft буде занадто дорогим для зміни, щоб позбутися позначень префікса (що в багатьох місцях є неправильним: WPARAM?).


1
Навіть призначене використання є менш оптимальним, оскільки воно створює систему приватного типу, про яку компілятор не знає, і тому не може перевірити тип.
Ларрі Коулман

@Larry: Хоча це, безумовно, правда, є програмне забезпечення, яке може проаналізувати вихідний код і перевірити відповідність коду стандарту. Вони можуть бути в змозі забезпечити збіг префіксів у виразах.
Skizz

1
Мій ідеал при використанні статичного введення тексту полягає в тому, щоб набір типів компілятора був надмножиною набору типів доменів. Тоді компілятор може перевірити все, додатки не потрібні.
Ларрі Коулман

0

Є одне, чого не вистачає людям з угорською. Угорська нотація насправді працює ВЕЛИКО з автозаповненням.

Скажімо, у вас є змінна, а ім'я - intHeightOfMonster.

Скажіть, ви забули ім’я змінної

Це може бути висотаOfMonster або MonsterHeight або MeasurementMonsterHeight

Ви хочете мати можливість вводити букву та отримувати автозаповнення, пропонуючи вам кілька імен змінних.

Знаючи, що heightOfMonster є цілим, ви просто набираєте i і voila.

Економити час.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.