Когда для пользователя отображается исключение нулевой ссылки, это указывает на дефект в коде, вызванный ошибкой разработчика. Вот несколько идей о том, как предотвратить эти ошибки.
Моя главная рекомендация для людей, которые заботятся о качестве программного обеспечения, а также используют платформу программирования .net, - это устанавливать и использовать контракты кода Microsoft (http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx). Он включает в себя возможности проверки во время выполнения и статической проверки. Существенная возможность встроить эти контракты в ваш код включена в версию 4.0 .NET Framework. Если вас интересует качество кода и оно звучит так, как вы, вам действительно может понравиться использование контрактов Microsoft.
С помощью контрактов кода Microsoft вы можете защитить свой метод от нулевых значений, добавив предварительные условия, такие как "Contract.Requires (customer! = Null);". Добавление такого предварительного условия эквивалентно практике, рекомендованной многими другими в их комментариях выше. До контрактов кода я бы порекомендовал вам сделать что-то вроде этого
if (customer == null) {throw new ArgumentNullException("customer");}
Теперь я рекомендую
Contract.Requires(customer != null);
Затем вы можете включить систему проверки во время выполнения, которая обнаружит эти дефекты как можно раньше, что приведет вас к диагностике и исправлению дефектного кода. Но не позвольте мне создать впечатление, что контракты кода - это просто причудливый способ заменить нулевые исключения аргументов. Они намного сильнее, чем это.
С контрактами кода Microsoft вы также можете запустить статическую проверку и попросить ее исследовать возможные сайты в вашем коде, где могут возникать исключения с нулевой ссылкой. Статическая проверка требует немного больше опыта, чтобы легко использовать. Я не рекомендовал бы это сначала новичкам. Но не стесняйтесь попробовать и убедитесь сами.
ИССЛЕДОВАНИЯ ПО РАСПРОСТРАНЕНИЮ НУЛЕВОЙ СПРАВОЧНОЙ ОШИБКИ
В этой теме велись споры о том, являются ли ошибки нулевой ссылки существенной проблемой. Длинный ответ ниже. Для людей, которые не хотят проходить через это, я подведу итог.
- Ведущие исследователи Microsoft в
правильность программы на Spec # и
проекты контрактов кода считают, что это
проблема, которую стоит решить.
- Dr. Бертран Мейер и команда
инженеры-программисты на ISE, которые
разработал и поддерживаю Эйфелеву
язык программирования, и поверьте
это проблема, которую стоит решить
- В своем собственном коммерческом опыте разработки обычного программного обеспечения я достаточно часто сталкиваюсь с нулевыми ссылочными ошибками, и я хотел бы решить эту проблему в своих собственных продуктах и практиках.
В течение многих лет Microsoft вкладывала средства в исследования, направленные на улучшение качества программного обеспечения. Одним из их усилий был проект Spec #. На мой взгляд, одной из самых интересных разработок в среде .NET 4.0 является введение контрактов на код Microsoft, что является результатом более ранней работы, проделанной исследовательской группой Spec #.
Что касается вашего замечания о том, что "подавляющее большинство ошибок в коде - это исключения из нулевых ссылок", я считаю, что именно квалификатор "подавляющее большинство" вызовет некоторые разногласия. Фраза "Подавляющее большинство" предполагает, что, возможно, 70-90% отказов имеют нулевое эталонное исключение в качестве основной причины. Это кажется слишком высоким для меня. Я предпочитаю цитировать из исследования Microsoft Spec #. В своей статье «Система программирования Spec #: обзор» Майка Барнетта, К. Растана, М. Лейно и Вольфрама Шульте. В CASSIS 2004, LNCS vol. 3362, Springer, 2004, они написали
1.0 Ненулевые типы Многие ошибки в современных программах проявляются как
ошибки нулевого разыменования, предполагающие
важность программирования
язык, дающий возможность
различать выражения, которые
может оценить до нуля и те, которые
обязательно не (для некоторых экспериментальных
доказательства, см. [24, 22]). На самом деле, мы
хотел бы искоренить все нуль
ошибки разыменования.
Это вероятный источник информации для сотрудников Microsoft, знакомых с данным исследованием.Эта статья доступна на сайте Spec #.
Я скопировал ссылки 22 и 24 ниже и включил ISBN для вашего удобства.
Мануэль Фандрих и К. Растан М. Лейно.Объявление и проверка ненулевых типов в объектно-ориентированном языке.В материалах конференции ACM 2003 года по объектно-ориентированному программированию, системам, языкам и приложениям, OOPSLA 2003, том 38, номер 11 в уведомлениях SIGPLAN, стр. 302–312.ACM, ноябрь 2003 г. isbn = {1-58113-712-5},
Кормак Фланаган, К. Растан, М. Лейно, Марк Лиллибридж, Грег Нельсон, Джеймс Б. Сакс,и Рэйми Стата.Расширенная статическая проверка для Java.В материалах конференции ACM SIGPLAN 2002 года по проектированию и внедрению языков программирования (PLDI), том 37, номер 5 в уведомлениях SIGPLAN, стр. 234–245.ACM, май 2002 г.
Я просмотрел эти ссылки.Первая ссылка указывает на некоторые эксперименты, которые они провели, просматривая свой собственный код на предмет возможных нулевых дефектов ссылки.Они не только нашли несколько, но во многих случаях идентификация потенциальной нулевой ссылки указала на более широкую проблему с дизайном.
Вторая ссылка не дает каких-либо конкретных доказательств для утверждения, что ошибки нулевой ссылки являются проблемой.Но авторы утверждают, что, по их опыту, эти нулевые эталонные ошибки являются значительным источником дефектов программного обеспечения.Затем документ переходит к объяснению того, как они пытаются устранить эти недостатки.
Я также вспомнил, что видел что-то об этом в объявлении от ISE о недавнем выпуске Eiffel.Они называют эту проблему «безопасностью пустот» и, подобно многим вещам, вдохновленным или разработанным доктором Бертраном Мейером, имеют красноречивое и образовательное описание проблемы и способов ее предотвращения на своем языке и инструментах.Я рекомендую вам прочитать их статью http://doc.eiffel.com/book/method/void-safety-background-definition-and-tools, чтобы узнать больше.
Если вы хотите узнать больше о контрактах кода Microsoft, в последнее время появилось множество статей.Вы также можете проверить мой блог по адресу: SLASH SLASH codecontracts.info, который в основном посвящен разговорам о качестве программного обеспечения с помощью программирования с контрактами.