Как согласовать общие соглашения об именах C ++ с соглашениями об именах библиотек

Большинство соглашений об именах C ++ предписывают использовать camelCaseIdentifiers: имена, начинающиеся с заглавной буквы для классов (Person, Booking), и имена, начинающиеся со строчной буквы для полей и переменных (getPrice(), isValid(), largestValue). Эти рекомендации полностью расходятся с соглашениями об именах библиотеки C ++, в которых используются строчные имена для классов (string, set, map, fstream) и names_joined_with_an_underscore для методов и полей (find_first_of, lower_bound, reverse_iterator, first_type). Еще больше усложняют картину операционная система и функции библиотеки C, которые включают сжатые строчные имена в C и Unix и функции, начинающиеся с заглавной буквы в Windows.

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

Итак, как согласовать эти разрозненные соглашения об именах?


person Diomidis Spinellis    schedule 08.12.2008    source источник


Ответы (10)


Один из способов принять C ++ naming_convention, это то, что сейчас делают большинство примеров кода в литературе.

Я постепенно вижу, как эти соглашения переходят в производственный код, но это борьба с соглашениями об именах MFC, которые все еще преобладают во многих местах.

Другие различия в стилях, которые борются со старыми стандартами, заключаются в использовании завершающих подчеркиваний вместо m_ для обозначения элементов.

person Motti    schedule 08.12.2008
comment
В соглашении об именах C ++ все идентификаторы (имена классов и полей) записаны в нижнем регистре. Можете ли вы указать на рекомендации по стилю C ++, которые рекомендуют этот стиль? Стандарты кодирования C ++ и книги по стилям C ++ - нет. - person Diomidis Spinellis; 09.12.2008
comment
Я не знаю такого документа, я получил соглашение об именах C ++ из STL (который, очевидно, является частью стандарта). - person Motti; 09.12.2008
comment
Я согласен с Мотти: хотя я предпочитаю стиль camelCase, STL использует naming_convention, и поэтому его можно считать стилем по умолчанию для C ++ ... Но тогда Win32 API / .NET - это PascalCase, а C API - это все о Шесть длинных забавных названий функций ... Так что, в конце концов, подбери себе яд ... ^ _ ^ - person paercebal; 10.12.2008
comment
Преимущество использования соглашения об именах стандартной библиотеки C ++ заключается в том, что ваши собственные контейнерные классы становятся более совместимыми с контейнерами STL. Например, вы можете использовать back_insert_iterator в классе, имеющем push_back(), но не в классе, имеющем pushBack(). - person Emile Cormier; 25.01.2010

Диомидис, я разделяю вашу боль и потратил много времени на переключение между разными схемами на протяжении многих лет, пытаясь найти что-то, что работает с различными библиотеками / фреймворками, которые я использую (MFC и / или STL / Boost). При работе с одной структурой, такой как STL, вы можете попытаться скопировать соглашение об именах, которое она использует, но когда вы вводите другую структуру, она легко разваливается.

В конце концов, я принял единый стиль для всего нового кода, который я пишу (на основе рекомендаций по стилю Google C ++), и реорганизовал старый код, чтобы использовать этот стиль, когда это необходимо. Вы не можете легко согласовать различные соглашения об именах, поэтому не тратьте время на попытки. Обеспечьте соблюдение схемы для вашей команды / отдела / компании и придерживайтесь ее, но не зацикливайтесь на том, насколько «некрасиво» может выглядеть код при использовании комбинации схем.

Рекомендации Google C ++ довольно хороши, IMHO - с небольшими поправками. Ознакомьтесь с руководством здесь:

https://google.github.io/styleguide/cppguide.html#Naming

person Rob    schedule 08.12.2008
comment
Я думал использовать что-то похожее на рекомендации Google, но они плохо сочетаются с STL, поэтому я задал вопрос. Полагаю, я был испорчен абсолютным порядком в Java. - person Diomidis Spinellis; 08.12.2008
comment
Если бы мне посчастливилось разрабатывать «чистый» STL, это не было бы проблемой. Я прошел этап использования нескольких стилей в зависимости от целевой структуры - хорошо, пока я не начал смешивать STL / boost с MFC! Стиль Google ничуть не хуже всех, что я видел, хотя я немного его изменил. - person Rob; 08.12.2008
comment
не переименовывайте старый код, если вы не хотите его полностью менять - вы напортачите с diff / merge, и это может повредить. - person gbjbaanb; 09.12.2008
comment
Я стал скептически относиться к рекомендациям, когда прочитал их рекомендацию не использовать исключения, я подумал, что, черт возьми, они действительно думают - person ; 25.07.2012

Зачем нужно мириться? Пока код компилируется и вы можете выполнять работу, не беспокойтесь об этом.

