Каковы лучшие практики при передаче нулей? - PullRequest
2 голосов
/ 08 апреля 2011

У меня есть приложение, которое разрешает имена хостов DNS в IP одним из своих методов. Вопрос в том, что если метод, который выполняет это разрешение, передается как ноль, что лучше всего сделать?Есть несколько вариантов:

-Throw ArgumentNullException (ошибки программирования не должны обнаруживаться, кроме как сверху, глобальный обработчик ошибок).

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

Что лучше?

Спасибо

Ответы [ 6 ]

3 голосов
/ 08 апреля 2011

Брось исключение. Ваш метод никогда не должен возвращать, казалось бы, правильное значение в ситуации, когда он получает ввод, который вы считаете недопустимым. Он должен либо вернуть ноль, либо выдать исключение (лучший маршрут). Причина этого в том, что даже если вы придумали какую-нибудь «строку кода ошибки», кто-то не прочитает вашу документацию, или вы забудете позже и ударите головой о стену, задаваясь вопросом, почему она не дает сбоя, когда она должна давать сбой.

1 голос
/ 08 апреля 2011

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

Таким образом: выбросить исключение.

0 голосов
/ 12 апреля 2011

Правильный подход состоит в том, чтобы использовать шаблон "trier / doer": иметь метод "trier", который будет возвращать то, что может быть, а может и не быть действительным адресом (таким образом, чтобы вызывающий мог определить, действителен ли адрес)) и метод «doer», который либо вернет действительный адрес, либо выдаст исключение, если не сможет.Код, подготовленный для решения проблемы невозможности получить действительный адрес, должен использовать метод trier;код, который не подготовлен для такой возможности, должен использовать метод «делателя».Паттерн «триер / делатель» часто реализуется с помощью метода «триер» и «делающий», заключающего в себе третий метод, который включает параметр, указывающий, что делать в случае сбоя.

0 голосов
/ 08 апреля 2011

Третьим вариантом может быть возвращение соответствующего нулевого IP-адреса. Это позволяет вызывающей стороне принимать решение о том, что делать на основе возвращаемого значения. (Предположительно, вы уже возвращаете какой-то нулевой IP-адрес для имен хостов, у которых нет соответствующего адреса.)

0 голосов
/ 08 апреля 2011

В одном приложении, над которым я работал, ситуация была такой:

Is the Hostname available? Yes, return that.
If the Host IP Address available? Yes, return that.
Else return `Unknown`.

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

Исключение «без головы», когда кто-то принял нулевое значение, должно быть выброшено в стек и не перехвачено, потому что это индикативный или неправильный код и должно быть исправлено при обнаружении.

0 голосов
/ 08 апреля 2011

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

...