Я работал над некоторым кодом C ++, как это:
//c++ code
class MovieInfo;
MovieInfo getMovieInfoByName(String movieName)
{
//search the movieInfoList with movieName
if(FOUND)
return movieInfo;
//TODO: **what should i return if the movieInfo can't be found in the list?**
}
Вопрос в том, что я должен вернуть, если movieInfo не может быть найден в списке?
У вас есть несколько вариантов:
Определите MovieInfo
класс такой, что возможен «недопустимый» экземпляр (аналогично тому, как создается по умолчанию std::thread
не представляет фактический поток) и возвращает такой экземпляр.
Сделать это предварительным условием getMovieInfoByName()
что имя соответствует действительной информации о фильме и просто возвращает случайное значение, если это не так (поскольку «нарушение предварительных условий приводит к неопределенному поведению»).
Бросьте исключение, когда имя не найдено.
Вернуть что-то вроде boost::optional<MovieInfo>
.
Дать getMovieInfoByName()
дополнительный параметр типа MovieInfo
который будет использоваться в качестве возвращаемого значения в случае, если не найдено совпадение с именем.
Все зависит от вашего предполагаемого использования функции.
Это зависит от контекста и предварительных условий, которые должны быть выполнены. Например, если вы не уверены, содержит ли список такой фильм к тому моменту, когда вы его вызываете, было бы разумно сделать следующее:
bool getMovieInfoByName(const std::string& movieName, MovieInfo& movieInfo)
{
...
if (FOUND) {
movieInfo = ...;
return true;
}
return false;
}
так как вызывающий абонент, скорее всего, должен знать, существует ли фильм с таким фильмом или нет.
Если этого не произойдет, то getMovieInfoByName
не найдет фильм, т. е. вызывающий уже должен знать, содержит ли список такой фильм другими способами, тогда вполне разумно выдать исключение, так как это исключительное состояние и скорее указывает на неправильное использование этого метода.
Есть также шаблон дизайна под названием Нулевой объект, основанный на создании объекта, состояние которого может указывать, является ли он действительным / инициализированным объектом или является фиктивным экземпляром, представляющим NULL.
В этом случае вызывающему абоненту, скорее всего, еще придется проверить, подходит ли MovieInfo
экземпляр был возвращен, и этот класс должен предоставлять метод, такой как bool isValid();
,