person Jim Buck    schedule 08.12.2008
comment
Потому что для некоторых людей (например, для меня) часть удовольствия от работы программистом - это эстетика кода. Мой код - это поэзия, если я могу сделать это, не отвлекаясь от текущей задачи. - person Gregory Higley; 08.12.2008
comment
С различными соглашениями о коде вы должны помнить, откуда берется идентификатор, чтобы ввести его правильно. - person Diomidis Spinellis; 08.12.2008
comment
Да, но когда вы имеете дело с чужим кодом и сторонними библиотеками, невозможно, чтобы у них были те же соглашения, что и у вас (и друг с другом), поэтому в какой-то момент вам просто нужно пристегнуться, привыкнуть к этому и получить некоторую работу Выполнено. - person Jim Buck; 08.12.2008
comment
Диомидис Спинеллис упомянул в другой ветке комментариев, что он был испорчен абсолютным соглашением об именах в Java. У меня тоже возник тот же вопрос после того, как меня испортили строгие соглашения об именах в Java и Ruby. Как мы все здесь узнали, C ++ представляет собой смесь соглашений, которые трудно согласовать. - person EnabrenTane; 14.06.2011
comment
Как разработчики, мы большую часть времени проводили за чтением кода. Соглашения делают эту часть нашей работы менее затратной по времени и более безопасной. Невозможность навязать эти соглашения сторонним библиотекам не является проблемой: вы почти никогда не читаете / не отлаживаете этот код сторонней библиотеки. Если семантика интерфейса сторонней библиотеки противоречит, вы можете либо адаптироваться, либо оставить комментарий в коде. При работе с чужим кодом условности - это то, что заставляет их придерживаться тех же правил, что и вы. - person IInspectable; 20.05.2015

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

В конечном итоге, я думаю, все сводится к знанию того, из какой библиотеки взят метод, объект или функция. Если вы это знаете, тогда становится достаточно легко запомнить, какое соглашение используется этой библиотекой, при условии, что проект не включает много библиотек. Я пробовал адаптировать свой собственный код, чтобы он соответствовал кодам библиотек, которые я использую, но это всегда движущаяся цель, и в конце концов это просто разочаровывает.

person Sydius    schedule 08.12.2008

В проектах, над которыми я работаю, я следую соглашениям о коде для моего проекта. Когда я вызываю что-то другое, я использую API этой библиотеки.

Я бы также добавил, что упаковка библиотеки - плохая идея (их много в кодовой базе, над которой я работаю), потому что обычно это делает разработчик, который решает свою проблему, и, как правило, не подходит для использования. всеми остальными разработчиками. С другой стороны, качественная упаковка стоит дорого.

person sergtk    schedule 08.12.2008

Честно говоря, я бы просто использовал библиотеку как есть и придерживался вашего собственного стиля кодирования. Вы можете обернуть его, но это кажется излишним.

person Bernard    schedule 08.12.2008

Любимая цитата:

Лучшее в стандартах - это то, что есть из чего выбирать!

Я предлагаю взять соглашение о библиотеке, которое чаще всего встречается в коде вашей компании (вероятно, библиотека C ++, которой, как я считаю, тоже придерживается), и сделать это своим стандартом. В противном случае у вас может вообще не быть его.

person T.E.D.    schedule 08.12.2008

Что ж, поскольку мы не можем изменить способ реализации стандартных библиотек, я думаю, нам придется с этим жить. Что касается согласования - некоторое время назад, когда я писал кое-что из Win32 API, я пытался назвать свои собственные методы в PascalCasing, как это сделано в API, но это просто не выглядело правильным. Поэтому я вернулся к именованию своих методов в camelCase. Я согласен, что это беспорядок, но другой вариант - адаптировать свой стиль к каждому новому фреймворку или библиотеке, которые вы используете, а также есть проблема, о которой вы упомянули, о наличии нескольких библиотек, использующих разные соглашения в одном проекте. Итак, мой совет - придерживайтесь того, что кажется правильным для ваших собственных методов и классов. Или - в корпоративной среде - придерживайтесь лучших практик и рекомендаций вашей компании.

person Boyan    schedule 08.12.2008
comment
Нитпик: Я не верю, что термин «верблюжий регистр» широко используется для различения строчных и прописных букв для первой буквы. См. en.wikipedia.org/wiki/Camelcase. Я не часто встречаю термин PascalCase - не знаю, каков его общий смысл. - person Steve Fallows; 08.12.2008
comment
@Steve: Вы читали ту статью в Википедии, на которую ссылаетесь? Потому что в самом начале упоминается разница между падежом верблюда и паскалем, говоря, что некоторые люди его используют. Что ж, я один из таких людей. - person Boyan; 08.12.2008
comment
А вот хорошая ссылка на стили корпуса в MSDN: msdn. microsoft.com/en-us/library/x2dbyw72(VS.71).aspx - person Boyan; 08.12.2008
comment
Дох - я пролистал слишком быстро. В другом чтении я считаю, что мой опыт (camelCase как более общий термин) не самый распространенный. Вот что я получаю за придирки. :) - person Steve Fallows; 08.12.2008

Я, кажется, вспоминаю, как давным-давно читал, что они намеренно решили сделать стандартную библиотеку отличной от рекомендованного соглашения о кодировании, чтобы избежать конфликтов имен. Однако сейчас я не могу найти упоминания об этом. Я помню, как читал, что вы не должны использовать начальные строчные буквы в именах типов, потому что они были зарезервированы для стандартных библиотек. Я предполагаю, что нечто подобное происходит с использованием подчеркиваний. Я действительно не вижу проблемы в нескольких соглашениях об именах, поскольку они четко отделяют стандартный код от кода в вашем проекте. Я всегда кодирую вещи в своих проектах, используя заглавный регистр верблюда для типов и нижний регистр для методов / членов. На моем текущем рабочем месте не только типы, но и методы используются с заглавной буквы, что меня очень раздражает. Но им также нравятся венгерские бородавки, от которых открестился даже MS: P

person rmeador    schedule 08.12.2008

Вы должны принять разницу.

Когда люди увидят использование remove_copy_if, они сразу поймут, что это алгоритм. На самом деле это положительная особенность, поскольку алгоритмы имеют определенные гарантии (или их отсутствие).

Мы также используем соглашение об именах для наших собственных алгоритмов.

person Richard Corden    schedule 07.02.2012