2

私は次のようないくつかの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 がリストに見つからない場合、何を返す必要があるかということです。

4

2 に答える 2

5

いくつかのオプションがあります:

  • MovieInfo「無効な」インスタンスが可能になるようにクラスを定義し(デフォルト構築std::threadが実際のスレッドを表さないのと同様に)、そのようなインスタンスを返します。

  • 名前が有効な映画情報に対応していることを前提条件とgetMovieInfoByName()し、そうでない場合は単純にランダムな値を返します (「前提条件に違反すると未定義の動作が発生するため」)。

  • 名前が見つからない場合は例外をスローします。

  • のようなものを返しますboost::optional<MovieInfo>

  • 名前に一致するものが見つからない場合に戻り値として使用されるgetMovieInfoByName()タイプの追加パラメーターを指定します。MovieInfo

それはすべて、関数の使用目的によって異なります。

于 2013-10-11T10:26:16.640 に答える
1

それは、コンテキストと満たさなければならない前提条件によって異なります。たとえば、呼び出した時点でリストにそのような映画が含まれているかどうかわからない場合は、次のようにするのが適切です。

bool getMovieInfoByName(const std::string& movieName, MovieInfo& movieInfo)
{
    ...
    if (FOUND) {
        movieInfo = ...;
        return true;
    }
    return false;
}

呼び出し元は、そのような映画を含む映画が存在するかどうかを知る必要がある可能性が最も高いためです。

映画が見つからないことが起こらない場合getMovieInfoByName、つまり、呼び出し元がリストにそのような映画が含まれているかどうかを他の方法で既に知っている必要がある場合、それは例外的な状態であり、むしろ間違った使用法を示しているため、例外をスローすることは完全に合理的です。この方法の。

Null Objectと呼ばれるデザイン パターンもあります。これはオブジェクトの構築に基づいており、その状態は、それが有効な/初期化されたオブジェクトであるか、NULL を表すダミー インスタンスであるかを示すことができます。
この場合、呼び出し元は適切なMovieInfoインスタンスが返されたかどうかを確認する必要があり、このクラスは などのメソッドを提供する必要がありますbool isValid();

于 2013-10-11T10:30:46.703 に答える