質問

自分と同僚ての紛争については、次のである。いったいかつ公正でなければならない。ではよりエレガント?

public function set hitZone(target:DisplayObject):void
        {
            if(_hitZone != target)
            {
                _hitZone.removeEventListener(MouseEvent.ROLL_OVER, onBtOver);
                _hitZone.removeEventListener(MouseEvent.ROLL_OUT, onBtOut);
                _hitZone.removeEventListener(MouseEvent.MOUSE_DOWN, onBtDown);

                _hitZone = target;

                _hitZone.addEventListener(MouseEvent.ROLL_OVER, onBtOver, false, 0, true);
                _hitZone.addEventListener(MouseEvent.ROLL_OUT, onBtOut, false, 0, true);
                _hitZone.addEventListener(MouseEvent.MOUSE_DOWN, onBtDown, false, 0, true);
            }
        }

...ま---

public function set hitZone(target:DisplayObject):void
        {
            if(_hitZone == target)return;

            _hitZone.removeEventListener(MouseEvent.ROLL_OVER, onBtOver);
            _hitZone.removeEventListener(MouseEvent.ROLL_OUT, onBtOut);
            _hitZone.removeEventListener(MouseEvent.MOUSE_DOWN, onBtDown);

            _hitZone = target;

            _hitZone.addEventListener(MouseEvent.ROLL_OVER, onBtOver, false, 0, true);
            _hitZone.addEventListener(MouseEvent.ROLL_OUT, onBtOut, false, 0, true);
            _hitZone.addEventListener(MouseEvent.MOUSE_DOWN, onBtDown, false, 0, true);

        }
役に立ちましたか?

解決

これはルール(すなわち、ベスト・プラクティス)を破るために大丈夫だ、これらのケースの一つです。一般的に、あなたは、可能な限りの機能のいくつかのリターンポイントとして持っていると思います。このための実用的な理由は、あなただけ常に、それぞれ、すべての機能は、その引数を取ることを前提とし、そのロジックを行い、その結果を返すことができるので、それは、コードのあなたの読書を簡素化することです。様々なケースのための余分な戻りに置くことロジックを複雑にし、読み、完全コードを完全に理解するのに必要な時間の量を増加させる傾向があります。あなたのコードは、メンテナンスの段階に達すると、彼らは(その特に悪いコメントはまばらで、コード不明であるとき)のロジックを解読しようとして、複数のリターンは、新たなプログラマの生産性に大きな影響を持つことができます。問題は、関数の長さに対して指数関数的に増大する。

それでは、なぜこのような場合には、誰もがオプション2を好むのでしょうか?あなたは機能をチェックする必要があるかもしれません、着信データ、または他の不変条件を検証して強制する契約を設定しているしているからです。検証を構築するためのきれいな構文は、条件が妥当性を失敗した場合は、すぐに戻って、各条件のチェックです。その方法は、あなたがあなたの小切手のすべてを通じてのisValid boolean型のいくつかの種類を維持する必要はありません。

物事をまとめるために:私たちは本当に検証コードではなく、一般的なロジックを作成する方法を見ています。オプション2は、検証コードのためのより良いです。

他のヒント

ほとんどの場合、帰国早期削減に複雑により、コードの読みやすくするた.

この技術の応用 スパルタング:

最低限の制御

  1. 使用を最小限にして条件分岐により専用 を構築しまうternarization, 相続、授業などのクラス デフォルトクラスを一度クラス セパレータ
  2. 簡素化条件分岐に早期 return.
  3. 使用を最小限にしてループを構築し、行動アプリケーター 授業などのクラス分け クラスFileSystemVisitor.
  4. 簡素化ロジックの繰り返し処理の早期終了( return, continuebreak 諸表

おばらばらになってしまったと思うオプション2、これはコードを読みやすくするた.私は同じ技術を使用時のチェック機能パラメータ。

限り早期リターンは関数/メソッド本体の上部にブロックとして編成されているとして、私は、彼らがはるかに読みやすいネストの別の層を追加するよりもいると思う。

私は、体の真ん中に早期リターンを避けるようにしてください。時には彼らは最善の方法だが、ほとんどの時間は、私は彼らが複雑だと思います。

また、一般的なルールとして、私は入れ子に制御構造を最小限に抑えるようにしてください。もちろん、あなたはあまりにも遠く、このいずれかを取ることができますので、あなたは、いくつかの裁量を使用する必要があります。以下の場合は、単一のスイッチ/ケースにネストされた変換すると述語は、いくつかのサブ表現を繰り返して(これは部分式除去を行うにはあまりにもダムの言語でのパフォーマンスの重要なループではないと仮定)しても、私には非常に明確です。あなたが上にスクロール終わる何らかの理由で精神的に指定された行のコンテキストを再構築するまでのコードの真ん中にジャンプ場合ので、特に私は、長い関数/メソッド本体内のネストされたIFの組み合わせを嫌います。

私の経験では、プロジェクトの早い段階でリターンを使用しての問題は、プロジェクトの他の人がそれらに使用されていない場合、彼らは彼らのために見ていないということです。だから、早く戻ってかない - 関与する複数のプログラマがある場合は、誰もが自分の存在を少なくとも認識してあることを確認します。

私は個人的には、多くの場合、リターンを遅らせるよう、できるだけ早くそれができるように返すようにコードを書くには安全にネストされたループと条件の束を終了しようとするなどの余分な複雑さを紹介します。

私は不慣れな機能を見ると、

だから、私は非常に最初の事はすべてreturnsを探しています。何が本当に何かからreturn異なる色を与えるためにあなたの構文の色付けを設定することがあるのに役立ちます。 (私は赤のために行く。)そのように、returnsはむしろ不注意のために隠された障害とブロックよりも機能が何をするのかを決定するための便利なツールとなっています。

ああ保護者。

私見、はい - リターンが明示的な条件のすぐ隣で、それがうまく同様の構造で分類することができるので、それのロジックが明確です。 「戻る」「新しい例外を投げる」に置き換えている場合これは、より適用されます。

前にも言ったよう

は、早期復帰は、関数の本体が長い場合、特別に、あなたは3ページ機能で誤って}削除(それ自体はウィッヒすることは非常にエレガントではない)ことがあり、より読みやすいとコンパイルしようそれは非自動化デバッグの数分かかることがあります。

