Лучший способ изучить лучшие практики.NET/ООП? [закрытый]

Что такое NullPointerException?

Хорошим местом для начала является JavaDocs . Они охватывают это:

Брошено, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  • Вызов метода экземпляра нулевого объекта.
  • Доступ или изменение поля нулевого объекта.
  • Выполнение длины null, как если бы это был массив.
  • Доступ или изменение слотов с нулевым значением, как если бы это был массив.
  • Бросать нуль, как если бы это было значение Throwable.

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

blockquote>

Также, если вы попытаетесь использовать нулевую ссылку с synchronized, который также выдаст это исключение, за JLS :

SynchronizedStatement:
    synchronized ( Expression ) Block
  • В противном случае, если значение выражения равно null, NullPointerException.
blockquote>

Как это исправить?

Итак, у вас есть NullPointerException. Как вы это исправите? Возьмем простой пример, который выдает NullPointerException:

public class Printer {
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public void print() {
        printString(name);
    }

    private void printString(String s) {
        System.out.println(s + " (" + s.length() + ")");
    }

    public static void main(String[] args) {
        Printer printer = new Printer();
        printer.print();
    }
}

Идентифицирует нулевые значения

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

Exception in thread "main" java.lang.NullPointerException
    at Printer.printString(Printer.java:13)
    at Printer.print(Printer.java:9)
    at Printer.main(Printer.java:19)

Здесь мы видим, что исключение выбрано в строке 13 (в методе printString). Посмотрите на строку и проверьте, какие значения равны нулю, добавив протоколирующие операторы или используя отладчик . Мы обнаруживаем, что s имеет значение null, а вызов метода length на него вызывает исключение. Мы видим, что программа перестает бросать исключение, когда s.length() удаляется из метода.

Трассировка, где эти значения взяты из

Затем проверьте, откуда это значение. Следуя вызовам метода, мы видим, что s передается с printString(name) в методе print(), а this.name - null.

Трассировка, где эти значения должны быть установлены

Где установлен this.name? В методе setName(String). С некоторой дополнительной отладкой мы видим, что этот метод вообще не вызывается. Если этот метод был вызван, обязательно проверьте порядок , что эти методы вызывают, а метод set не будет называться после методом печати. ​​

Этого достаточно, чтобы дать нам решение: добавить вызов printer.setName() перед вызовом printer.print().

Другие исправления

Переменная может иметь значение по умолчанию setName может помешать ему установить значение null):

private String name = "";

Либо метод print, либо printString может проверить значение null например:

printString((name == null) ? "" : name);

Или вы можете создать класс, чтобы name всегда имел ненулевое значение :

public class Printer {
    private final String name;

    public Printer(String name) {
        this.name = Objects.requireNonNull(name);
    }

    public void print() {
        printString(name);
    }

    private void printString(String s) {
        System.out.println(s + " (" + s.length() + ")");
    }

    public static void main(String[] args) {
        Printer printer = new Printer("123");
        printer.print();
    }
}

См. также:

Я все еще не могу найти проблему

Если вы попытались отладить проблему и до сих пор не имеете решения, вы можете отправить вопрос для получения дополнительной справки, но не забудьте включить то, что вы пробовали до сих пор. Как минимум, включите stacktrace в вопрос и отметьте важные номера строк в коде. Также попробуйте сначала упростить код (см. SSCCE ).

16
задан 2 revs, 2 users 80% 8 May 2013 в 20:02
поделиться

7 ответов

Существует два отдельных, хотя связано, цели:

  • , Чтобы быть хорошим разработчиком OO

и

  • , Чтобы быть хорошим Разработчиком.NET

Являющийся превосходным в последнем потребует быть, по крайней мере, хорошим в первом, но оба потребуют тяжелой работы. Не становитесь заблокированными в мышление Microsoft, или даже.NET одна - необходимо разработать знакомство через широкий спектр поля.

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

Затем, распознают, что необходимо будет сделать большое чтение, и онлайн и прочь. Если Ваша скорость считывания является средней или ниже (приблизительно 250 слов в минуту или меньше), то необходимо рассмотреть посещение учебного курса при чтении методов. Я сделал курс с Write Group (Новая Зеландия) и утроил мою скорость считывания.

С точки зрения книг, Объект, Думая от Microsoft Press был бы хорошей начальной точкой; я следовал бы за этим с Компоненты.NET Программирования (Juval Lowy) и шаблоны Лучшей практики Smalltalk (Kent Beck), тогда Прагматически настроенный Программист (Hunt и Thomas).

