Венгерская запись в C # - PullRequest
       37

Венгерская запись в C #

33 голосов
/ 20 апреля 2009

До использования C # C ++ был моим основным языком программирования. И венгерская нотация глубоко в моем сердце.

Я сделал несколько небольших проектов на C #, не читая книги по C # или других рекомендаций по языку. В этих маленьких проектах на c # я использовал что-то вроде

private string m_strExePath;

Пока я не прочитал что-то от ТАК, которое говорило:

Не используйте венгерские обозначения.

Так почему? Я единственный человек, который имеет m_strExePath или m_iNumber в моем коде C #?

Ответы [ 18 ]

48 голосов
/ 20 апреля 2009

У Джоэла Спольски действительно хорошая статья на эту тему. Вкратце, есть два типа венгерской нотации, которые используются на практике.

Первым является «Системный венгерский язык», в котором вы указываете тип переменной с помощью префикса. Такие вещи, как "str" ​​для строки. Это почти бесполезная информация, тем более что современные IDE все равно сообщат вам тип.

Второй - «Apps Hungarian», в котором вы указываете предназначение переменной с префиксом. Наиболее распространенным примером этого является использование «m_» для указания переменных-членов. Это может быть очень полезно, если все сделано правильно.

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

Самая интересная часть этой статьи - то, что оригинальный изобретатель венгерской нотации Чарльз Симони создал «Apps Hungarian», но его статья была ужасно неправильно истолкована, и в результате была создана мерзость «Systems Hungarian».

32 голосов
/ 20 апреля 2009

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

lblTitle = Label
txtTitle = TextBox
ddlTitle = DropDownList

Мне легче читать и разбирать. В противном случае венгерская нотация не подходит из-за достижений в среде IDE, особенно в Visual Studio.

Кроме того, у Joel on Software есть отличная статья, связанная с венгерской нотацией, под названием: Создание неправильного кода выглядит неправильно , в котором приводятся некоторые аргументы для Венгерской нотации.

30 голосов
/ 20 апреля 2009

Вы не единственный человек, но я бы сказал, что это относительно необычно. Лично я не фанат венгерской нотации, по крайней мере, не в том простом смысле, который просто повторяет информацию о типах, которая уже присутствует в объявлении. (Поклонники «истинной» венгерской нотации объяснят разницу - меня это никогда не беспокоило, но я вижу их точку зрения. Если вы используете общий префикс, скажем, для единиц длины по сравнению с единицами веса, вы не случайно присвойте переменную длины со значением веса, хотя оба могут быть целыми числами.)

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

21 голосов
/ 20 апреля 2009

Нет, вы не единственный, кто это делает. Просто общепризнанно, что венгерская нотация - не лучший способ называть вещи в C # (IDE много решает проблемы, которые венгерская нотация пыталась решить).

13 голосов
/ 20 апреля 2009

Венгерская запись - ужасная ошибка на любом языке. Вы не должны использовать его в C ++. Назовите свои переменные, чтобы вы знали, для чего они. Не называйте их так, чтобы они дублировали информацию о типах, которую IDE может предоставить вам в любом случае и которая может измениться (и, как правило, не имеет значения в любом случае. Если вы знаете, что что-то является счетчиком, тогда не имеет значения, является ли это int16, 32 или 64. Вы знаете, что он действует как счетчик, и поэтому любая действующая на счетчике операция должна быть действительной. Тот же аргумент для координат X / Y. Они являются координатами. Не имеет значения, являются ли они плавающими или удваивается. Может быть уместно узнать, указано ли значение в единицах веса, расстояния или скорости. Неважно, что это число с плавающей точкой.).

На самом деле, венгерская нотация возникла лишь как недоразумение. Изобретатель намеревался использовать его для описания «концептуального» типа переменной (это координата, индекс, счетчик, окно?)

И люди, которые читали его описание, предполагали, что под "типом" он подразумевал фактический тип языка программирования (int, float, строка с нулем в конце, указатель на символ)

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

Так почему? Я единственный человек, который имеет m_strExePath или m_iNumber в моем C # код

Нет. К сожалению нет. Скажите, что было бы exePath, если бы не было строкой? Почему я, читатель вашего кода, должен знать, что это строка? Разве недостаточно знать, что это путь к исполняемому файлу? m_iNumber просто плохо назван. Какой номер это? Для чего это? Вы только что дважды сказали мне, что это число, но я до сих пор не знаю, что означает число.

10 голосов
/ 20 апреля 2009

Вы, конечно, не единственный человек, но я надеюсь, что вы являетесь частью убывающей тенденции:)

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

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

Вместо использования имен для реализации системы типов, просто полагайтесь на систему типов. Имеет автоматическую проверку и поддержку инструмента. Более новые IDE значительно облегчают поиск типа переменной (intellisense, подсказок при наведении курсора и т. Д.) И действительно устраняют первоначальное стремление к венгерской нотации.

6 голосов
/ 20 апреля 2009

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

5 голосов
/ 20 апреля 2009

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

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

Что касается веских причин не использовать его, то их немало. Во-первых, в C # и, в этом отношении, в C ++ и во многих других областях, вы часто создаете свои собственные типы, так что же будет венгерским для типа «MyAccountObject»? Даже если вы можете выбрать разумные венгерские нотации, это все равно делает реальное имя переменной немного труднее для чтения, потому что вы должны пропустить "LPZCSTR" (или что-то еще) в начале. Однако более важна стоимость обслуживания, что если вы начнете со Списка и перейдете на другой тип коллекции (то, чем я, похоже, сейчас занимаюсь)? Затем вам нужно переименовать все ваши переменные, которые используют этот тип, и все это без реальной выгоды. Если бы вы только начали использовать приличное имя, вам не пришлось бы об этом беспокоиться.

В вашем примере, что если вы создали или использовали какой-то более значимый тип для удержания пути (например, Path), вам нужно изменить m_strExePath на m_pathExePath, что является болью, и в этом случае на самом деле не очень полезно.

5 голосов
/ 20 апреля 2009

, если вы не используете текстовый редактор, а не VS IDE, венгерская нотация имеет мало значения и скорее ухудшает, чем улучшает читаемость

3 голосов
/ 20 апреля 2009

Единственные две области, где я в настоящее время вижу любую форму венгерской нотации:

  • Переменные-члены класса с начальным подчеркиванием (например, _someVar)
  • Имена элементов управления WinForms и WebForms (btn для кнопки, lbl для метки и т. Д.)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...