Как передать сообщение и данные из метода - PullRequest
2 голосов
/ 08 апреля 2011

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

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

Я использовал API, в которых использовался параметр out или ref, но он кажется не идеальным. Возможно, в этом весь смысл исключений. Метод генерирует исключение, если он не может подключиться к БД, поэтому вызывающая сторона узнает, что если он не получил результатов и исключений, то результатов просто не было. Буду ли я создавать свой собственный объект, содержащий как данные, так и сообщение о состоянии?

Может быть, я обдумываю это или упускаю какой-то фундаментальный момент ООП.

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

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

Ответы [ 3 ]

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

Это является частью исключительной ситуации.

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

Труднее понять код, просто прочитав его.

Например, people.Find ("Джон") должен вернуть список Джонса или одного Джона.или выбросить исключение.

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

Так что для поиска, если это не имеет значенияПОЧЕМУ нет результатов, тогда просто верните ноль (или пустой список).

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

Лично я предпочитаю использовать out для возврата статуса и значения в методе.
Метод должен возвращать статус enum и результат в качестве параметра out.

ResultTypeEnum MyMethod(in param1, blah param2, out MyType returnValue);

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

struct MyType {
   int blah;
   Myblah hello;
}

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

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

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

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

Я предлагаю вам сделать подключение к базе данных отдельным вызовом.Может быть, DatabaseConnection объект, который вы передаете методу find, или, может быть, класс, имеющий метод find, также имеет метод isConnected, чтобы вызывающая сторона могла проверить этот способ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...