条件の場合、長い形式をフォーマットする最も読みやすい方法は? [閉まっている

softwareengineering.stackexchange https://softwareengineering.stackexchange.com/questions/3450

  •  16-10-2019
  •  | 
  •  

質問

長い巻き上げ if 可能な限り条件を避けるべきですが、時には私たち全員がそれらを書くことになります。たとえそれが非常に単純な状態であっても、関与する声明は単に非常に冗長であることがあるため、条件全体が非常に長くなります。それらをフォーマットする最も読みやすい方法は何ですか?

if (FoobarBaz::quxQuux(corge, grault) || !garply(waldo) || fred(plugh) !== xyzzy) {
    thud();
}

また

if (
    FoobarBaz::quxQuux(corge, grault)
 || !garply(waldo)
 || fred(plugh) !== xyzzy
) {
    thud();
}

また

if (FoobarBaz::quxQuux(corge, grault)
    || !garply(waldo)
    || fred(plugh) !== xyzzy) {
    thud();
}

また

thudable = FoobarBaz::quxQuux(corge, grault);
thudable ||= !garply(waldo);
thudable ||= fred(plugh) !== xyzzy;

if (thudable) {
    thud();
}

または他の好みはありますか?

役に立ちましたか?

解決

多くの場合、条件はリファクタリングが必要なコードの兆候ですが、避けられない場合もあります。そのような場合、私は最初を好みます:

if (bar || baz || quux) { ... }

1つの行で何が起こっているのかを伝えることができるからです。しかし、可能であれば、私はこのようなことをしたいです。

function foo() {
  return bar || baz || quux;
}

if (foo()) { ... }

他のヒント

私は継続を示すためにオペレーターを最後に維持するのが好きです:

if (the_function_being_called() != RETURNCODE_SUCCESS &&
    the_possibly_useful_recovery_strategy() == RETURNCODE_EPICFAIL &&
    this_user_has_elected_to_recieve_error_reports)
{
    report_error();
}

私は意味のある変数名の大ファンです:

const bool isInAStrangeCondition =
    FoobarBaz::quxQuux(corge, grault) ||
    !garply(waldo) ||
    fred(plugh) !== xyzzy;

if (isInAStrangeCondition) {
    thud();
}

または上記のように、関数としてリファクタリングします。

ブール変数として、より厄介なサブエクスペン、またはそれらのすべてを破壊します。次に、「IF」ステートメントのトップレベルのブールロジックを明確にすることができます。私がしている仕事の中で、それは常にいくつかのことではありません。

bool goodblah = some_mess < whatever;
bool frobnacious = messy_crud != junky_expression;
bool yetanother = long_winded_condition;

if (goodblah || (frobnacious && yetanother))   {
    ...
}

これは、「if」を実行する前にすべてのブールを見ることができるデバッガーで特に優れています。

新しい行の開始時にオペレーターを調整する傾向があるので、用語をどのように組み合わせているかを覚えています(長い論理と長い算術の両方)。このような:

if (first_attempt(data) == SUCCESS
    || (reusable(data) && second_attempt(data) == SUCCESS)
    || (still_reusable(data) && third_attempt(data) == SUCCESS))
  return SUCCESS;

これは、2つのスペースでインデントするか、環境をマルチライン述語に設定した場合にのみ機能します。そうしないと、述語が終了し、有用なコードが始まる場所を知るのが難しい場合があります。

私は次のファンです:

if (really_long_expression && another_really_really_long_expression && 
            another_very_long_expression_OMG_id_it_long){
    bugs();
}

このようにして、それはまだif式のように見え、表現の場合は壊れたものではありません。インデントは、それが前の行の継続であることを示すのに役立ちます。

また、オープニングブラケットが前の行の終わりにあるまでインデントすることもできます。

ライセンス: CC-BY-SA帰属
所属していません softwareengineering.stackexchange
scroll top