Стоит ли заботиться о правилах именования?


13

Я называю свои переменные, используя соглашения .Net:

  • camelCase для переменных и полей (я склонен использовать _camelCase для приватных полей в классе)
  • PascalCase для методов, свойств и классов

Единственное место, где я отклоняюсь, это константы и перечисления, где я на самом деле предпочитаю стиль Java SCREAMING_CAPS.

Кодовая база моей компании усеяна псевдо-венгерским стилем обозначений из VB6 и VBScript, если не полноценным венгерским, т.е.

  • s или str для строк
  • я или int для Ints
  • д для десятичной (или иногда двойной)
  • o или obj для любого типа объекта

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

Я делаю из мухи слона в отношении этого? Разве мне все равно, если код полон избыточных идентификаторов, а не описательных имен, и продолжать использовать свой собственный путь и настаивать на том, чтобы это стало стандартом?


2
Хороший вопрос. Соглашения об именах должны помочь, а не помешать. Когда они мешают (потому что их первоначальная цель больше не актуальна), тогда бросьте их.
Гэри Роу

Ответы:


7

Единственное, о чем вы должны заботиться, это то, что вы работаете в команде, где люди не заботятся о том, чтобы что-то почистить. Это очень грустно.

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

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


+1 В наши дни Refactor Rename настолько эффективен, что вы вряд ли заметите эффект от внесения изменений.
Гэри Роу

2
К сожалению, люди в моей команде даже не используют это. Они боятся переименовывать вещи, даже если название вводит в заблуждение. Например, есть метод, SendNewCustomerEmailкоторый используется для отправки всех видов электронных писем, а не только новых электронных писем клиентов. В нем есть комментарий от текущего разработчика, который гласит: «Обратите внимание, что это имя вводит в заблуждение», но никто даже не задумывался над тем, чтобы переименовать его в нечто более общее и полезное, и если я сделаю это, менеджер попросит меня объяснить, почему я Я изменяю код, который не нужно менять, вместо того, чтобы добавлять ценность.
Уэйн Молина

3

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

Это своего рода вопрос технического долга, поскольку вы совершенно правы, что этот стиль венгерского не имеет смысла в .Net (за исключением интерфейсов с «I», но это в другой раз), однако это может быть своего рода техническая задолженность, с которой ваша команда может жить, пока она, естественно, не исчезнет .


4
Я даже не обращаю внимания на префикс «I», и использую его только потому, что он позволяет избежать загадки Java, скажем, с именованным интерфейсом CustomerRepositoryи с классом CustomerRepositoryImplили подобным.
Уэйн Молина

3
+1 - Кажется, должен быть какой-то лучший способ. Время от времени я использую «Hungarian Light», но префиксы всегда связаны с бизнесом, а не с типом. Например, все в бухгалтерии имеет AP и AR, и они часто имеют одно и то же имя, например Invoice. Наличие AR-счета и AP-счета мне кажется вполне разумным. Венгерский ВСЕ не плохой ВСЕ время.
Морган Херлокер

@Wayne M Вы можете посмотреть на programmers.stackexchange.com/questions/75956/…
Гари Роу

Я бы на самом деле не считал эту «венгерскую нотацию», потому что, как вы сказали, это бизнес-смысл с четко определенной аббревиатурой, которую знают люди, в том же ключе, что и код, в котором Xmlвместо XML используется префикс XML ExtensibleMarkupLanguage. В модуле бухгалтерского учета я ожидал бы увидеть объекты счета-фактуры, такие как arInvoiceи apInvoiceкоторые передают бизнес-контекст, но видят objArInvoiceили oApInvoiceпросто глупо ИМО. Я предполагаю, что это могло быть хуже, это могло быть clsApInvoiceдля фактического имени класса
Уэйн Молина

1
@ironcode: на самом деле это то, что называется Apps Венгерская нотация по сравнению с системной венгерской нотацией, и намного лучше. К сожалению, большинство людей используют системы. en.wikipedia.org/wiki/…
Мики Уоттс

2

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

  • Поощряйте больше недоброжелательности (b) ool (f) loat (c) har (l) ong (s) hort (конфликтует со строкой? No: (S) tring), (v) oid.
  • Поощряйте кодирование видимости. Я из Javaland, и надеюсь, что он подходит и для .net: (pri) vate, (pub) blic, (pro) tected (def) ault следует использовать.
  • .net имеет final / const? Сделайте это префиксом! Слышу ли я «изменчивый»?
  • Зачем int и long нужен префикс, а разные объекты - нет? Это не логично. Создайте abbrev.tab. где каждый новый объект получает отдельное сокращение.
  • Переменные, которые могут быть нулевыми, и такие, которые никогда не должны быть нулевыми, также могут иметь префикс. Умные люди помещают весь DbC в префикс переменной.

Серьезно: при рефакторинге вы можете изменить переменную с int на long, со String на char. Вам не нужно менять имя тоже.

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

Дополнительные символы нарушают семантику переменной. Целое число «нормальный» получает «i_sane», который больше похож на «безумный».

Венгерская нотация была полезна в языках, в которых отсутствует система типов. Вам это не нужно, если компилятор применяет определенные типы. Если вы украсите свой ламенто о венгерской нотации эмпатическим «да, для старших программистов, в прошлом имело смысл использовать его!», Эти старшие программисты могли бы быть напрасными и предпочитать, чтобы их не называли старыми.

Но вы должны быть осторожны, чтобы техника работала. Может быть, вы можете понизить голос, говоря о «старших программистах», чтобы они почувствовали, насколько вы осторожны с ними, насколько им нужен уход. Чтобы третий человек в комнате узнал, что вы пытаетесь что-то скрыть, что, конечно, вызовет у него любопытство.


К сожалению, я также видел, eSomeEnumкак используется в некоторых местах; к счастью, не часто.
Уэйн Молина

2

Купите копию Руководства по разработке дизайна и поместите ее на рабочий стол вашего менеджера (или любого, кто контролирует стиль кодирования). Обязательно поместите в заметку заметку, явно указывающую на введение, где они подчеркивают важность последовательности. Чтобы продолжить путь к цели, возьмите копию Чистого кода и поставьте там закладку в разделе, касающемся соглашений о кодировании.


1

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

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

Я не сторонник какого-то общепринятого стандарта, навязанного группой стандартов, но команды разработчиков разрабатывают свой собственный стандарт и, что более важно, придерживаются его.


1

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

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


0

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


0

Мои отклонения:

  • _PublicPropertyBacker
  • _private_property_backer
  • _privateMember
  • CONSTANT_MEMBER
  • privateFunction
  • param_
  • приватная кнопка окбу; //и т.д. ограничить 3 символа
  • struct SOMESTRUCT // для структуры pinvoke

Области общего кода и расположение файлов:

  • члены
    • (приватный | внутренний | защищенный | публичный) X [статический] X [постоянный / только для чтения]
  • свойства
    • (приватный | внутренний | защищенный | публичный) X [статический] X [только для чтения]
  • Конструкторы
    • (приватный | внутренний | защищенный | публичный) X [статический]
  • Команды // что-нибудь с пустым возвратом или возвращением статуса
    • (открытый | защищенный | внутренний | закрытый) X [статический]
  • Обработчики событий / частные /
    • (Управление | Удаленный | Сервис | Другое) События
  • Функции // запрашивают состояние, не должны иметь побочных эффектов
    • (открытый | защищенный | внутренний | закрытый) X [статический]
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.