getObjByName()应该返回什么?

时间:2013-10-11 10:19:30

标签: c++ return return-value class-design

我正在研究一些像这样的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应该返回什么?

2 个答案:

答案 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();之类的方法。