После этого, тральте вокруг (на StackOverflow или в другом месте) и найдите списки рекомендуемых книг и блогов. Продолжайте читать - пытаются прочитать новую книгу по новой теме, по крайней мере, каждые два месяца, если не ежемесячно.

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

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

Тогда я рекомендовал бы, чтобы они считали следующее:

, Который должен дать любому довольно прочную основу в лучших методах ООП.

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

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

план эпизода выглядит примерно так:

  • Гибкий Обзор
  • Значений и Методов Основные Принципы разработки OO
  • Шаблоны разработки В Действии
  • Основы Поблочного тестирования
  • Фиктивные объекты
  • Основы Управления исходным кодом Файла/Структуры папок
  • Проекта TDD
  • Непрерывная Интеграция / Автоматизация сборки
  • Гибкие Принципы Планирования проекта
  • Обзор Доменных Управляемых Понятий Ядра Дизайна

автор ряда также сделал Лето серии NHibernate, который был довольно популярен.

В дополнение к этому, в dnr-ТВ Jean Paul Boodhoo сделал пять эпизодов на шаблонах разработки и два на разработке через тестирование, я рекомендовал бы смотреть на тех также.

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

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

из-за этого я рекомендовал бы чтение, но когда Вы садитесь для кодирования, начинают работать с NUnit и практиковать TDD (или BDD, и т.д.). Это поможет Вам сделать две вещи.

  1. Это окажет давление на Вас для разъединения классов. Это твердо к действительно тестовому коду со многими зависимостями. Если Вы захотите действительно добраться там и тесты записи, то необходимо будет разъединиться. Это - хорошее место, чтобы начать применять все чтение recommened.:)

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

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

По совпадению я являюсь промежуточным посредством чтения книги VB.net (опубликованный Apress), который довольно хорош.

, Хотя существует богатство больших учебных руководств в сети, я полностью рекомендую покупать книгу, они обычно намного более профессиональны в своем подходе.

И столь сумасшедший, как это звучит, я нахожу, что он намного лучше НЕ находится в моем компьютере при изучении программирования! Я всегда читал главу, или два тогда переходят к моему компьютеру и делают это для реального.

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

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

я думаю, что лучший подход воспитывает и кодирует. Я объясняю его несколько понятий и затем прошу, чтобы он программировал некоторый код. Мы просто создали простой калькулятор в нескольких платформах (WCF, Silverlight, XNA..) и использующий некоторые известные шаблоны (состояние, MVP...).

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

Таким образом он - тот, придумывающий естественное разъединение и что является более важно, "почему хорошо". Я очень доволен результатами до сих пор; он очень доволен поблочным тестированием и как оно позволяет ему легко изменять код навсегда.

, по моему скромному мнению, разделение проблем и поблочное тестирование лучше объяснены и поняты, кодировав и имея необходимость реализовать новые опции; особенно для новых программистов. Как только он покупает акции, я рекомендовал бы ему читать" Шаблоны разработки " GOF или частью из более простой varians.

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

Я думаю, вам нужно сначала понять, что для того, чтобы стать «хорошим» программистом, который понимает ООП и передовой опыт, нужно время и опыт. Не существует волшебной комбинации книг, блогов или обучения, чтобы воспроизвести время в окопах.

Мой совет, основанный на моем собственном опыте, - не слишком беспокоиться о том, что вы не следуете лучшим практикам, а просто пишите код. Если вы новичок в ООП или .NET, вы собираетесь делать глупости. Вы собираетесь делать противоположные «передовым практикам», пока не сделаете достаточно ошибок, чтобы извлечь из них уроки.

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

Теперь, когда вы пишете много кода без страха, вам нужно будет дополнить знаниями извне. В порядке важности:

  1. Работайте напрямую с теми, у кого больше опыта, чем у вас. Это самый быстрый способ освоить

  2. Прочитать другой код ООП .NET. открыто источник отлично подходит для этого! Изучите это, расширить его, добавить функции в OSS проект, даже если вы никогда не совершаете никаких обязательств.

  3. Читайте книги. Я конкретно имею в виду книги ... не блоги. В книгах больше комната для расширения темы и лучше всего для людей, которые действительно начиная с нуля по заданному тема. Рекомендую Код Завершите как большую первую книгу.

  4. Прочтите 'сети. Это включает в себя блоги, stackoverflow и т. д.

Удачи!

1
ответ дан 30 November 2019 в 16:30
поделиться
Другие вопросы по тегам:

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