Должен ли я использовать нотацию венгерских приложений в C#?
Я знаю, что этот вопрос задавался чуть-чуть, и, судя по всему, нет четкого ответа "да" или "нет" на этот вопрос, но, тем не менее, я немного смущен чем-то.
Обычно, когда я программирую, я следую нескольким правилам о префиксах:
- м перед членами
- p_ перед свойствами
- s_ перед статическим
- перед параметрами
- l_ перед локальными переменными
Я получил новую работу прямо сейчас, и я заметил, что префиксы не используются в коде. Я спросил почему, и они ответили, что IDE выполняют всю работу по отслеживанию того, что является переменной-членом и что является локальной переменной. Теперь я думаю, что это может быть так, но не проще ли использовать префиксы в любом случае?
Я имею в виду, если у меня, например, есть член, статическая и локальная переменная с именем "robot", не будет ли боль в заднице ссылаться на нее при написании метода? Возможно, это нереальный пример, но мне нравится иметь хороший набор правил в моей голове, который я могу применять последовательно, даже для нереальных условий.
Оправдывает ли этот пример использование венгерской нотации?
Я думаю, что я сделаю список плюсов / минусов и отредактирую его, когда узнаю больше об этом.
Аргумент против венгерского:
Class.Robot
или же Robot
this.robot
robot
Нет необходимости в венгерском.
Счетчик:
Есть еще несоответствие, робот может означать разные вещи в разных методах. Чтобы оставаться последовательным, вы должны ставить префикс Class или этот (или ничего) перед каждой переменной Robot.
Кроме того, допустим, вы хотите получить доступ к статической переменной Strawberry. Откуда вы знаете, что переменная-член с именем Strawberry не определена? Возможно, он определен в другом файле, который вы не можете видеть, поэтому вы можете получить неожиданные результаты. Теперь вы можете сказать, что это видно через IDE, но я привожу аргумент, что использование префикса лучше, потому что вы видите, на что ссылаетесь, и можете упустить то, что говорит вам IDE. Конечно, вы также можете использовать префиксы /Classname, но это побеждает цель не использовать венгерскую нотацию.
Аргумент против венгерского:
Нарушение этого правила происходит, когда в именах полей и переменных используется венгерская нотация. Использование венгерской нотации стало широко распространенным в коде C++, но тенденция в C# заключается в использовании более длинных, более описательных имен для переменных, которые не основаны на типе переменной, но вместо этого описывают, для чего используется переменная.
Счетчик:
Префиксы, которые я упоминал, не основаны на типе переменной, префиксы действительно указывают, для чего используется переменная.
Аргумент против венгерского:
современные редакторы кода, такие как Visual Studio, упрощают идентификацию информации о типе для переменной или поля, обычно путем наведения курсора мыши на имя переменной. Это уменьшает потребность в венгерской нотации.
Счетчик:
Хотя это и правда, я сам почти никогда не нахожу указатель мыши над именем переменной, если не произошла ошибка. Напротив, с венгерской нотацией вы сразу видите, где находится ваша переменная в классе.
Примечание:
Разве Microsoft не рекомендует использовать венгерскую нотацию для имен файлов? Я прочитал, что это условное обозначение файлов интерфейса перед I, это форма венгерской нотации. Хотя это не имеет прямого отношения к моему вопросу выше, это поднимает вопрос о том, что иногда рекомендуется использовать венгерские обозначения.
5 ответов
Нет, не делай этого. Это делает код сложнее для чтения. Если вы пишете по-английски с каждым глаголом с v_ и каждым существительным с n_, это усложнит чтение предложения при добавлении информации, которая в большинстве случаев бесполезна.
Если ваши классы хорошо разработаны с небольшим количеством обязанностей и коротких методов, не должно быть слишком сложно выяснить, что означает каждая переменная из имени и контекста, в котором она используется. Когда это неочевидно и вам нужно знать, это легко выяснить: вы можете просто навести указатель мыши на имя переменной или нажать "Перейти к определению".
У StyleCop есть правило, которое предупреждает, когда вы используете венгерскую нотацию. В описании правила есть небольшое объяснение того, почему это правило существует:
- TypeName FieldNamesMustNotUseHungarianNotation
- CheckId SA1305
- Правила именования категорий
причина
Имя поля или переменной в C# использует венгерскую нотацию.
Описание правила
Нарушение этого правила происходит, когда в именах полей и переменных используется венгерская нотация. Использование венгерской нотации стало широко распространенным в коде C++, но тенденция в C# заключается в использовании более длинных, более описательных имен для переменных, которые не основаны на типе переменной, но вместо этого описывают, для чего используется переменная.
Кроме того, современные редакторы кода, такие как Visual Studio, упрощают идентификацию информации о типе для переменной или поля, обычно путем наведения курсора мыши на имя переменной. Это уменьшает потребность в венгерской нотации.
Нет, не используйте венгерскую нотацию. Во-первых, это так 1990-х годов. Во-вторых, на вас могут напасть ваши коллеги...;-)
Пример вашего робота:
Class.Robot
или же Robot
this.robot
robot
Нет необходимости в венгерском.
Ответ - нет, как все уже написали здесь.
Прежде всего: вы на самом деле не используете венгерскую нотацию - или ее известный вариант - как вы сами заявляете в вопросе.
Итак, давайте начнем с проблемы, заключающейся в том, что вы используете соглашение об именах, созданное вами и не получившее широкого распространения. Это приводит к немедленным проблемам, как только вы открываете свой код в реальном мире - как ваши новые коллеги. Вы просто изобретаете частный третий (nth?) Вариант этой записи префикса, со всеми проблемами, которые включает в себя что-то необычное для других людей.
Теперь - это изменение к лучшему? Вы правы, и другие люди должны адаптироваться, чтобы извлечь выгоду из этого набора правил?
Консенсус здесь, похоже, "Нет", и я очень на этой стороне. Игнорируя стандартные аргументы о нотации венгриона (я отклоняю их как "не совсем уместные"):
Не используйте имена, чтобы много значить. Единственное исключение, которое все еще кажется распространенным, - иметь конструктор, принимающий аргумент с тем же именем, что и у поля:
public Foo (string robot) {this.robot = робот; }
Если у вас есть проблемы с управлением большим количеством имен в вашем коде, скорее всего, у вас их слишком много в одном месте / в области видимости. Вы пытаетесь решить запах кода с помощью (вонючей, согласно достигнутому здесь консенсусом) решения
Чтобы повторить это один раз: вы приходите к команде людей, которые не используют ваше соглашение (и как они могли - кажется, это ваше собственное дело...), поэтому вы должны приспособиться к команде. Вы можете спорить о личной читабельности и можете попросить своих коллег пересмотреть, но если они не согласны с этим стилем: не боритесь с этим. Ты просто делаешь себя несчастным, если настаиваешь на том, чтобы быть правым, а они - неправильным. Не позволяйте этому истощать вашу производительность.
но мне нравится иметь хороший набор правил в моей голове, который я могу применять последовательно
Даже лучше, чем набор правил в вашей голове, набор правил в вашей IDE/ системе сборки: так что вы должны проверить StyleCop
StyleCop позволит вам настроить ваши правила кодирования так, как вам нравится, но по умолчанию предлагает популярную альтернативу венгерской нотации приложений, которую вы описываете:
- поля:
this.myField
- свойства:
this.MyProperty
- методы:
this.MyMethod()
- статика:
MyClass.MyStaticMethod()
- и т.п.
Вы найдете бесконечное обсуждение этого аспекта стиля кодирования как в stackru, так и в других местах, поэтому я ожидаю, что этот вопрос будет закрыт как дубликат....
У меня для себя есть соглашение, которому я следую. Это правда, что современные IDE убирают много подобных вещей, но все же я думаю, что немного венгерский:). Я использую:
robot_ для атрибутов (MS рекомендует использовать this.robot, но я не могу забыть это)
camelCase для локальных переменных и частных / защищенных / внутренних методов
PascalCase для открытых свойств или методов
И это все:). Я думаю, что код выглядит очень странно со всеми этими m_, a_, ... вещами, которые мне трудно читать. Навигация над кодом в VS дает вам подсказки, но я вижу некоторые дополнительные преимущества в использовании каких-то соглашений.
Я имею в виду, что даже ms использует какую-то венгерскую нотацию для постфиксации всех асинхронных функций с помощью Async или префикса для всех интерфейсов с помощью I