Хорошие примеры венгерской записи? [закрытый]

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

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

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
16
задан Lance Roberts 14 March 2013 в 23:36
поделиться

20 ответов

Теперь классическая статья, как упомянуто в других венгерских сообщениях, является той от сайта Joel:

http://www.joelonsoftware.com/articles/Wrong.html

28
ответ дан 30 November 2019 в 15:01
поделиться

Проблема с выяснением хороших примеров Венгерской записи состоит в том, что общая попытка иметь их собственную идею того, на что похож хороший пример. Мое личное мнение - то, что лучшее Венгерская запись никакая Венгерская запись . Нотация была первоначально предназначена для обозначения предназначенное использование из переменной, а не ее типа, но это обычно используется для получения информации о типе, особенно для средств управления Формой (например, txtFirstName для текстового поля для чьего-то имени.). Это делает код менее удобным в сопровождении, с точки зрения удобочитаемости (например, "предварительно прикрепите nounTerms prepOf nounReadability"), и осуществляющий рефакторинг для того, когда тип должен быть изменен (существуют "lParams" в API Win32, которые изменили тип).

необходимо, вероятно, рассмотреть не использование его вообще. Примеры:

  • strFirstName - это может просто быть firstName, так как очевидно, для чего это, тип не настолько важен и должен быть очевидным в этом случае. Если не очевидный, IDE может помочь Вам с этим.
  • txtFirstName - это может измениться на [1 120] FirstNameTextBox или FirstName_TextBox. Это читает лучше, и Вы знаете, что это - управление и не только текст.
  • CAccount - C использовался для имен классов в MFC, но Вам действительно не нужен он. Учетная запись достаточно хороша. Прописное имя является стандартным соглашением для типов (и они только появляются в определенных местах, таким образом, они не запутаются со свойствами или методами)
  • , ixArray (индекс к массив ) - ix немного неясен. Попробуйте arrayIndex.
  • usState (небезопасная строка для состояние ) - похож на "штат США". Лучше пойдите с [1 127] состояние _ UnsafeString или что-то. Возможно, даже оберните его в класс UnsafeString , чтобы, по крайней мере, сделать его безопасным с точки зрения типов.
38
ответ дан 30 November 2019 в 15:01
поделиться

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

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

Один последующий прием в Венгерской записи является "изменением тип переменной, но оставьте имя переменной без изменений". Это почти неизменно сделано в приложениях Windows с миграцией от Win16:-WndProc (HWND hW, WORD wMsg, WORD wParam, ДЛИННЫЙ lParam) к Win32 WndProc (HWND hW, UINT wMsg, WPARAM wParam, LPARAM lParam), где значения w подсказывают, что они - слова, но они действительно обращаются к longs. Действительное значение этого подхода прибывает ясное с миграцией Win64, когда параметры будут 64 бита шириной, но старый "w" и "l" префиксы останутся навсегда.

0
ответ дан 30 November 2019 в 15:01
поделиться

Я только когда-либо использую p для указателя, и вот именно. И это - то, только если я нахожусь в C++. В C# я не использую венгерской записи. например,

MyClass myClass;
MyClass* pMyClass;

Это - все:)

Редактирование: , О, я просто понял, что это - ложь. Я использую "m _" для членских переменных также. например,

class
{
private:
bool m_myVar;
}
1
ответ дан 30 November 2019 в 15:01
поделиться

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

Однако иногда Вы использовали бы Венгерскую запись в дополнение к хорошему переменному именованию. m_ numObjects имеет два "префикса": m_ и цифра. м _ указывает на объем: это - элемент данных, связанный с это . цифра указывает на то, что значение .

я не чувствую себя препятствованным вообще, когда я считал "хороший" код, даже если он действительно содержит некоторый "венгерский язык". Право: Я считал код, я не нажимаю его. (На самом деле я едва использую свою мышь когда-либо при кодировании или любые определенные для шаманского программирования функции поиска.)

меня замедляют, когда я считал вещи как m_ ubScale ( да, я смотрю на Вас, Liran! ), поскольку я должен посмотреть на его использование (никакие комментарии!) для обнаружения то, что это масштабирует (если вообще?) и это - тип данных (который, оказывается, символ фиксированной точки). Лучшее имя было бы m_scaleFactor или m_zoomFactor с комментарием как число фиксированной точки, или даже определение типа. (На самом деле определение типа было бы полезно, поскольку существует несколько других членов нескольких классов, которые используют тот же формат фиксированной точки. Однако некоторые не делают, но все еще маркированы m_ubWhatever! Сбивающий с толку, по меньшей мере.)

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

Просто мой 2Вў.

2
ответ дан 30 November 2019 в 15:01
поделиться

Я соглашаюсь, что Венгерская запись больше не особенно полезна. Я думал, что его исходное намерение состояло в том, чтобы указать не на тип данных, а скорее тип объекта. В секции кода, включающей имена клиентов, сотрудников и пользователя, например, Вы могли назвать локальные строковые переменные cusName, empName и usrName. Это помогло бы различать подобно звучащие имена переменной. Те же префиксы для объектов использовались бы всюду по приложению. Однако, когда OO используется, и Вы имеете дело с объектами, те префиксы избыточны в Клиенте. Имя, Сотрудник. Имя и Пользователь. Имя.

2
ответ дан 30 November 2019 в 15:01
поделиться

