Я всім прихильниками префіксів, зроблених добре .
Я думаю, що (Система) угорська нотація відповідає за більшість «поганих репів», які отримують префікси.
Це позначення є значною мірою безглуздим у сильно набраних мовах, наприклад, на C ++ "lpsz", щоб сказати вам, що ваш рядок є довгим покажчиком на завершений нулем рядок, коли: сегментована архітектура є давньою історією, рядки C ++ є загальними указівками конвенції на нульове завершення масиви char, і насправді не все так складно знати, що "customerName" - це рядок!
Однак я використовую префікси, щоб вказати на використання змінної (по суті, "Угорська програми", хоча я вважаю за краще уникати терміна "Угорська" через те, що вона має погану та несправедливу зв'язок із системою Угорська), і це дуже зручно для економії часу та підхід до зменшення помилок
Я використовую:
- м для членів
- c для констант / readonlys
- p для вказівника (і pp для вказівника на вказівник)
- v для мінливих
- s для статики
- i для індексів та ітераторів
- е для подій
У тих випадках, коли я бажаю зробити тип зрозумілим, я використовую стандартні суфікси (наприклад, Список, ComboBox тощо).
Це дає зрозуміти програмісту про використання змінної, коли вони бачать / використовують її. Напевно, найважливіший випадок - "p" для вказівника (оскільки використання змінюється від var. На var->, і вам потрібно бути набагато обережнішими вказівниками - NULL, арифметикою вказівника тощо), але всі інші дуже зручні.
Наприклад, ви можете використовувати одне і те ж ім’я змінної декількома способами в одній функції: (тут приклад C ++, але він застосовується однаково до багатьох мов)
MyClass::MyClass(int numItems)
{
mNumItems = numItems;
for (int iItem = 0; iItem < mNumItems; iItem++)
{
Item *pItem = new Item();
itemList[iItem] = pItem;
}
}
Ви можете побачити тут:
- Немає плутанини між членом і параметром
- Немає плутанини між індексом / ітератором та елементами
- Використання набору чітко пов'язаних змінних (список елементів, вказівник та індекс), які уникають безлічі підводних каменів загальних (розпливчастих) назв, таких як "count", "index".
- Префікси зменшують введення тексту (коротше та краще працювати з автоматичним завершенням), ніж альтернативи, такі як "itemIndex" та "itemPtr"
Ще одним чудовим моментом ітераторів "iName" є те, що я ніколи не індексую масив з неправильним індексом, і якщо я копіюю цикл всередині іншого циклу, мені не доведеться переробляти одну зі змінних індексу циклу.
Порівняйте цей нереально простий приклад:
for (int i = 0; i < 100; i++)
for (int j = 0; j < 5; j++)
list[i].score += other[j].score;
(що важко читати і часто призводить до використання "i" там, де призначено "j")
з:
for (int iCompany = 0; iCompany < numCompanies; iCompany++)
for (int iUser = 0; iUser < numUsers; iUser++)
companyList[iCompany].score += userList[iUser].score;
(що набагато читає і знімає всі плутанини щодо індексації. Завдяки автоматичному заповненню в сучасних ІДЕ це також швидко та легко набрати)
Наступна перевага полягає в тому, що фрагменти коду не потребують розуміння будь-якого контексту . Я можу скопіювати два рядки коду в електронну пошту чи документ, і кожен, хто читає цей фрагмент, може визначити різницю між усіма членами, константами, покажчиками, індексами тощо. Мені не потрібно додавати "о, і будьте обережні, оскільки 'data' - вказівник на покажчик ", тому що він називається 'ppData'.
І з тієї ж причини мені не потрібно виводити очі з рядка коду, щоб зрозуміти це. Мені не потрібно шукати код, щоб виявити, чи є "дані" локальними, параметрами, членами або константами. Мені не потрібно рухати рукою миші, щоб я міг навести вказівник на "дані", а потім чекати появи спливної підказки (яка іноді ніколи не з'являється). Тож програмісти можуть читати та розуміти код значно швидше, оскільки вони не витрачають час на пошук вгору та вниз чи на очікування.
(Якщо ви не думаєте, що ви витрачаєте час на пошук вгору і вниз, щоб розібратися, знайдіть код, який ви написали рік тому, і з того часу не переглядали. Відкрийте файл і стрибайте приблизно на півдорозі, не читаючи його. Дивіться, як далеко ви можете прочитати з цього моменту, перш ніж ви не знаєте, чи є щось членом, параметром чи локальним. Тепер перейдіть до іншого випадкового місця ... Це те, що ми всі робимо цілий день, коли ми один раз перебираємо чийсь код або намагаються зрозуміти, як викликати їх функцію)
Префікс 'm' також дозволяє уникнути негарних та багатослівних позначень "this->" (IMHO) та невідповідності, яку він гарантує (навіть якщо ви обережні, зазвичай ви стикаєтесь із сумішшю "this-> data" та 'data' в одному класі, тому що ніщо не примушує послідовного написання імені).
Позначення "це" покликане вирішити двозначність - але чому б хтось свідомо писав код, який може бути неоднозначним? Неоднозначність буде приводити до помилки , рано чи пізно. І в деяких мовах "це" не можна використовувати для статичних членів, тому вам доведеться ввести "особливі випадки" у вашому стилі кодування. Я вважаю за краще єдине просте правило кодування, яке застосовується скрізь - явне, однозначне та послідовне.
Остання основна вигода - це Intellisense та автоматичне завершення. Спробуйте використовувати Intellisense у формі Windows для пошуку події - вам потрібно прокрутити сотні таємничих методів базового класу, які вам ніколи не потрібно буде викликати, щоб знайти події. Але якби кожна подія мала префікс "е", вони автоматично перераховувалися б у групу під "е". Таким чином, префіксація працює на групування членів, конкурсів, подій тощо у списку інтелігенції, що робить набагато швидшим та простішим пошук потрібних імен. (Зазвичай метод може мати близько 20-50 значень (локальні, параметри, члени, consts, події), які є доступними за своїм обсягом. Але після введення префікса (я хочу зараз використовувати індекс, тому я набираю 'i. .. '), мені представлено лише 2-5 варіантів автоматичного завершення.
Я ледачий програміст, і вищезгадана конвенція економить мені багато роботи. Я можу кодувати швидше, і я роблю набагато менше помилок, бо знаю, як слід використовувати кожну змінну.
Аргументи проти
Отже, які мінуси? Типовими аргументами проти префіксів є:
"Префіксні схеми - погані / злі" . Я погоджуюсь, що "m_lpsz" та його лайка погано продумані та абсолютно марні. Ось чому я б радив використовувати чітко розроблені позначення, розроблені для підтримки ваших вимог, а не копіювати щось, що не відповідає вашому контексту. (Використовуйте правильний інструмент для роботи).
"Якщо я зміню використання чогось, мені доведеться перейменувати його" . Так, звичайно, ви це робите, саме про це рефакторинг, і чому у IDE є інструменти рефакторингу, щоб зробити цю роботу швидко і безболісно. Навіть без префіксів зміна використання змінної майже напевно означає, що її назву слід змінити.
"Префікси просто бентежать мене" . Як і кожен інструмент, поки ви не навчитесь ним користуватися. Після того, як ваш мозок звик до моделей імен, він автоматично відфільтрує інформацію, і ви не подумаєте, що префікси вже є. Але вам доведеться твердо використовувати таку схему протягом тижня-двох, перш ніж ви дійсно станете "вільними". І ось тоді багато людей дивляться на старий код і починають замислюватися, як їм колись вдавалося без гарної префіксальної схеми.
"Я можу просто подивитися на код, щоб опрацювати цей матеріал" . Так, але вам не потрібно витрачати час на пошуки в іншому місці коду чи запам’ятовування його дрібниць, коли відповідь є правильним на місці, на яке вже зосереджено ваше око.
(Деякі з) цю інформацію можна знайти, просто чекаючи, коли підсказка з’явиться на моїй змінній . Так. Якщо це підтримується, для деяких типів префікса, коли ваш код складено чисто, після чекання ви можете прочитати опис та знайти інформацію, яку префікс передав би миттєво. Я відчуваю, що префікс - це простіший, надійніший та ефективніший підхід.
"Це більше вводити текст" . Дійсно? На один цілий персонаж більше? Або це так - за допомогою інструментів автоматичного завершення IDE часто зменшується введення тексту, оскільки кожен символ префіксу значно звужує простір пошуку. Натисніть "e", і три події у вашому класі спливуть у взаємозвученні. Натисніть "c", і п'ять констант у списку.
"Я можу використовувати this->
замість m
" . Ну так, можна. Але це просто набагато потворніший і більш багатослівний префікс! Тільки це несе набагато більший ризик (особливо в командах), оскільки для компілятора це необов'язково , а тому його використання часто непослідовно. m
з іншого боку, це коротка, чітка, явна та необов'язкова, тому набагато важче помилитися, використовуючи її.