Это очень субъективно, и у каждого подхода есть свои плюсы и минусы.
Возвращается 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» - первичный ключ по определению уникален, поэтому возвращение нескольких строк / объектов было бы оскорблением здравого смысла.