また、それは方法ですので、あなたが他の人にそれを記述しますので、おそらく開発者はそれを理解するのに十分なものに近く、コードはより宣言になります。

機能の複雑さは、後に増加し、あなたは良いテストを持っている場合は、

、あなたは単に新しい機能で、各選択肢をラップし、ケースの枝、あなたは宣言型のスタイルをmantainそのようにそれらを呼び出すことができます。

この場合、(1つのテスト、無else節)で、私はテストとリターンが好き。それは、機能の残りの部分を読まなく、その場合には、行うには何もないということが明らかになります。

しかし、これは毛の最高級分割されます。私はあなたが心配するより大きな問題を持っている必要があります確信している:)

オプション2は、より読みやすいですが、それ以外は追加する必要があり時にコードの管理は失敗します。

あなたは確信しているのであれば、

は、オプション2のために行くが、それ以外の条件の範囲があることができれば、私はオプション1を好む何も他にありません。

あなたが手順で復帰ポイントの最小数を持っている必要がありますので、

オプション1は、良いです。

のような例外があります。
  if (a) {
    return x;
  }
  return y;

なぜなら、言語の仕組みのが、それは実現可能であると一般的には、いくつかの出口点として持っている方が良いでしょう。

私は、関数の先頭で即時復帰を避けることを好む、そして可能な限り、それが呼び出される前にメソッドへの侵入を防ぐために、予選ロジックを置きます。もちろん、この方法の目的によって異なります。

しかし、私は方法の真ん中に戻って気にしない、方法が短くて読みやすいです提供。この方法は大である場合には、私の意見では、それはまだ非常に読みやすいではありませんので、どちらかのインラインリターンで複数の機能にリファクタリングされます、または私は明示的に最後のシングルリターンで制御構造から壊れます。

私はすでにいくつかの類似したスレッドを見たように、

私は<のhref = "https://stackoverflow.com/questions/268132/invert-if-statement-to-reduce-nesting含め、正確な複製としてそれを閉じるように誘惑しています声明は良い答えを持って営巣するを減らすために、 『あれば文は、ネスティング">反転』を減らすために「場合」「タイトル=」反転ます。

私はそれが今のために生きるようになる... ^ _ ^

答えことを確認するために、私はガード句などの早期復帰が深くネストされたIFSよりも優れている信者です。

私はコードの両方のタイプを見ていると私はそれが読みやすいと私のために理解見えているとして最初のものを好むが、私は早く行くには良い方法であるが存在し、多くの場所を読みました。

少なくとも一つの他の代替があります。作業を実行するかどうかについての決定から実際の作業の詳細を区切ります。以下のような何かます:

public function setHitZone(target:DisplayObject):void
    {
        if(_hitZone != target)
            setHitZoneUnconditionally(target);

    }

public function setHitZoneUnconditionally(target:DisplayObject):void
    {
        _hitZone.removeEventListener(MouseEvent.ROLL_OVER, onBtOver);
        _hitZone.removeEventListener(MouseEvent.ROLL_OUT, onBtOut);
        _hitZone.removeEventListener(MouseEvent.MOUSE_DOWN, onBtDown);

        _hitZone = target;

        _hitZone.addEventListener(MouseEvent.ROLL_OVER, onBtOver, false, 0, true);
        _hitZone.addEventListener(MouseEvent.ROLL_OUT, onBtOut, false, 0, true);
        _hitZone.addEventListener(MouseEvent.MOUSE_DOWN, onBtDown, false, 0, true);

    }

これら3(あなたの2プラス上述した第3)のいずれかが、この限り小さく例のための合理的です。しかし、点在複数の「保釈アウトポイント」と長い行の機能の数百を持つことが悪いことになります。

私は長年にわたって私自身のコードでこの議論を持っていました。私は1つのリターンを好む生活を始め、ゆっくりと経過しています。

我々は唯一の無い他の複雑であれば()で包まれたコードの7行話しているという理由だけで、

この場合、私はオプション2(1リターン)を好みます。それははるかに読みやすく、機能のようです。これは、上から下に流れます。あなたは下部にトップと最後に開始を知っています。

が先頭でより多くの警備員以上の複雑さがあったり機能が大きくなった場合、その後、私はオプション1を好むならば他の人が、言ってきたように、言われていること:。簡単な検証のために先頭にすぐに戻ります。

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