1

実行する一連の関数があります。ケース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();
}

もちろん、より良いということは、より保守しやすく、フォローしやすいことを意味します。

4

4 に答える 4

14

ケースA:1.
理由:どの関数も相互に依存していないため、メインで順番に呼び出すと、イベントの論理的なシーケンスが表示されます。各関数の最後で次の関数を呼び出す代替案は、スパゲッティコードのように見え、プログラムを読んでいる人が従うのは困難です。

ケースB:上記のいずれでもない。

function main() {
    return a() && b() && c();
}

理由:戻り値はあまり気にしないようです。関数の1つが特定の値を返した場合は、早期にブレークアウトしたいだけです。これらすべての関数の「anded」結果を返すことができます。これらのいずれかがfalseを返す場合、コードは早期に発生します。したがって、aがfalseを返す場合、bは実行されません。それらすべてを1行に配置すると読みやすく、相互に依存していることが簡潔に示されます。

于 2010-04-29T14:36:33.947 に答える
2

ケースA:最初のオプション

2番目のオプションを使用すると、bとcが自動的に取り込まれるため、aの再利用がはるかに困難になります。

ケースb:依存-a、b、およびcはブール値を自然に返しますか、それとも他の値をチェックしますか?不要な依存関係が発生するため、bとcの呼び出しはまだありません。戻り値が理にかなっている場合、私はオプション2に傾倒します-ネストを少なくすることは良いことです。

于 2010-04-29T14:40:25.063 に答える
1

まず、最良の答えは、コードが存在するコンテキストの複数の側面に依存します。「依存する」以外に正しい答えはありません。

ただし、額面通りに考えると、ケースA:

オプション1は、アルゴリズムのトップレベルビューを示しています。

オプション2はこれを非表示にし、B&Cへの呼び出しは非表示になります。Cが呼び出されたことを発見するのはかなりの作業になる可能性があります。また、AとBを個別にテストしてから、さらにメソッドを呼び出すと、テストが難しくなります。A、B、Cをモックできる場合は、メインをいつでもテストできます。

ケースB:メソッドに1つの出口点と複数の出口点があることについて議論するのが一般的です。複数の出口点を使用すると、コードが単純になり、保守が容易になる場合もあれば、返品がどのような影響を与えるかが明確でない場合や、返品が発生して保守が困難になる場合もあります。

オプション1はアルゴリズムを明示的に示していますが、複数のネストされたifはすぐに手に負えなくなる可能性があります。この種の場合、私は間違いなくオプション2またはいくつかの巧妙なブール型のバリアント(はい、コアリー)を持っているでしょう。

オプション3は、私には単純に鈍感に見えます。

于 2010-04-29T14:46:49.753 に答える
0

ケースA:最初のオプション

ケースB:2番目のオプション

于 2010-04-29T14:36:35.027 に答える