Должен ли я использовать нотацию венгерских приложений в C #? - PullRequest
3 голосов
/ 01 декабря 2011

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

Обычно, когда я программирую, я следую нескольким правилам о префиксах:

  • m_ перед элементами
  • p_ перед свойствами
  • s_ передстатического
  • a_ перед параметрами
  • l_ перед локальными переменными

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

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

Оправдывает ли этот пример использование венгерской нотации?

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

Аргумент против венгерского:

Class.Robot или Robot

this.robot

robot

Нет необходимости в венгерском языке.

Счетчик:

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

Кроме того, допустим, вы хотите получить доступ к статической переменной Strawberry, откуда вы знаете переменную-член с именем Strawberry isnне определены?Возможно, он определен в другом файле, который вы не можете видеть, поэтому вы можете получить неожиданные результаты.Теперь вы можете сказать, что это видно через IDE, но я привожу аргумент о том, что использование префикса лучше, потому что вы видите, на что ссылаетесь, в то время как вы можете пропустить то, что говорит вам IDE.Вы также можете использовать префиксы / Classname, конечно, но такого рода поражения с целью не использовать венгерскую нотацию.

Аргумент против венгерского:

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

Счетчик:

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

Аргумент против венгерского:

Современные редакторы кода, такие как Visual Studio, упрощают идентификацию информации о типе для переменной или поля, обычно путем наведения курсора мыши на имя переменной.Это уменьшает потребность в венгерской нотации.

Счетчик:

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

Примечание:

Не рекомендует ли Microsoft использовать венгерскую нотацию для имен файлов?Я прочитал, что это условное обозначение файлов интерфейса перед I, это форма венгерской нотации.Хотя это не имеет прямого отношения к моему вопросу выше, оно поднимает вопрос о том, что иногда рекомендуется использовать венгерские обозначения.

Ответы [ 5 ]

10 голосов
/ 01 декабря 2011

Нет, не делай этого.Это делает код сложнее для чтения.Если вы пишете по-английски с каждым глаголом с v_ и каждым существительным с n_, это усложнит чтение предложения при добавлении информации, которая в большинстве случаев бесполезна.

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

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


  • TypeName FieldNamesMustNotUseHungarianNotation
  • CheckId SA1305
  • Правила именования категорий

Причина

В имени поля или переменной в C # используется венгерская запись.

Описание правила

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

Кроме того, современные редакторы кода, такие как Visual Studio, упрощают идентификацию информации о типе для переменной или поля, обычно путем наведения курсора мыши на имя переменной.Это уменьшает потребность в венгерской нотации.

4 голосов
/ 01 декабря 2011

Нет, не используйте венгерскую нотацию.Во-первых, это так 1990-х годов.Во-вторых, на вас могут напасть ваши коллеги ...; -)

Пример вашего робота:

Class.Robot или Robot

this.robot

robot

Нет необходимости в венгерском языке.

3 голосов
/ 01 декабря 2011

Ответ - нет, как все уже написали здесь.

Прежде всего: вы на самом деле не используете венгерскую нотацию - или ее известный вариант - как вы сами заявляете в вопросе.

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

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

Согласие здесь похоже на «Нет», и я яростно на этой стороне. Игнорируя стандартные аргументы о нотации венгриона (я отклоняю их как «не совсем релевантные»):

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

    public Foo (строковый робот) { this.robot = робот; }

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

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

2 голосов
/ 01 декабря 2011

но мне нравится иметь хороший набор правил в моей голове, который я могу применить последовательно

Даже лучше, чем набор правил в вашей голове, это набор правил в вашей IDE / системе сборки: вам следует проверить StyleCop

StyleCop позволит вам настроить ваши правила кодирования так, как вам нравится, но по умолчанию предлагает популярную альтернативу венгерской нотации приложений, которую вы описываете:

  • поля: this.myField
  • свойства: this.MyProperty
  • методы: this.MyMethod()
  • статика: MyClass.MyStaticMethod()
  • и т.д.

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

1 голос
/ 01 декабря 2011

У меня для себя есть соглашение, которому я следую.Это правда, что современные IDE убирают много подобных вещей, но все же я думаю, что немного венгерский :).Я использую:

robot_ для атрибутов (ms рекомендует использовать this.robot, но вот так я не могу забыть это)
camelCase для локальных переменных и частных / защищенных / внутренних методов
PascalCase для открытых свойств или методов

И это все :).Я думаю, что код выглядит очень странно со всеми этими m_, a_, ... вещами, которые мне трудно читать.Наведение указателя мыши на код в VS дает вам подсказки, но я вижу некоторые дополнительные преимущества в использовании какого-то соглашения.

Я имею в виду, что даже ms использует некую венгерскую нотацию для постфиксации всех асинхронных функций с помощью Async или префикса всехинтерфейсы с I

...