我正在研究一些像这样的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应该返回什么?
答案 0 :(得分:5)
您有几种选择:
定义MovieInfo
类,使得“无效”实例成为可能(类似于默认构造的std::thread
不代表实际线程)并返回此类实例。
使getMovieInfoByName()
的前提条件是该名称对应于有效的电影信息,如果没有,则只返回一个随机值(因为“违反先决条件会导致未定义的行为”)。 / p>
找不到名称时抛出异常。
返回boost::optional<MovieInfo>
之类的内容。
为getMovieInfoByName()
提供MovieInfo
类型的额外参数,如果找不到与该名称匹配的情况,该参数将用作返回值。
这完全取决于您对该功能的预期用途。
答案 1 :(得分:1)
这取决于必须满足的背景和前提条件。例如,如果你在调用它时不确定列表是否包含这样的电影,那么这样做是合理的:
bool getMovieInfoByName(const std::string& movieName, MovieInfo& movieInfo)
{
...
if (FOUND) {
movieInfo = ...;
return true;
}
return false;
}
因为来电者很可能必须知道有这样一部电影的电影是否存在。
如果不应该getMovieInfoByName
找不到电影,即调用者应该已经通过其他方式知道列表是否包含这样的电影,那么抛出异常是完全合理的,因为它是异常状态,而不是表示此方法的错误用法。
还有一个名为 Null Object 的设计模式,它基于构造一个对象,其状态可以指示它是一个有效/初始化的对象,还是一个虚拟实例代表NULL。
在这种情况下,调用者很可能仍然必须检查是否已返回适当的MovieInfo
实例,并且此类应提供诸如bool isValid();
之类的方法。