Всех приветствую! Недавно задумался о логике имен указателей. Например если есть некоторое количество функций для обработки символьных массивов, то поневоле начинаешь задумываться о их именах и логической связи имени каждого указателя и его назначения. Сначала именовал их как (*p, *p2, *p3, etc..), пробовал также как - (*ptr_str, *ptr_sub, *ptr_start, *ptr_end, etc), потом все же выработал для себя микро концепцию по именованию указателей прибегая к аббревиатуре или акрониму. Код (Text): ps -> указатель на строку pss -> указатель на начало строки pse -> указатель на конец строки psi -> указатель на строку используя индекс psub -> указатель на подстроку psubs -> указатель на начало подстроки psube -> указатель на конец подстроки prep -> указатель на подстроку замены pcopy -> указатель на копию результирующей строки pcopyi -> указатель на копию результирующей строки используя индекс И теперь когда я смотрю на имя указателя мне сразу становится понятно о чем идет речь. Код (C++): char *erase(char *str, const char *str2, const int start, const int len) { char *ps = str; const char *ps2 = str2, *pss2 = &str2[start], *psi2 = &str2[start + len]; while(*ps2) { if(ps2 < pss2 || ps2 >= psi2) { *ps++ = *ps2; } ps2++; } *ps = '\0'; return str; } Вы используете какие-то методы по именованию указателей, или вообще переменных, параметров, etc?
Я уверен, что эту нотацию ее изобретателю нашептал дьявол, лично. И именно по этой причине она была принята в качестве стандарта в МС, не к ночи будь она помянута. Имя переменной не должно говорить о ее структуре, оно должно говорить о ее назначении. И за вот эти всякие p, pps, sz, pdw, pspspppss я бы пи3дил арматурой по пальцам.
Я тоже использую префиксы у полей структур и классов. Но они достаточно ограничены: p - одиночный указатель (сокращение от pointer) v - указатель на начало массива либо коллекция (сокращение от values) s - некоторая вложенная структура, либо указатель на начало си-строки(сокращение от struct, string) f - параметр с плавающей точкой (сокращение от float) n - целочисленный параметр (сокращение от numeric) Большее число префиксов вводить не вижу особого смысла.
Можно на ты - ты меня лично знаешь. Правда пока не догадываешься что я, это я ) И я готов отстаивать свою точку зрения, так как это следствие очень многих лет и килотонн кода.
ol., ну у меня свой опыт ) но я к сожалению спорить не хочу, да и времени нет . Разве что, ты покажешь пример хорошего кода с венгерской нотацией и покажешь, как сделать его еще лучше, и почему мешает тебе в нем венгерская - то тогда будет, что обсудить.
Да запросто, первое же, что попалось: Код (Text): void MyCopyMemory(TCHAR *buf, TCHAR *pbData, SIZE_T cbData, SIZE_T bufsize) { CopyMemory(buf, pbData, min(cbData,bufsize)); } Делаем его хорошим: Код (Text): void MyCopyMemory(TCHAR *pbOutputBuffer, SIZE_T cbOutputSize, TCHAR *pbSourceString, SIZE_T cbSourceSize) { CopyMemory(pbOutputBuffer, pbSourceString, min(cbOutputSize, cbSourceSize)); } и тут же избавляемся от префиксов: Код (Text): void MyCopyMemory(TCHAR *OutputBuffer, SIZE_T OutputSize, TCHAR *SourceString, SIZE_T SourceSize) { CopyMemory(OutputBuffer, SourceString, min(OutputSize, SourceSize)); } После чего спрашиваем себя: а что, собственно, стало хуже то? "pbSourceString" несет больше информации, чем "SourceString"? Нет, так как String - это строка, некоторый буфер с последовательностью символов, и это понятно интуитивно и сразу. Зато пропало дублирование этой информации и глаза не спотыкаются на этом "pb", код стал более похож на обычный человеческий язык. А что изменилось с заменой "cbSourceSize" на "SourceSize"? Тоже, может, стало хуже? И тоже нет. Ясное дело, что если мы будем как му.. программеры микрософта называть переменные pbData и cbData, то тогда... хотя и префиксы нас тогда тоже не спасут. Ну и в качестве вишенки - это, наверное, очень приятно глобально заменять в проекте все переменные wWordCount на iWordCount после того, как все же решили сменить ее тип с short на int. Код (Text): void MyCopyMemory(TCHAR *buf, TCHAR *pbData, SIZE_T cbData, SIZE_T bufsize) { CopyMemory(buf, pbData, min(cbData,bufsize)); } void main() { TCHAR buf[BUFFER_SIZE] = TEXT("This is the destination"); TCHAR pbData[BUFFER_SIZE] = TEXT("This is the source"); MyCopyMemory(buf, pbData, COPY_SIZE*sizeof(TCHAR), BUFFER_SIZE*sizeof(TCHAR)); _tprintf(TEXT("Destination buffer contents: %s\n"), buf); }
Данном конкретно примере да. Но если бы это был некоторый алгоритм, где важно было знать мультибайт строка или юникод или еще что. То было бы очень хорошо поставить pwszSourceString , а если она в структуре UNICODE то еще лучше написать us . Тогда будет понятно где строка обычная, а где она юникодная. Ну и да, есть конечно места, когда глупо писать wWorld.... Надо конечно понимать, когда имеет смысл определять переменную, и связывать ее с типом. Я например могу показать код на шаблонах, где нету типов как таковых, и конечно переменные там без венгерской нотации.
А еще можно написать fckmSourceString, тогда тоже будет ясно, что она юникодная. Главное, это научить программистов и сочуствующих правильно дешифровать абревиатуры. Все помнят как легко читаются регэкспы? Когда действительно важно знать, мультибайт или юникод строка, то это надо вносить в название, например SourceUnicodeString. Если же в название характеристику вносить не надо, значит не так уж и важно. Я предлагаю обсуждать "в глобальном", так как частности всякие бывают.
Вот как раз такое мне не нравится, прописывать целое название типа... проще us поставить, хотя конечно еще лучше писать на питоне )))
Завязывал бы ты уже в досе сидеть. 2к17 на дворе - наводишь мышь на имя переменной и умный редактор показывает в тултипе ее тип
dst как расшифровывается? В целом интересный вариант. v слишком многозначно, тогда уж ps или pb. А потом какой-нибудь англоговорящий смотрит в ваш код и не поймет контекст о чем речь, если только вы не пишите для себя. ol., вы из мира джаваскрипт пришли? Кто вам сказал что в досе сижу?
rmn, в самом начале файла оставить описание концепции имен указателей на en, как это у меня сделано в первом посту.