Венгерская нотация
Венге́рская нота́ция в программировании — соглашение об именовании переменных, констант и прочих идентификаторов в коде программ. Своё название венгерская нотация получила благодаря программисту компании Microsoft венгерского происхождения Чарльзу Симони, Шимоньи Карой), предложившему её ещё во времена разработки первых версий MS-DOS. Эта система стала внутренним стандартом «Майкрософт».
История
Изобретение нотации приписывают программисту венгерского происхождения Чарльзу Шимоньи (венг. Simonyi Károly, Ши́моньи Ка́рой), который в 1972—1981 годах работал в Xerox PARC года, а позднее — в Microsoft, где руководил, в частности, разработкой Microsoft Word. Венгерской нотацию стали называть из-за страны происхождения Шимоньи, а также потому, что код «выглядел, как будто он написан на нечитаемом иностранном языке», со слов Энди Хетцфельда.Венгерский язык и в самом деле непривычен для англоговорящих, потому что относится к финно-угорским языкам, далёким от привычных индоевропейских.
Правила
В венгерской нотации имена идентификаторов предваряются заранее оговоренными префиксами, состоящими из одного или нескольких символов. При этом, как правило, ни само наличие префиксов, ни их написание не являются требованием языков программирования, и у каждого программиста (или коллектива программистов) они могут быть своими.
Применяемая система префиксов зависит от многих факторов:
- языка программирования (чем более «либеральный» синтаксис, тем больше контроля требуется со стороны программиста, а значит, тем более развита система префиксов. К тому же использование в каждом из языков программирования своей терминологии также вносит особенности в выбор префиксов);
- стиля программирования (объектно-ориентированный код может вообще не требовать префиксов, в то время как в «монолитном» для разборчивости они зачастую нужны);
- предметной области (например, префиксы могут применяться для записи единиц измерения);
- доступных средств автоматизации (генератор документации, навигация по коду, предиктивный ввод текста, автоматизированный рефакторинг и т. д.).
Префиксы, задающие тип
| Префикс | Сокращение от | Смысл | Пример |
|---|---|---|---|
| s | string | строка | sClientName |
| sz | zero-terminated string | строка, ограниченная нулевым символом | szClientName |
| n, i | int | целочисленная переменная | nSize, iSize |
| f | float | число с плавающей запятой | fValue |
| l | long | длинное целое | lAmount |
| b | boolean | булева переменная | bIsEmpty |
| a | array | массив | aDimensions |
| t, dt | time, datetime | время, дата и время | tDelivery, dtDelivery |
| p | pointer | указатель | pBox |
| lp | long pointer | двойной (дальний) указатель | lpBox |
| r | reference | ссылка | rBoxes |
| h | handle | дескриптор | hWindow |
| m_ | member | переменная-член | m_sAddress |
| g_ | global | глобальная переменная | g_nSpeed |
| C | class | класс | CString |
| T | type | тип | TObject |
| I | interface | интерфейс | IDispatch |
| v | void | отсутствие типа | vReserved |
Как видно в приведённом примере, префикс может быть и составным. Например, для именования строковой переменной-члена класса использована комбинация префиксов «m_» и «s» (m_sAddress).
Семантические префиксы
Венгерская нотация для приложений[источник не указан 3273 дня]:
| Префикс | Сокращение от | Смысл | Пример |
|---|---|---|---|
| i | index | Индекс | int ix; Array[ix] = 10; |
| d | delta | Разница между значениями | int a, b; ... dba = b - a; |
| n | number | Количество | size_t nFound = 0; |
| a | argument | Аргумент | SomeClass::SomeClass(int aX) : x(aX) {} |
| I | interface | Интерфейс (в имени типа) | interface IFactory {} |
За и против
В разделе не хватает ссылок на источники (см. рекомендации по поиску). |
Среди программистов есть как сторонники, так и противники использования венгерской нотации. Противники утверждают, что она громоздка и лишь ухудшает понимание кода. Сторонники утверждают, что слишком многие неверно понимают основную идею и неправильно пользуются нотацией.
Преимущества
- Если встроенного механизма типизации не хватает, венгерская нотация позволяет записывать [англ.] переменной — например,
int cPriceможет означать, что переменная имеет не просто целый тип, а валютный (currency). Именно такое применение префиксов было предложено Симони. Это может пригодиться:- В низкоуровневом программировании (когда набор доступных типов настолько узок, что, например, целый тип не отличается от булевого).
- В языках с динамической типизацией, например PHP, где одна и та же переменная может хранить значения любого типа.
- В инженерных расчётах (для записи единиц измерения). Это позволяет избавиться от немалого количества ошибок простым подсчётом размерностей.
- В других местах, где переменные одного и того же типа предназначены для хранения разнородных данных — например, в коде защиты от компьютерных взломщиков префикс может указывать на «необработанные» и «экранированные» данные (SQL-инъекция, XSS).
- Венгерская нотация удобна для написания больших программ в неполнофункциональных (по современным меркам) редакторах без автоматизированной навигации по тексту. Скорее всего, именно поэтому она стала стандартным стилем кода в WinAPI.
- Венгерскую нотацию можно рассматривать как стандартную систему сокращений. Например, поле ввода для поиска и кнопка «Поиск» могут именоваться как
txtSearchиbtnSearch; количество людей можно записать какmanCountилиnMen. Такая практика позволяет делать названия переменных короткими и в то же время осмысленными. - Решает конфликты идентификаторов:
Point::Point(int aX, int aY) : x(aX), y(aY) {}.
Этот стиль выбора имён называется «венгерской» записью по названию родины руководителя отдела программирования Microsoft Чарльза Симони, который его изобрёл. (А не потому, что его использование придаёт программам такой вид, будто они написаны на венгерском языке)
Недостатки
- Некоторые программисты считают, что использование префиксов делает имена переменных менее понятными и, таким образом, ухудшает читаемость кода[неавторитетный источник].
- Если неизвестно имя переменной без префиксов, подчас трудно восстановить её префиксы.
- Система автодокументации, если она не понимает системы префиксов, отсортирует алфавитный список по префиксу, что может отрицательно сказаться на качестве документации. Впрочем, имена функций обычно префиксами не снабжают.
- Запись нескольких префиксов из-за частого использования заглавных букв и знаков подчёркивания может стать «пляской на кнопке ⇧ Shift».
- Средства навигации, которые включены в современные редакторы кода, и так позволяют видеть тип любой переменной и быстро переходить к точке, где она определена — то есть, использование префиксов может быть избыточным.
- При изменении типа потребуется изменять имя переменной (не все редакторы кода могут делать это автоматически)[неавторитетный источник].
- Существуют и другие средства задания типа переменной в её имени: например, слова is, has и т. д. для булевского типа (
IsLoggedIn), count для счётчика (RefCount), множественное число для массива (UserIds). В языках, в которых заглавные буквы не эквивалентны строчным, также может кодировать что-либо.
Известный противник венгерской нотации — Линус Торвальдс: «Вписывание типа переменной в её имя (так называемая венгерская нотация) ущербно — компилятор и так знает типы и может проверить их, и это запутывает программиста».
См. также
- Стандарт оформления кода
Примечания
- Charles Simonyi. Hungarian Notation. Дата обращения: 29 июня 2024. Архивировано 29 июня 2024 года.
- Anything You Can Do, I Can Do Meta Архивировано 20 сентября 2020 года. MIT Technology Review
- Джоэл Спольски. Making Wrong Code Look Wrong Архивная копия от 29 июня 2024 на Wayback Machine
- Венгерский язык, хоть и имеет латинский алфавит, считается крайне неудобочитаемым для неосведомлённых.
- Венгерская нотация. Inside C++. Дата обращения: 12 ноября 2008. Архивировано из оригинала 30 октября 2008 года.
- «Linux kernel coding style» Архивировано 23 сентября 2005 года.. Документация по ядру Linux (на английском).
Википедия, чтение, книга, библиотека, поиск, нажмите, истории, книги, статьи, wikipedia, учить, информация, история, скачать, скачать бесплатно, mp3, видео, mp4, 3gp, jpg, jpeg, gif, png, картинка, музыка, песня, фильм, игра, игры, мобильный, телефон, Android, iOS, apple, мобильный телефон, Samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Сеть, компьютер, Информация о Венгерская нотация, Что такое Венгерская нотация? Что означает Венгерская нотация?
Venge rskaya nota ciya v programmirovanii soglashenie ob imenovanii peremennyh konstant i prochih identifikatorov v kode programm Svoyo nazvanie vengerskaya notaciya poluchila blagodarya programmistu kompanii Microsoft vengerskogo proishozhdeniya Charlzu Simoni Shimoni Karoj predlozhivshemu eyo eshyo vo vremena razrabotki pervyh versij MS DOS Eta sistema stala vnutrennim standartom Majkrosoft IstoriyaIzobretenie notacii pripisyvayut programmistu vengerskogo proishozhdeniya Charlzu Shimoni veng Simonyi Karoly Shi moni Ka roj kotoryj v 1972 1981 godah rabotal v Xerox PARC goda a pozdnee v Microsoft gde rukovodil v chastnosti razrabotkoj Microsoft Word Vengerskoj notaciyu stali nazyvat iz za strany proishozhdeniya Shimoni a takzhe potomu chto kod vyglyadel kak budto on napisan na nechitaemom inostrannom yazyke so slov Endi Hetcfelda Vengerskij yazyk i v samom dele neprivychen dlya anglogovoryashih potomu chto otnositsya k finno ugorskim yazykam dalyokim ot privychnyh indoevropejskih PravilaV vengerskoj notacii imena identifikatorov predvaryayutsya zaranee ogovorennymi prefiksami sostoyashimi iz odnogo ili neskolkih simvolov Pri etom kak pravilo ni samo nalichie prefiksov ni ih napisanie ne yavlyayutsya trebovaniem yazykov programmirovaniya i u kazhdogo programmista ili kollektiva programmistov oni mogut byt svoimi Primenyaemaya sistema prefiksov zavisit ot mnogih faktorov yazyka programmirovaniya chem bolee liberalnyj sintaksis tem bolshe kontrolya trebuetsya so storony programmista a znachit tem bolee razvita sistema prefiksov K tomu zhe ispolzovanie v kazhdom iz yazykov programmirovaniya svoej terminologii takzhe vnosit osobennosti v vybor prefiksov stilya programmirovaniya obektno orientirovannyj kod mozhet voobshe ne trebovat prefiksov v to vremya kak v monolitnom dlya razborchivosti oni zachastuyu nuzhny predmetnoj oblasti naprimer prefiksy mogut primenyatsya dlya zapisi edinic izmereniya dostupnyh sredstv avtomatizacii generator dokumentacii navigaciya po kodu prediktivnyj vvod teksta avtomatizirovannyj refaktoring i t d Prefiksy zadayushie tip Prefiks Sokrashenie ot Smysl Primers string stroka sClientNamesz zero terminated string stroka ogranichennaya nulevym simvolom szClientNamen i int celochislennaya peremennaya nSize iSizef float chislo s plavayushej zapyatoj fValuel long dlinnoe celoe lAmountb boolean buleva peremennaya bIsEmptya array massiv aDimensionst dt time datetime vremya data i vremya tDelivery dtDeliveryp pointer ukazatel pBoxlp long pointer dvojnoj dalnij ukazatel lpBoxr reference ssylka rBoxesh handle deskriptor hWindowm member peremennaya chlen m sAddressg global globalnaya peremennaya g nSpeedC class klass CStringT type tip TObjectI interface interfejs IDispatchv void otsutstvie tipa vReserved Kak vidno v privedyonnom primere prefiks mozhet byt i sostavnym Naprimer dlya imenovaniya strokovoj peremennoj chlena klassa ispolzovana kombinaciya prefiksov m i s m sAddress Semanticheskie prefiksy Vengerskaya notaciya dlya prilozhenij istochnik ne ukazan 3273 dnya Prefiks Sokrashenie ot Smysl Primeri index Indeks int ix Array ix 10 d delta Raznica mezhdu znacheniyami int a b dba b a n number Kolichestvo size t nFound 0 a argument Argument SomeClass SomeClass int aX x aX I interface Interfejs v imeni tipa interface IFactory Za i protivV razdele ne hvataet ssylok na istochniki sm rekomendacii po poisku Informaciya dolzhna byt proveryaema inache ona mozhet byt udalena Vy mozhete otredaktirovat statyu dobaviv ssylki na avtoritetnye istochniki v vide snosok 11 aprelya 2024 Sredi programmistov est kak storonniki tak i protivniki ispolzovaniya vengerskoj notacii Protivniki utverzhdayut chto ona gromozdka i lish uhudshaet ponimanie koda Storonniki utverzhdayut chto slishkom mnogie neverno ponimayut osnovnuyu ideyu i nepravilno polzuyutsya notaciej Preimushestva Esli vstroennogo mehanizma tipizacii ne hvataet vengerskaya notaciya pozvolyaet zapisyvat angl peremennoj naprimer int cPrice mozhet oznachat chto peremennaya imeet ne prosto celyj tip a valyutnyj currency Imenno takoe primenenie prefiksov bylo predlozheno Simoni Eto mozhet prigoditsya V nizkourovnevom programmirovanii kogda nabor dostupnyh tipov nastolko uzok chto naprimer celyj tip ne otlichaetsya ot bulevogo V yazykah s dinamicheskoj tipizaciej naprimer PHP gde odna i ta zhe peremennaya mozhet hranit znacheniya lyubogo tipa V inzhenernyh raschyotah dlya zapisi edinic izmereniya Eto pozvolyaet izbavitsya ot nemalogo kolichestva oshibok prostym podschyotom razmernostej V drugih mestah gde peremennye odnogo i togo zhe tipa prednaznacheny dlya hraneniya raznorodnyh dannyh naprimer v kode zashity ot kompyuternyh vzlomshikov prefiks mozhet ukazyvat na neobrabotannye i ekranirovannye dannye SQL inekciya XSS Vengerskaya notaciya udobna dlya napisaniya bolshih programm v nepolnofunkcionalnyh po sovremennym merkam redaktorah bez avtomatizirovannoj navigacii po tekstu Skoree vsego imenno poetomu ona stala standartnym stilem koda v WinAPI Vengerskuyu notaciyu mozhno rassmatrivat kak standartnuyu sistemu sokrashenij Naprimer pole vvoda dlya poiska i knopka Poisk mogut imenovatsya kak txtSearch i btnSearch kolichestvo lyudej mozhno zapisat kak manCount ili nMen Takaya praktika pozvolyaet delat nazvaniya peremennyh korotkimi i v to zhe vremya osmyslennymi Reshaet konflikty identifikatorov span class n Point span span class o span span class n Point span span class p span span class kt int span span class w span span class n aX span span class p span span class w span span class kt int span span class w span span class n aY span span class p span span class w span span class o span span class w span span class n x span span class p span span class n aX span span class p span span class w span span class n y span span class p span span class n aY span span class p span span class w span span class p span Shutka Etot stil vybora imyon nazyvaetsya vengerskoj zapisyu po nazvaniyu rodiny rukovoditelya otdela programmirovaniya Microsoft Charlza Simoni kotoryj ego izobryol A ne potomu chto ego ispolzovanie pridayot programmam takoj vid budto oni napisany na vengerskom yazyke A Golub Veryovka dostatochnoj dliny Nedostatki Nekotorye programmisty schitayut chto ispolzovanie prefiksov delaet imena peremennyh menee ponyatnymi i takim obrazom uhudshaet chitaemost koda neavtoritetnyj istochnik Esli neizvestno imya peremennoj bez prefiksov podchas trudno vosstanovit eyo prefiksy Sistema avtodokumentacii esli ona ne ponimaet sistemy prefiksov otsortiruet alfavitnyj spisok po prefiksu chto mozhet otricatelno skazatsya na kachestve dokumentacii Vprochem imena funkcij obychno prefiksami ne snabzhayut Zapis neskolkih prefiksov iz za chastogo ispolzovaniya zaglavnyh bukv i znakov podchyorkivaniya mozhet stat plyaskoj na knopke Shift Sredstva navigacii kotorye vklyucheny v sovremennye redaktory koda i tak pozvolyayut videt tip lyuboj peremennoj i bystro perehodit k tochke gde ona opredelena to est ispolzovanie prefiksov mozhet byt izbytochnym Pri izmenenii tipa potrebuetsya izmenyat imya peremennoj ne vse redaktory koda mogut delat eto avtomaticheski neavtoritetnyj istochnik Sushestvuyut i drugie sredstva zadaniya tipa peremennoj v eyo imeni naprimer slova is has i t d dlya bulevskogo tipa IsLoggedIn count dlya schyotchika RefCount mnozhestvennoe chislo dlya massiva UserIds V yazykah v kotoryh zaglavnye bukvy ne ekvivalentny strochnym takzhe mozhet kodirovat chto libo Izvestnyj protivnik vengerskoj notacii Linus Torvalds Vpisyvanie tipa peremennoj v eyo imya tak nazyvaemaya vengerskaya notaciya usherbno kompilyator i tak znaet tipy i mozhet proverit ih i eto zaputyvaet programmista Sm takzheStandart oformleniya kodaPrimechaniyaCharles Simonyi Hungarian Notation neopr Data obrasheniya 29 iyunya 2024 Arhivirovano 29 iyunya 2024 goda Anything You Can Do I Can Do Meta Arhivirovano 20 sentyabrya 2020 goda MIT Technology Review Dzhoel Spolski Making Wrong Code Look Wrong Arhivnaya kopiya ot 29 iyunya 2024 na Wayback Machine Vengerskij yazyk hot i imeet latinskij alfavit schitaetsya krajne neudobochitaemym dlya neosvedomlyonnyh Vengerskaya notaciya neopr Inside C Data obrasheniya 12 noyabrya 2008 Arhivirovano iz originala 30 oktyabrya 2008 goda Linux kernel coding style Arhivirovano 23 sentyabrya 2005 goda Dokumentaciya po yadru Linux na anglijskom
