2012-02-28 13 views
1

私はアプリケーションでマウスクリックを処理しようとしていますが、多くの条件があるのでロジックが非常に混乱しています。例えば、私は次の知っておく必要があります。コントロールキーが押された-ifマウスをクリックするロジックのネストされたif文を処理するには?


それが左または右マウスボタン
それがミドルやグラフィックスオブジェクトの側だった-ifた-if
クリックしたときにグラフィックオブジェクトが既に選択されているかどうかを確認してください。

、将来的にはさらに多くの条件があります。

現時点では、過度のネストされた条件のためにルールを書くのはかなり混乱します。あまりにも悪くないです。私はちょうど良い方法がなければならないように感じる。

入れ子条件をポリモーフィズムに置き換える方法についてたくさん読んだことがありますが、ここでそれが適用されるかどうかはわかりません。

EDIT:重要かどうかわかりませんが、C++を使用しています。

ここでは例です: - その後、どのように考える

if (leftMouseClick) 
{ 
    if (!controlClicked) 
    { 
    if (!clickedOnRightOfNote) 
    { 
     if (!isAlreadySelected()) 
     { 
     // stuff 
     } 
     else 
     { 
     // stuff 
     } 
    else 
    { 
     if (!isAlreadySelected()) 
     { 
     // stuff 
     } 
     else 
     { 
     // stuff 
     } 

など...

+0

どのような言語ですか?質問を更新し、言語にタグを付けるとともに、コードの例を投稿してください。 – Oded

+0

おそらくロジックを[ステートマシン](http://en.wikipedia.org/wiki/State_machine)として記述する必要があります。それは理由を考えるのがはるかに簡単になります。場合によっては、テーブル内のすべてのロジックをエンコードすることさえできます。 –

+0

すべてを知っている1つのモノリシックハンドラではなく、ロジックをハンドラ(個別のアクションごとに1つ)に分けることを検討しましたか?結束を高めるのに役立ちます。もちろん、それは各行動が独立していると仮定します。そうでない場合、これは良い方法ではないかもしれません。 – Cameron

答えて

1

スプリットが出て、実際には、ツリー
は最初の最も簡単な、最も読みやすいバージョンを書く場合から何かをしてあなたが他の特殊なケースを扱うことができる)(doEditShape内すると、それより良い

if (isInShape()) { 
    if (isCtrl()) { 
    doShapeEdit() 
    } else { 
    doShapeSelect() 
    } 
} else if (isInBackground()) { 
    if (isCtrl()) { 
    doSetPreferences(); 
    } else { 
    doSetWahtever(); 
    } 
} 

作る

+0

十分に単純です。ありがとう! – Anthony

1

すべてのウィジェットが座標を知っている古典的なUIパターンがあります。すべてのウィジェットがIWidgetインターフェースから派生したとしましょう。次に、ウィジェットのリスト(C++のベクトル)を持つことができます。

マウスはあなたのような何かを行うことができますクリックしてくださいあり:

vector<IWidget*> widgets; 
for(int i=0; i<widgets.size(); ++i) { 
    if(widgets[i]->contains(x,y)) { 
     widgets[i]->handle(); 
     break; 
    } 
} 

これはあなたの正確な状況に直接適用できるが、ウィジェットの階層に基づいたデザインのアイデアとして、そこにそれを投げるしたくないかもしれません。 if文を避けるために多態性を使います。 本当に重要な原則は、各ウィジェットが座標などについて知っていることです。

関連する問題