この質問はおそらく言語に依存しませんが、指定された言語に焦点を当てます。
いくつかのレガシーコードを操作しているときに、関数の例をよく見ましたが、(私の考えでは、明らかに)関数内で多くの作業を行っています。私は5000のLoCモンスターについて話しているのではなく、それらの中に前提条件チェックを実装する関数について話している。
ここに小さな例があります:
void WorriedFunction(...) {
// Of course, this is a bit exaggerated, but I guess this helps
// to understand the idea.
if (argument1 != null) return;
if (argument2 + argument3 < 0) return;
if (stateManager.currentlyDrawing()) return;
// Actual function implementation starts here.
// do_what_the_function_is_used_for
}
さて、この種の関数が呼び出されると、呼び出し元は満たされる必要のあるすべての前提条件について心配する必要がなく、簡単に次のように言うことができます。
// Call the function.
WorriedFunction(...);
さて、次の問題にどのように対処する必要がありますか?
同様に、一般的に言えば、この関数は要求されたものだけを実行し、「前提条件チェック」を呼び出し側に移動する必要があります。
if (argument1 != null && argument2 + argument3 < 0 && ...) {
// Now all the checks inside can be removed.
NotWorriedFunction();
}
または-前提条件の不一致ごとに例外をスローする必要がありますか?
if (argument1 != null) throw NullArgumentException;
この問題を一般化できるかどうかはわかりませんが、それでも、これについてのあなたの考えをここに示したいと思います。おそらく、私が再考できることがあるでしょう。
別の解決策がある場合は、遠慮なく教えてください:)
ありがとうございました。