В дополнение к использованию 'p' для указателя, мне нравится идея использовать 'cb' и 'cch', чтобы указать, является ли параметр размера буфера (или переменная) количеством байтов или счетчика символов (я также видел - редко - 'ce', раньше указывал на количество элементов). Таким образом вместо того, чтобы передать тип, префикс передает использование или намерение.

я признаю, я не использую префикс так же последовательно, как я, вероятно, должен, но мне нравится идея.

2
ответ дан 30 November 2019 в 15:01
поделиться

Я нахожу, что единственная полезная точка при объявлении интерфейсных средств управления, txtUsername, txtPassword, ddlBirthMonth. Это не прекрасно, но это помогает на больших формах/проектах.

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

2
ответ дан 30 November 2019 в 15:01
поделиться

m

При использовании ORM (те, которые в спящем режиме) Вы склонны иметь дело управляемые и неуправляемые объекты. Изменение управляемого объекта будет отражено в базе данных, не называя явное сохранение, в то время как контакт с объектом managaged требует явного вызова сохранения. То, как Вы имеете дело с объектом, будет отличаться, в зависимости от которого это.

2
ответ дан 30 November 2019 в 15:01
поделиться

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

Один пример, от статьи, кодируется по сравнению с не закодированные строки, не то, чтобы необходимо использовать венгерский язык 'нас' для небезопасных строк и' для безопасных строк, случается так, что Вы должны иметь [приблизительно 110] идентификатор, чтобы указать, что строка или безопасна или нет. Если это становится стандартным, становится легко видеть, когда стандарт повреждается.

3
ответ дан 30 November 2019 в 15:01
поделиться

Венгерская запись (преобразование регистра верблюда, поскольку я изучил его) неоценима при наследовании проекта программного обеспечения.

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

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

4
ответ дан 30 November 2019 в 15:01
поделиться

Единственный венгр это действительно полезно больше, является m_ для членских переменных. (Я также использую sm_ для статических участников, потому что это - "другой" объем, который все еще существует.) С широкоэкранными мониторами и компиляторами, которые берут eight-billion-character-long имена переменной, сокращение имен типов просто не стоит того.

4
ответ дан 30 November 2019 в 15:01
поделиться

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

5
ответ дан 30 November 2019 в 15:01
поделиться

Адвокат Дьявола: лучший пример Венгерской записи не должен использовать его.: D

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

можно также войти в упорядочивание проблем с нотацией. Если Вы используете p для указателя, и для адреса Вы называете свою переменную apStreet или paStreet? Удобочитаемость уменьшена, когда у Вас нет непротиворечивости, и необходимо израсходовать ценное пространство ума, когда необходимо помнить порядок, в котором необходимо записать нотацию.

5
ответ дан 30 November 2019 в 15:01
поделиться

Не используйте язык определенные префиксы.

Мы используем:

n: Number 
p: Percentage 1=100% (for interest rates etc)
c: Currency
s: String
d: date
e: enumeration
o: object (Customer oCustomer=new Customer();)
...

Мы используем ту же систему для всех языков:

SQL
C
C#
Javascript
VB6
VB.net
...

Это - жизненное средство сохранения.

6
ответ дан 30 November 2019 в 15:01
поделиться

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

то, Где венгерский язык полезен, должно различать логически различные виды переменных, которые имеют тот же необработанный тип. Например, при использовании ints для представления координат, Вы могли бы снабдить префиксом координаты x x, y координаты с y и расстояния с d. Таким образом, у Вас был бы код, который похож

dxHighlight = xStart - xEnd

yHighlight = yLocation + 3

yEnd = yStart + dyHeight

dyCode = dyField * 2

и так далее. Это полезно, потому что можно определить ошибки сразу: Если Вы добавляете dy к y, Вы всегда получаете y. При вычитании двух x's, Вы всегда получаете дуплекс. При умножении dy на скаляр Вы всегда получаете dy. И так далее. Если Вы видите строку как [1 111]

yTop = dyText + xButton

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

9
ответ дан 30 November 2019 в 15:01
поделиться

t

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

15
ответ дан 30 November 2019 в 15:01
поделиться

p

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

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

17
ответ дан 30 November 2019 в 15:01
поделиться

Очень старый вопрос, но вот пара «венгерских» префиксов, которые я регулярно использую:

my

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

myStart = GetTime();
doComplicatedOperations();
print (GetTime() - myStart);

и

tmp

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

tmpX = X; 
tmpY = Y;
X = someCalc(tmpX, tmpY);
Y = otherCalc(tmpX, tmpY);

и иногда старые и новые по тем же причинам, что и ] tmp , обычно в более длинных циклах или функциях.

2
ответ дан 30 November 2019 в 15:01
поделиться

Я обнаружил, что использую 'w', означающее 'рабочий', в качестве префикса вместо 'temp' или 'tmp' для локальных переменных, которые используются только для управления данными, например:

Public Function ArrayFromDJRange(rangename As Range, slots As Integer) As Variant

' this function copies a Disjoint Range of specified size into a Variant Array 7/8/09 ljr

Dim j As Integer
Dim wArray As Variant
Dim rCell As Range

wArray = rangename.Value ' to initialize the working Array
ReDim wArray(0, slots - 1) ' set to size of range
j = 0

For Each rCell In rangename
    wArray(0, j) = rCell.Value
    j = j + 1
Next rCell

ArrayFromDJRange = wArray

End Function
0
ответ дан 30 November 2019 в 15:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: