Что обычно происходит, когда функция getByPrimaryKey базы данных не может найти запись? - PullRequest
1 голос
/ 31 января 2011

Я пишу приложение MVC, но я не могу использовать любую существующую библиотеку.Я пытаюсь решить, что произойдет, когда моя функция getRecordByPrimaryKey найдет 0 записей, и что делать, если она найдет> 1 запись.Люди могут выполнять поиск по первичному ключу в приложении, поэтому я не знаю, имеет ли смысл выдавать исключение, когда ни одно не найдено.

Как большинство библиотек справляются с этим сценарием?Должен ли он возвращать массив объектов, и вызывающий код должен проверить, что существует 1 и только 1 запись, или он должен вернуть один объект?Что он должен вернуть, если объекты не найдены, NULL или выбрасывать исключение?А если> 1 запись найдена?Исключение?

Ответы [ 3 ]

0 голосов
/ 31 января 2011

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

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

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

0 голосов
/ 31 января 2011

Это очень субъективно, и у каждого подхода есть свои плюсы и минусы.

Возвращается NULL

  • Хорошо: быстро и просто
  • Хорошо: Пожалуй, самое естественное, что нужно сделать
  • Плохо: требуется дополнительная проверка не-NULL-ness

Бросок исключения

  • Хорошо: четко сообщает об ошибке
  • Плохо: не самый лучший способ оставить отзыв
  • Плохо: обычно очень медленно

Возвращение пустого экземпляра (заглушки)

  • Хорошо: выполняет ожидание объекта
  • Хорошо: позволяет повторно использовать возвращенный объект, когда не найден
  • Плохо: некоторые программисты будут говорить «WTF?»
  • Плохо: медленнее, чем возвращение NULL

Лично я склонен использовать подход № 3. Его преимущество в том, что он очень строгий с ожиданиями, установленными по имени метода: если он говорит, что возвращает объект класса Foo по первичному ключу, то он должен возвращать этот объект независимо от того, что - будь то первичный ключ не найден, база данных отключена или сервер в огне. Это также позволяет использовать удобные ярлыки и повторно использовать возвращаемый объект (пример в PHP):

$foo = Foo::getByPrimaryKey(12345);
if (!$foo->exists()) { // no need for checking for NULL
    $foo->name = 'bar';
    $foo->colour = 'baz';
    $foo->save(); // create it on the spot
}
echo $foo->name; // use it like it was always there

Кроме того, $foo->exists() более разговорный по стилю. Можно преуменьшить важность того, чтобы код был близок к естественному языку, или даже назвать его детским. Я полагаю, что чем дальше вы не будете манипулировать единицами, нулями, типами данных, исключениями и прочей ерундой, связанной с компьютером, тем лучше для вашей программы.

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

0 голосов
/ 31 января 2011

Доморощенные MVC-фреймворки, которые я использовал в прошлом, обычно возвращают ноль.Создание исключения является дорогостоящим во время выполнения, и разработчику довольно легко не забыть проверить нулевое значение.

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