Почему я не должен использовать “Венгерскую запись”?

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

122
задан 6 revs, 3 users 38% 23 May 2017 в 12:34
поделиться

34 ответа

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

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

Вид неопределенного понятия для объяснения но я думаю, что это работает.

, Например, если Вам сохранили имя клиента в переменной customerName, Вы не должны заботиться, является ли это строка или некоторый другой класс. Более важный для размышления, что Вы хотите от этого объекта. Вы хотите, чтобы это распечатало (), getFirstName (), getLastName (), convertToString () и т.д., После того как Вы делаете это экземпляром Строкового класса и берете его, как предоставлено, Вы ограничиваете себя и Ваш дизайн, так как необходимо создать всю другую логику, в которой Вы нуждаетесь в другом месте в коде.

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

В течение многих лет я использовал Венгерскую запись в своем программировании. Кроме некоторой визуальной помехи и задачи изменения префикса, когда я изменил тип данных, никто не мог убедить меня иначе. До недавнего времени - когда я должен был объединить существующий C# и блоки VB.NET в том же решении.

результат: Я должен был передать "fltSomeVariable" "sngSomeVariable" параметру метода. Как раз когда кто-то, кто программирует и в C# и в VB.NET, он застал меня врасплох и сделал меня паузой на мгновение. (C# и VB.NET иногда используют различные имена для представления совпадающего типа данных - плавание и единственный, например.)

Теперь рассматривают это: что, если Вы создаете COM-компонент, это является вызываемым со многих языков? VB.NET и "преобразование" C# были легки для программиста.NET. Но что относительно кого-то, который разрабатывает в C++ или Java? "dwSomeVariable" значит что-нибудь для разработчика.NET, не знакомого с C++?

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

Если Вы не знаете тип переменной без того, чтобы быть сказанным, Вы, вероятно, не должны смешивать с ним так или иначе

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

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

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

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