6

ときどき、必要以上に括弧を使ってコードを書くことがあります。

 if(!(new Day((((new Date()) / millisecondsPerDay) % 75)) instanceof oldDay))) { 
    // Bonus points if that condition made any sense to you
 }

特に、何か問題があるとすぐに通知してくれる IDE を使用していない場合は、括弧を何個入れる必要があるかを追跡するのが困難です。実際、上記の例は括弧と正しく一致していないに違いありません。私は、認めたくないほど多くの括弧による死からのエラーに釘付けにされてきました。

これを回避する方法はないかと考えていました。非常に多くの括弧で囲む必要がないようにするには、どのような手法を使用できますか?

非常に多くの括弧の必要性を防ぐメカニズムを備えた言語はありますか? たとえば、自動的にすべての括弧を閉じる特殊文字と、それらを自動的に開く特殊文字を追加すると役立つかもしれないと思いました。(<および>次の例では)

if(!(new Day<new Date()) / millisecondsPerDay) % 75> instanceof oldDay>
4

5 に答える 5

9

実行可能な代替手段の 1 つは、条件付きループの前に括弧で囲まれた値を事前に計算することです。たとえば、あなたのコードを見てください:

if(!(new Day((((new Date()) / millisecondsPerDay) % 75)) instanceof oldDay))) { 
    // Bonus points if that condition made any sense to you
 }

それを壊し始めましょう。

Date d1 = new Date();
var factor1 = (d1 / millisecondsPerDay ) % 75;
Day day1 = new Day (factor1);

if (!day1 instanceof oldDay) {
// do something
}

コードは人間が読み取れるように書かれ、後でマシンが実行できるようになることを忘れないでください。巨大な条件文を見つけた場合は、前処理を開始して分割します。条件が何をチェックしているかを把握するのに 1 秒以上かかる場合は、おそらく長すぎます。

于 2011-08-26T20:01:57.643 に答える
2

まず第一に、私はいつもこの種のコードをリファクタリングするのが好きです。可能であれば、式の一部を変数 (または関数のいずれか最適なもの) に抽出します。そうすれば、コード自体をより理解することができ、そのような混乱を招く必要はありません。

bool isOldDay(int someFactor)
{
    if(someFactor instanceof oldDay) 
    {
        return true;
    }
    return false;

}

var today = new Date();
var particularFactor = today/millisecondsPerDay;
var someFactor = particularFactor % 75
var day = new Day(someFactor);


if(!isOldDay(day)) //Do something

編集:ところで、括弧なしで何かをしたい場合は、次のようなことを試すことができます:逆ポーランド記法

5 + ((1 + 2) * 4) − 3.5 1 2 + 4 * + 3 -もちろん、この形式は、コンパイラでの計算のスタック表現に非常に近い場合があります。

于 2011-08-26T20:11:32.867 に答える
1

私が従う場合:

var a = new Date() / millisecondsPerDay) % 75
var newDay = new Day(a);

if (! newDay instanceof oldDay) {
   //do something
}

インライン ロジックが読めない場合は、複数行に記述してください。;-)

于 2011-08-26T20:05:10.457 に答える
1

その多くの括弧は、

  1. 著者は、言語の演算子の優先順位を理解していません。たとえば、コンストラクターの呼び出しnew Date()を完全に冗長な括弧のセットでラップしました(new Date())。あなたの言語が通常の言語と異なる場合を除き、その前置new演算子は他のほとんどの演算子よりも強く結合します。

  2. 著者は分かりやすさを気にしません。

より理解しやすく、テストしやすく、保守しやすいものにします。将来の誰か(あなたかもしれませんが、感謝するか、そうしなかったことを呪うでしょう)。

いくつかのヒント:

  • 言語の演算子の優先順位を理解してください。正当な理由なしに括弧を追加しないでください。演算子の優先順位を理解している人は、なぜ括弧を入れたのかを理解するのに時間を費やす必要があります。

  • 表現を分解します。スタック スペースを使用します (安価です)。

  • 前のものに基づいて、各単純な部分式を独立したローカル変数として計算します。

  • 変数名にそれらが表すものを反映させます。

次に、最終的な一時のみをテストします。あなたの場合、それはブール値のようです。

このようにコードを書くと、理解しやすく (複雑な式がない)、テストしやすくなります (単純な式の方が正確性をチェックするのがはるかに簡単です)。問題の特定/特定が容易になります。

于 2011-08-26T20:18:00.427 に答える
0

これに対する答えは NO です。これらすべての括弧の要点は、式のあいまいさを避けるためです。それらを削除すると、式が思ったように評価されない可能性があります。

エルゴ、<>不足している括弧を修正/追加するような構造があった場合、期待していた場所にそれらを追加しない場合があります。

簡単な例 (必要であるかのように):

(90 / 100 - 1)

...どちらかに評価されます...

((90 / 100) - 1) // = -0.1

...また...

(90 / (100 - 1)) // = 0.90909090...

...そして、それがどちらになるかを実際に知る方法はありません。

唯一の代替手段は、一部の部分を式の外に移動し、結果を変数に格納して、式での評価を減らすことです。

于 2011-08-26T20:06:48.030 に答える