Концепция имен указателей

Тема в разделе "LANGS.C", создана пользователем Ronin_, 29 июн 2017.

  1. Ronin_

    Ronin_ Active Member

    Публикаций:
    1
    Регистрация:
    24 дек 2016
    Сообщения:
    252
    Всех приветствую!

    Недавно задумался о логике имен указателей. Например если есть некоторое количество функций для обработки символьных массивов, то поневоле начинаешь задумываться о их именах и логической связи имени каждого указателя и его назначения.

    Сначала именовал их как (*p, *p2, *p3, etc..), пробовал также как - (*ptr_str, *ptr_sub, *ptr_start, *ptr_end, etc), потом все же выработал для себя микро концепцию по именованию указателей прибегая к аббревиатуре или акрониму.

    Код (Text):
    1.        
    2.         ps -> указатель на строку
    3.         pss -> указатель на начало строки
    4.         pse -> указатель на конец строки
    5.         psi -> указатель на строку используя индекс
    6.         psub -> указатель на подстроку
    7.         psubs -> указатель на начало подстроки
    8.         psube -> указатель на конец подстроки
    9.         prep -> указатель на подстроку замены
    10.         pcopy -> указатель на копию результирующей строки
    11.         pcopyi -> указатель на копию результирующей строки используя индекс
    12.  
    И теперь когда я смотрю на имя указателя мне сразу становится понятно о чем идет речь.

    Код (C++):
    1.  char *erase(char *str, const char *str2, const int start, const int len) {
    2.  
    3.         char *ps = str;
    4.         const char *ps2 = str2, *pss2 = &str2[start], *psi2 = &str2[start + len];
    5.        
    6.         while(*ps2) {
    7.             if(ps2 < pss2 || ps2 >= psi2) {
    8.                 *ps++ = *ps2;
    9.             }
    10.             ps2++;
    11.         }
    12.        
    13.         *ps = '\0';
    14.        
    15.         return str;
    16.     }
    17.  
    Вы используете какие-то методы по именованию указателей, или вообще переменных, параметров, etc?
     
  2. comrade

    comrade Константин Ёпрст

    Публикаций:
    0
    Регистрация:
    16 сен 2002
    Сообщения:
    232
    Адрес:
    Russian Federation
  3. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Я бы начал с того, что переименовал параметр str в dst, а str2 - в src.
     
  4. ol.

    ol. Active Member

    Публикаций:
    0
    Регистрация:
    21 фев 2017
    Сообщения:
    118
    Я уверен, что эту нотацию ее изобретателю нашептал дьявол, лично. И именно по этой причине она была принята в качестве стандарта в МС, не к ночи будь она помянута.

    Имя переменной не должно говорить о ее структуре, оно должно говорить о ее назначении. И за вот эти всякие p, pps, sz, pdw, pspspppss я бы пи3дил арматурой по пальцам.
     
    DelAlt нравится это.
  5. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    ol., а если имя говорит о назначении и о структуре . Не торопитесь с выводами
     
  6. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Я тоже использую префиксы у полей структур и классов. Но они достаточно ограничены:

    p - одиночный указатель (сокращение от pointer)
    v - указатель на начало массива либо коллекция (сокращение от values)
    s - некоторая вложенная структура, либо указатель на начало си-строки(сокращение от struct, string)
    f - параметр с плавающей точкой (сокращение от float)
    n - целочисленный параметр (сокращение от numeric)

    Большее число префиксов вводить не вижу особого смысла.
     
  7. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    i - целочисленный, s - строка, a - массив
     
  8. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.328
    schetchik, stroka, chislo... Выдумывают проблемы на пустом месте :)
     
    Mikl___, SadKo и Thetrik нравится это.
  9. ol.

    ol. Active Member

    Публикаций:
    0
    Регистрация:
    21 фев 2017
    Сообщения:
    118
    Можно на ты - ты меня лично знаешь. Правда пока не догадываешься что я, это я )

    И я готов отстаивать свою точку зрения, так как это следствие очень многих лет и килотонн кода.
     
  10. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    ol., ну у меня свой опыт ) но я к сожалению спорить не хочу, да и времени нет . Разве что, ты покажешь пример хорошего кода с венгерской нотацией и покажешь, как сделать его еще лучше, и почему мешает тебе в нем венгерская - то тогда будет, что обсудить.
     
  11. ol.

    ol. Active Member

    Публикаций:
    0
    Регистрация:
    21 фев 2017
    Сообщения:
    118
    Да запросто, первое же, что попалось:
    Код (Text):
    1.  
    2. void MyCopyMemory(TCHAR *buf, TCHAR *pbData, SIZE_T cbData, SIZE_T bufsize)
    3. {
    4.   CopyMemory(buf, pbData, min(cbData,bufsize));
    5. }
    6.  
    Делаем его хорошим:
    Код (Text):
    1.  
    2. void MyCopyMemory(TCHAR *pbOutputBuffer, SIZE_T cbOutputSize, TCHAR *pbSourceString, SIZE_T cbSourceSize)
    3. {
    4.   CopyMemory(pbOutputBuffer, pbSourceString, min(cbOutputSize, cbSourceSize));
    5. }
    6.  
    и тут же избавляемся от префиксов:
    Код (Text):
    1.  
    2. void MyCopyMemory(TCHAR *OutputBuffer, SIZE_T OutputSize, TCHAR *SourceString, SIZE_T SourceSize)
    3. {
    4.   CopyMemory(OutputBuffer, SourceString, min(OutputSize, SourceSize));
    5. }
    6.  
    После чего спрашиваем себя: а что, собственно, стало хуже то? "pbSourceString" несет больше информации, чем "SourceString"? Нет, так как String - это строка, некоторый буфер с последовательностью символов, и это понятно интуитивно и сразу. Зато пропало дублирование этой информации и глаза не спотыкаются на этом "pb", код стал более похож на обычный человеческий язык.
    А что изменилось с заменой "cbSourceSize" на "SourceSize"? Тоже, может, стало хуже? И тоже нет.

    Ясное дело, что если мы будем как му.. программеры микрософта называть переменные pbData и cbData, то тогда... хотя и префиксы нас тогда тоже не спасут.

    Ну и в качестве вишенки - это, наверное, очень приятно глобально заменять в проекте все переменные wWordCount на iWordCount после того, как все же решили сменить ее тип с short на int.
    Код (Text):
    1.  
    2. void MyCopyMemory(TCHAR *buf, TCHAR *pbData, SIZE_T cbData, SIZE_T bufsize)
    3. {
    4.     CopyMemory(buf, pbData, min(cbData,bufsize));
    5. }
    6.  
    7. void main()
    8. {
    9.     TCHAR buf[BUFFER_SIZE] = TEXT("This is the destination");
    10.     TCHAR pbData[BUFFER_SIZE] = TEXT("This is the source");
    11.  
    12.     MyCopyMemory(buf, pbData, COPY_SIZE*sizeof(TCHAR), BUFFER_SIZE*sizeof(TCHAR));
    13.  
    14.     _tprintf(TEXT("Destination buffer contents: %s\n"), buf);
    15. }
    16.  
     
    DelAlt нравится это.
  12. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    Данном конкретно примере да. Но если бы это был некоторый алгоритм, где важно было знать мультибайт строка или юникод или еще что. То было бы очень хорошо поставить pwszSourceString , а если она в структуре UNICODE то еще лучше написать us . Тогда будет понятно где строка обычная, а где она юникодная.

    Ну и да, есть конечно места, когда глупо писать wWorld.... Надо конечно понимать, когда имеет смысл определять переменную, и связывать ее с типом.

    Я например могу показать код на шаблонах, где нету типов как таковых, и конечно переменные там без венгерской нотации.
     
  13. ol.

    ol. Active Member

    Публикаций:
    0
    Регистрация:
    21 фев 2017
    Сообщения:
    118
    А еще можно написать fckmSourceString, тогда тоже будет ясно, что она юникодная. Главное, это научить программистов и сочуствующих правильно дешифровать абревиатуры. Все помнят как легко читаются регэкспы?

    Когда действительно важно знать, мультибайт или юникод строка, то это надо вносить в название, например SourceUnicodeString. Если же в название характеристику вносить не надо, значит не так уж и важно.

    Я предлагаю обсуждать "в глобальном", так как частности всякие бывают.
     
  14. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    Вот как раз такое мне не нравится, прописывать целое название типа... проще us поставить, хотя конечно еще лучше писать на питоне )))
     
  15. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.328
    Завязывал бы ты уже в досе сидеть. 2к17 на дворе - наводишь мышь на имя переменной и умный редактор показывает в тултипе ее тип :)
     
    ol. нравится это.
  16. Ronin_

    Ronin_ Active Member

    Публикаций:
    1
    Регистрация:
    24 дек 2016
    Сообщения:
    252
    dst как расшифровывается? В целом интересный вариант.

    v слишком многозначно, тогда уж ps или pb.
    А потом какой-нибудь англоговорящий смотрит в ваш код и не поймет контекст о чем речь, если только вы не пишите для себя.

    ol., вы из мира джаваскрипт пришли?
    Кто вам сказал что в досе сижу?
     
  17. Aiks

    Aiks Member

    Публикаций:
    0
    Регистрация:
    16 апр 2017
    Сообщения:
    109
    Адрес:
    Украина
    dst == destination
     
    Ronin_ нравится это.
  18. Ronin_

    Ronin_ Active Member

    Публикаций:
    1
    Регистрация:
    24 дек 2016
    Сообщения:
    252
    TermoSINteZ, нет никакого питона, есть пайтон, с ударением на о.
     
  19. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.328
    О, да. Другое дело pss - сразу всем понятно назначение переменной просто из названия.
     
  20. Ronin_

    Ronin_ Active Member

    Публикаций:
    1
    Регистрация:
    24 дек 2016
    Сообщения:
    252
    rmn, в самом начале файла оставить описание концепции имен указателей на en, как это у меня сделано в первом посту.