Угорський запис

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

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

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

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

Для прикладу він розглядає безпечні та небезпечні стрічки. Якщо ми отримуємо значення від користувача:

s = Request("name")

, тоді пізніше ми можемо написати такий код:

Write "Привіт, " & Request("name")

який буде небезпечним. Спершу треба було замінити всі сиволи подібні до > на > і т.д. Ми мали б написати:

Write "Привіт, " & Encode(Request("name"))

Тож деякі стрічки є небезпечними, і не мають безпосередньо виводитись в документ, а інші - безпечними. Їх можна виводити. Угорський запис пропонує додавати до змінних які зберігають небезпечні стрічки префікс us, а змінним які зберігають безпечні стрічки префікс s. Тоді код може виглядати так:

usName = Request("name")  // (1) Request() завжди повертає небезпечні стрічки

sName = Encode(usName)    // (2) Конвертація стрічок

Write "Привіт, " & usName // (3) Помилка
Write "Привіт, " & sName  // (4) Безпечний код

sName = usName            // (5) Помилка

Такий код дозволяє нам бачити:

1. Request() завжди повертає небезпечні стріки. Томі змінна зліва має завжди мати префікс us.

2. Encode() приймає в якості єдиного параметра небезпечну строку, тобто таку яка має префікс us. Результатом виконання цієї функції є безпечна строка, тому зліва має стояти змінна з перфіксом s.

3. Виводити змінні з префіксом us небезпечно.

4. Натомість змінні з префіксом s виводити цілком безпечно.

5. Змінні з різними префіксами не є взаємозамінними, тому пряме присвоєння таких змінних є небезпечним.

Приклади

В MSDN функції які працюють зі стрічками можнуть приймати ANSII або UTF-8 стрічки. Щоб розрізняти такі функції, їм додають суфікси A для ANSII версії, та W для UTF-8 версії. Або приклад сигнатури точки входу в Win32 додаток:

INT WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    PSTR lpCmdLine, INT nCmdShow)

Тут hInstance - це дескриптор програми завантаженної в пам'ять операційної системи. Ця змінна може використовуватись кодом програми для запиту ресурсів доєднаних до програми у операційної системи. Для програми значення яке знаходиться всередині дескриптора - не суттєве. lpCmdLine - це вказівник, а nCmdShow - число.

В Unreal Engine класси які наслідуються від UObject мають починатись з літери U, а класи які наслідуються від AActor - з літери A. Так, ATree - це клас, а Tree - це змінна цього классу, яка є актором, та може бути додана на сцену. Також інструменти які використовуються для компіляції Unreal Engine, використовують цей контракт, та вимагають його дотримання.

Декілька документів з докладним описом угорського запису який використовувався в Microsoft наведенені нижче в покликаннях. Один з них датовано 1988м роком, а інший - 1999м.