Изо всех сил, чтобы не использовать венгерскую запись

10

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

Допустим, у меня есть веб-форма для сбора адресов электронной почты и их хранения в таблице базы данных, и кнопка, которая вызывает функцию, которая сохраняет адрес в БД.

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

Какова была бы лучшая практика для именования этих переменных

  • не прибегая к венгерским системам,
  • не делая их слишком долго или запутанным
  • и с четким соглашением использовать во всем моем проекте?
fearoffours
источник
2
Возможно, что-то не так с остальными соглашениями об именах или размером функций, если у вас возникают проблемы с поиском уникальных имен.
Какие технологии вы используете? Эти префиксы, похоже, пригодны для веб-форм.
StuperUser
Я использую ASP.NET (с C # позади)
fearoffours
@delnan - не могли бы вы уточнить, пожалуйста? Почему размер функции делает именование уникальным?
fearoffours
@fearofours: меньшая функция нуждается в меньшем количестве переменных, и меньшее количество переменных, очевидно, означает меньшее количество переменных столкновений. Это предполагает, конечно, что вы помещаете каждую переменную в наименьшую возможную область видимости.

Ответы:

8

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

Ваши два других пункта, кажется, спрашивают об альтернативе. Я не уверен, что вам нужна альтернатива; Дело в том, что венгерский язык больше не популярен, потому что он использовался для описания типа, когда система типов и инструменты были немного, скажем так, менее строгими. Т.е., если вы программировали на C и передавали указатели, единственный способ отслеживать тип - это использовать венгерский. Теперь, если вы используете такой язык, как C # или Java, вы не будете использовать указатели (или очень редко), поэтому необходимость в любом виде венгерского языка исчезает. Кроме того, современные интегрированные среды разработки позволяют очень легко увидеть тип, наведя указатель мыши на переменную, или, в худшем случае, с помощью некоторого сокращения, чтобы увидеть исходное объявление. Итак, я не думаю, что вам нужны какие-либо обозначения, просто назовите переменную по тому, что она делает. Если это адрес электронной почты, просто используйте «электронная почта» или «

Стив
источник
2
Это становится немного сложнее, когда форма / страница / окно / что-либо имеет кнопку для электронной почты, текстовое поле для электронной почты и, возможно, другой виджет / элемент управления для электронной почты ...
FrustratedWithFormsDesigner
7
@FrustratedWithFormsDesigner Не обязательно. Текстовое поле может быть emailAddressInput, где в качестве кнопки будет emailAddressSubmit, а внутренним представлением будет просто emailAddress.
Джонатан
@ Джонатан: Хороший вопрос.
FrustratedWithFormsDesigner
3

При работе с веб-формами / формами Windows / другими графическими элементами имеет смысл использовать Systems Hungarian, поскольку у вас могут быть элементы управления, которые очень тесно связаны друг с другом - например, текстовое поле и метка, которые идут вместе; Вы могли бы назвать их txtEmailи lblEmailразличать их. По моему опыту, это распространено и действительно полезно.

Но в вашем коде позади такого рода наименования нет необходимости. Если у вас есть переменная типа string, которая используется для хранения электронной почты, просто назовите ее email. Если по какой-то причине вы запутались, большинство IDE должны позволить вам навести курсор на него и увидеть его тип. (В идеале, в вещах OO это может быть атрибут какого-то объекта, и user.Emailэто даже более понятно.)

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

Эндрю Арнольд
источник
1
На самом деле txt и lbl не являются венгерскими, txt - это просто короткий текст, а lbl - короткий для Label, нет причин не просто использовать слово полной длины, например EmailText и EmailLabel в форме. Тип венгерский, который в обоих случаях является строкой.
Стив
1
@ Стив Хай - Нет, я говорю о самих элементах управления. У вас есть объект типа «textbox» с именем txtEmail и объект типа «label» с именем lblEmail. Ни один из них не является строками. Они могут иметь строковые свойства, но сами по себе они не являются строками.
Эндрю Арнольд
1
Ах, прости. Ну конечно; естественно. Тем не менее, нет причин не использовать более описательное имя, например EmailTextBox. То, что VS генерирует плохое имя, не означает, что вы должны его сохранить. Однако в контексте форм аббревиатуры txt и lbl настолько хорошо понятны, что в этом случае я бы не стал беспокоиться.
Стив
3

Что делает переменную "более длинной"?

Вместо того txtEmail, btnEmailвы могли бы использовать UserEmailText, UserEmailButtonи AdminEmailText,AdminEmailButton

Проблема в том, что вы можете начать чувствовать, что переменная начинает становиться длинной:

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

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

class EmailForm
  var textBox, button, text
  function storeEmail()

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

userEmailForm = new EmailForm(...data...)
adminEmailForm = new EmailForm(...different data...)
doSomething( userEmailForm.text )
doSomethingElse( adminEmailForm.text )

Конечно, это нацелено на языки, которые используют парадигму ООП, но большинство популярных языков веб-разработки являются объектно-ориентированными или допускают объектно-ориентированный код (PHP, Python, C #, C ++, Java, JavaScript, ActionScript и т. Д. ).

zzzzBov
источник
Я не вижу преимущества UserEmailText для txtEmail - вы просто используете суффикс типа, а не префикс. Мне нравится "Это то, для чего предназначен ООП".
fearoffours
@fearoffours, OP признал наличие проблемы с уникальными именами, я добавил этот пример в качестве описательного способа различения двух похожих переменных ( UserEmailTextи AdminEmailTextособенно). Я обычно использую суффиксы типов, поскольку это позволяет перейти к классу UserEmailText-> UserEmail.text-> в User.email.textзависимости от того, сколько абстракции / функциональности необходимо.
zzzzBov
Хорошо, посмотри, куда ты идешь оттуда. +1 за сравнение суффикса / класса. О, и я ОП!
fearoffours
@fearoffours, lol whoops ...
zzzzBov