私の個人的なプラクティスは次のとおりです。
- いくつかの出口点を持つ関数は好きではありません。保守や追跡が難しいことがわかりました。本質的に少しずさんなため、コードの変更によって内部ロジックが壊れることがあります。複雑な計算の場合、最初に戻り値を作成し、最後に返します。これにより、各if-else、switchなどのパスを慎重にたどり、適切な場所に値を正しく設定する必要があります。また、デフォルトの戻り値を設定するか、開始時に初期化しないでおくかを決めるのにも少し時間を費やします。このメソッドは、ロジックまたは戻り値のタイプまたは意味が変更された場合にも役立ちます。
例えば:
public bool myFunction()
{
// First parameter loading
String myString = getString();
// Location of "quick exits", see the second example
// ...
// declaration of external resources that MUST be released whatever happens
// ...
// the return variable (should think about giving it a default value or not)
// if you have no default value, declare it final! You will get compiler
// error when you try to set it multiple times or leave uninitialized!
bool didSomething = false;
try {
if (myString != null)
{
myString = "Name " + myString;
// Do something more here...
didSomething = true;
} else {
// get other parameters and data
if ( other conditions apply ) {
// do something else
didSomething = true;
}
}
// Edit: previously forgot the most important advantage of this version
// *** HOUSEKEEPING!!! ***
} finally {
// this is the common place to release all resources, reset all state variables
// Yes, if you use try-finally, you will get here from any internal returns too.
// As I said, it is only my taste that I like to have one, straightforward path
// leading here, and this works even if you don't use the try-finally version.
}
return didSomething;
}
- 唯一の例外は、開始時(または、まれにプロセス内)の「クイック終了」です。実際の計算ロジックが入力パラメーターと内部状態の特定の組み合わせを処理できない場合、またはアルゴリズムを実行せずに簡単な解決策を持っている場合、すべてのコードをブロック(場合によっては)ブロックにカプセル化することは役に立ちません。これは「例外状態」であり、コアロジックの一部ではないため、検出したらすぐに計算から抜け出す必要があります。この場合、elseブランチはありません。通常の状態では、実行は単純に続行されます。(もちろん、「例外状態」は例外をスローすることでより適切に表現されますが、時には過剰になります。)
例えば:
public bool myFunction()
{
String myString = getString();
if (null == myString)
{
// there is nothing to do if myString is null
return false;
}
myString = "Name " + myString;
// Do something more here...
// not using return value variable now, because the operation is straightforward.
// if the operation is complex, use the variable as the previous example.
return true;
}
「1つの出口」ルールは、計算が解放する必要がある外部リソースを必要とする場合、または関数を終了する前にリセットする必要があることを示す場合にも役立ちます。時々開発中に追加されます。アルゴリズム内に複数の出口があると、すべてのブランチを適切に拡張するのがはるかに難しくなります。(例外が発生する可能性がある場合、まれな例外的なケースでの副作用を避けるために、リリース/リセットも最終ブロックに入れる必要があります...)。
あなたのケースは「実際の作業の前に迅速に終了する」カテゴリに分類されるようで、例2バージョンのように記述します。