私の謙虚な意見では、考慮すべき3種類の返品ケースがあります。
オブジェクトプロパティの操作
1つは、オブジェクトプロパティの操作です。ここで説明するパターンは、オブジェクトを操作するときによく使用されます。非常に典型的なシナリオは、工場と一緒に使用することです。この架空の作成呼び出しを考えてみましょう。
// When the object has manipulative methods:
Pizza p = PizzaFactory().create().addAnchovies().addTomatoes();
// When the factory has manipulative methods working on the
// object, IMHO more elegant from a semantic point of view:
Pizza p = PizzaFactory().create().addAnchovies().addTomatoes().getPizza();
メソッドは人間が読める形式の1つを形成するため、正確に何が作成されているのか、またはオブジェクトがどのように操作されているのかをすばやく把握できます。それは間違いなく素晴らしいですが、使いすぎないでください。経験則では、これは、戻り値をvoidとして宣言することもできるメソッドで使用される可能性があります。
オブジェクトのプロパティの評価
2つ目は、メソッドがオブジェクトの何かを評価する場合です。たとえば、car.getCurrentSpeed()
現在の速度を要求してそれを返すオブジェクトへのメッセージとして解釈できるメソッドについて考えてみます。複雑すぎず、単に値を返すだけです。:)
オブジェクトにこれまたはそれを実行させる
3つ目は、メソッドが操作を実行し、呼び出し元の意図がどの程度満たされたかを示す何らかの値を返す場合ですが、そのようなメソッドをレイアウトするのは難しい場合があります。
int new_gear = 20;
if (car.gears.changeGear(new_gear)) // does that mean success or fail?
ここで、メソッドの設計が難しいことがわかります。成功または失敗したときに0を返す必要がありますか?車のギアが5つしかないため、ギアを設定できなかった場合は-1はどうですか?それは現在のギアも-1になっているということですか?メソッドは、変更したギアを返す可能性があります。つまり、メソッドに提供された引数を戻りコードと比較する必要があります。それはうまくいくでしょう。一方、失敗の場合はtrueまたはfalseを返し、失敗の場合はfalseまたはtrueを返すことができます。これらのメソッド呼び出しが失敗するか成功するかを見積もることで、どちらを使用するかを決定できます。
私の謙虚な意見では、そのような戻り値のセマンティクスをセマンティックな説明を与えることによって、より適切に表現する方法があります。オブジェクトを操作する将来の開発者は、メソッドのコメントやドキュメントを検索する必要がないため、あなたを気に入るはずです。
class GearSystem {
// (...)
public:
enum GearChangeResult
{ GearChangeSuccess, NonExistingGear, MechanicalGearProblem };
GearChangeResult changeGear (int gear);
};
そうすれば、コードを見ているプログラマーにとって、戻り値が何を意味するのかが完全に明らかになります(if (gears.changeGear(20) == GearSystem::GearChangeSuccess)
上記の例よりもはるかに明確になります)。
アンチパターン:リターンコードとしての失敗。
私の意見ではそうではないので、私が実際に省略した戻り値の4番目の可能性:論理エラーや処理する必要のある障害など、プログラムにエラーがある場合、理論的には次のような値を返すことができます。それで。しかし、今日では、それはもうそれほど頻繁には行われていません(または行われるべきではありません)。そのために、例外があります。