質問
実行する一連の関数があります。ケースA:それらは互いに依存していません。これらのどれが良いですか?
function main() {
a();
b();
c();
}
また
function main() {
a();
}
function a() {
...
b();
}
function b() {
...
c();
}
ケースB:彼らは以前の正常に完了することに依存します。
function main() {
if (a())
if (b())
c();
}
また
function main() {
if (!a()) return false;
if (!b()) return false;
c();
}
また
function main() {
a();
}
function a() {
... // maybe return false
b();
}
function b() {
... // maybe return false
c();
}
もちろん、より良いことは、より維持可能で、従うことが容易になることを意味します。
解決
ケースA:1。
推論:関数のどれも互いに依存していないため、主に順番に呼び出すことは、一連のイベントを示しています。彼らが各関数の最後に次のものを呼び出すあなたの代替手段は、Spaghettiコードのように見え、あなたのプログラムを読んでいる人が従うのが難しいです。
ケースB:上記のいずれもありません。
function main() {
return a() && b() && c();
}
推論:返品値を本当に気にしないようです。関数の1つが特定の値を返す場合、早めに脱出したいだけです。これらすべての関数の「anded」結果を返すことができ、これらのいずれかがfalseのいずれかの場合、コードは早期に発生します。したがって、aがfalseを返す場合、bは実行されません。それらすべてを1つの行に配置することは読みやすく、それらがお互いに依存していることを簡潔に示しています。
他のヒント
ケースA:最初のオプション
2番目のオプションを使用すると、BとCを自動的に引き込むため、Aを再使用することがはるかに困難になります。
ケースB:依存 - a、b、およびcは自然にブール値を返しますか、それともチェックする他の値を返しますか?あなたは不必要な依存関係を導入するので、私はまだコールBとBの呼び出しCを持っていません。戻り値が理にかなっている場合、私はオプション2に傾いています - ネスティングが少ないことは良いことです。
まず、最良の答えは、コードがあるコンテキストの複数の側面に依存します - 誰もいません 右 「依存」以外の回答。
ただし、額面図で取るケースA:
オプション1は、アルゴリズムのトップレベルビューを示しています。
オプション2はこれを隠し、B&Cへの呼び出しが非表示になります。 Cが呼ばれたことを発見するのは非常に多くの作業かもしれません。また、A&Bがさらにメソッドを呼び出す場合、A&Bを単独でテストすることは困難です。 a、b、およびcをock笑できる場合、メインはいつでもテストできます。
ケースB:メソッドに1つの出口ポイントvs複数の出口ポイントを持つことについて議論をすることが一般的です。複数の出口ポイントがコードをより簡単にするために、より維持可能にすることができる場合があります。また、リターンがどのような影響を与えるか、またはリターンが発生することは明らかではなく、保守性が低下する場合があります。
オプション1は、アルゴリズムを明示的に示していますが、複数のネストされたifはすぐに手に負えなくなります。この種の場合、私は間違いなくオプション2または巧妙なブールバリアント(はい、Corey)を持っています。
オプション3は、私には単に鈍感に見えます。
ケースA:最初のオプション
ケースB:2番目のオプション