Изцяло подкрепям добре направените префикси.
Мисля, че (системната) унгарска нотация е отговорна за повечето от "лошия рап", който получават префиксите.
Тази нотация е до голяма степен безсмислена в строго типизирани езици, напр. в C++ "lpsz", за да ви каже, че вашият низ е дълъг указател към низ, завършващ с нула, когато: сегментираната архитектура е древна история, низовете на C++ са според обичайната конвенция указатели към масиви с терминиран нула и всъщност не е толкова трудно да знаете, че "customerName" е низ!
Въпреки това, аз използвам префикси, за да уточня използването на променлива (по същество "Apps Hungarian", въпреки че предпочитам да избягвам термина Hungarian, тъй като има лоша и несправедлива връзка със System Hungarian), и това е много удобен подход за спестяване на време и намаляване на грешки.
Използвам:
- м за членове
- c за константи/само за четене
- p за указател (и pp за указател към указател)
- v за летлив
- s за статично
- i за индекси и итератори
- e за събития
Когато искам да направя типа ясен, използвам стандартни суфикси (напр. List, 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;
}
}
Можете да видите тук:
- Няма объркване между член и параметър
- Няма объркване между индекс/итератор и елементи
- Използване на набор от ясно свързани променливи (списък с елементи, указател и индекс), които избягват многото клопки на общи (неясни) имена като "брой", "индекс".
- Префиксите намаляват въвеждането (по-кратки и работят по-добре с автоматично довършване) от алтернативи като "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;
(което е много по-четливо и премахва цялото объркване при индексирането. С автоматичното попълване в съвременните IDE това също е бързо и лесно за въвеждане)
Следващото предимство е, че кодовите фрагменти не изискват никакъв контекст, за да бъдат разбрани. Мога да копирам два реда код в имейл или документ и всеки, който чете този фрагмент, може да направи разликата между всички членове, константи, указатели, индекси и т.н. Не е нужно да добавям „о, и внимавайте, защото „данни“ е указател към указател“, защото се нарича „ppData“.
И по същата причина не е нужно да отмествам очите си от ред код, за да го разбера. Не е нужно да търся в кода, за да намеря дали „данни“ е локален, параметър, член или константа. Не е нужно да местя ръката си към мишката, за да мога да задържа показалеца върху „данни“ и след това да изчакам да изскочи подсказка (която понякога никога не се появява). Така програмистите могат да четат и разбират кода значително по-бързо, защото не губят време в търсене нагоре-надолу или в чакане.
(Ако не смятате, че губите време в търсене нагоре-надолу, за да изработите неща, намерете някакъв код, който сте написали преди година и не сте го разглеждали оттогава. Отворете файла и скочете около половината надолу, без да го прочетете . Вижте колко далеч можете да прочетете от тази точка, преди да не разберете дали нещо е член, параметър или локално. Сега преминете към друго произволно местоположение... Това е, което всички правим по цял ден, когато минаваме сами код на някой друг или се опитвате да разберете как да извикате тяхната функция)
Префиксът „m“ също така избягва (IMHO) грозната и многословна нотация „this->“ и несъответствието, което гарантира (дори и да внимавате, обикновено ще получите смесица от „this->data“ и „данни“ в същия клас, тъй като нищо не налага последователно изписване на името).
нотацията 'this' има за цел да разреши двусмислеността - но защо някой ще пише умишлено код, който може да бъде двусмислен? Неяснотата ще доведе до грешка рано или късно. И в някои езици „това“ не може да се използва за статични членове, така че трябва да въведете „специални случаи“ във вашия стил на кодиране. Предпочитам да имам едно просто правило за кодиране, което да се прилага навсякъде - изрично, недвусмислено и последователно.
Последното голямо предимство е с Intellisense и автоматично довършване. Опитайте да използвате Intellisense на Windows Form, за да намерите събитие - трябва да превъртите през стотици мистериозни методи на базовия клас, които никога няма да е необходимо да извиквате, за да намерите събитията. Но ако всяко събитие имаше префикс "e", те автоматично биха били изброени в група под "e". По този начин префиксът работи за групиране на членовете, константите, събитията и т.н. в списъка на intellisense, което прави много по-бързо и лесно намирането на имената, които искате. (Обикновено един метод може да има около 20-50 стойности (локални, параметри, членове, константи, събития), които са достъпни в неговия обхват. Но след като напиша префикса (искам да използвам индекс сега, така че пиша 'i. ..'), представят ми се само 2-5 опции за автоматично попълване. „Допълнителното въвеждане“, което хората приписват на префиксите и смислените имена, драстично намалява пространството за търсене и измеримо ускорява скоростта на разработка)
Аз съм мързелив програмист и горната конвенция ми спестява много работа. Мога да кодирам по-бързо и правя много по-малко грешки, защото знам как трябва да се използва всяка променлива.
Аргументи против
И така, какви са минусите? Типичните аргументи срещу префиксите са:
„Префиксните схеми са лоши/зли“. Съгласен съм, че "m_lpsz" и подобните му са зле обмислени и напълно безполезни. Ето защо бих посъветвал да използвате добре проектирана нотация, предназначена да поддържа вашите изисквания, вместо да копирате нещо, което е неподходящо за вашия контекст. (Използвайте правилния инструмент за работата).
„Ако променя начина на използване на нещо, трябва да го преименувам“. Да, разбира се, че го правите, това е същността на рефакторинга и защо IDE имат инструменти за рефакторинг, за да вършат тази работа бързо и безболезнено. Дори и без префикси, промяната на използването на променлива почти сигурно означава, че нейното име трябва да бъде променено.
„Префиксите просто ме объркват“. Както всеки инструмент, докато не се научите как да го използвате. След като мозъкът ви свикне с моделите на именуване, той автоматично ще филтрира информацията и наистина няма да имате нищо против, че префиксите вече са там. Но трябва да използвате стабилно схема като тази за седмица или две, преди наистина да станете „плавни“. И тогава много хора гледат стария код и започват да се чудят как изобщо са се справяли без добра префиксна схема.
„Мога просто да погледна кода, за да реша тези неща“. Да, но не е нужно да губите време да търсите другаде в кода или да си спомняте всеки малък детайл от него, когато отговорът е точно на мястото, върху което очите ви вече са фокусирани.
(Част от) тази информация може да бъде намерена, като просто изчакате да изскочи подсказка за моята променлива. да Когато се поддържа, за някои типове префикси, когато вашият код се компилира чисто, след изчакване, можете да прочетете описанието и да намерите информацията, която префиксът би предал незабавно. Смятам, че префиксът е по-прост, по-надежден и по-ефективен подход.
„Повече е писане“. Наистина ли? Още един цял герой? Или е така - с инструментите за автоматично довършване на IDE често ще се намали въвеждането, защото всеки префиксен знак стеснява значително пространството за търсене. Натиснете "e" и трите събития във вашия клас изскачат в intellisense. Натиснете "c" и се показват петте константи.
„Мога да използвам this->
вместо m
“. Е, да, можете. Но това е просто много по-грозен и многословен префикс! Само че носи много по-голям риск (особено в екипи), тъй като за компилатора е по избор и следователно използването му често е непоследователно. m
от друга страна е кратък, ясен, ясен и незадължителен, така че е много по-трудно да се правят грешки при използването му.
person
Community
schedule
04.08.2009
self._something = 1
). - person Nathan Osman   schedule 02.04.2013this->member
в кода на Python. В Python обикновено би билоself.member
и това не е само конвенция, то се изисква от езика. - person matec   schedule 14.05.2016