2012-01-16 3 views
1

時々私はカスタマイズされたドラッグ&のドロップのような機能を実装する必要があります。コードは次のようになりますことがあります。マウスイベント処理をより簡単にするには?

bool mouse_down = false; 
Vec2 mouse_pos; 
void on_mouse_down() { 
    mouse_down = true; 
    mouse_pos = cursor_pos(); 
} 
void on_mouse_move() { 
    if(mouse_down) { 
    Vec2f c = cursor_pos(); 
    Vec2f d = c - mouse_pos; 
    // dragging. make objects tracing the cursor. 
    // ... 
    } 
} 
void on_mouse_up() { 
    mouse_down = false; 
    // dropped 
    // ... 
} 

私は、これは正常に動作します知っているが、私は冗長な変数や、全くこのような何かのために分離手順のようdonnot。 IP(命令的プログラミング)では、やむを得ないことかもしれません。私の質問は、FP(関数型プログラミング)のこのようなことに対処する良い方法はありますか?どんなプログラミング言語、Lisp、Scheme、F#、Rubyなどに関係なく、IPでこれを行うにはどんなアイデアや提案もありがたいですか?

+0

どのような冗長変数ですか? –

+0

上記のコードはほんの一例です。カーソルを別のオブジェクトに移動しながら、左、右、中央、ホイール、ダブルクリック、別の操作など、システム全体に多くの機能と制限を追加すると、変数のアカウントが爆発する... –

答えて

1

誰も1日の回答を試みなかったので、私はそれを撃つでしょう。あなたが議論している問題を理解していますが、答えはオペレーティングシステム、言語、およびランタイムライブラリに依存するはずです。

一般的な考え方は、マウスがダウンすると非同期計算が行われるということです。この計算はイベントを「ブロック」し、フェッチされたループで処理します。マウスボタンが押されたときに存在します。こののように見えますが、実際には計算が「ブロック」されると、開始された場所(マウスのダウンイベントを呼び出すメインのGUIスレッド)に制御されます。このようにして、状態は、語彙的に局所的な計算の範囲に見えるものにカプセル化される。その魔法は言語のランタイムによって処理されなければならないので、これは言語とOSにとらわれない方法で答えを得ることができる限りです。

このような実装の例としては、this answerarticle by Tomas Petricekをご確認ください。いずれもご質問の内容は限定されていますが、Windows、.NET、F#の狭い設定です。驚くべきことに、同じ概念が表現されている同一のPerticek、Real World Functional Programming: With Examples in F# and C#の本がありますが、C#では、通常は関数型言語とは見なされません。第16章、私の記憶が私に役立つなら、あなたのものです。

IP/OO言語プログラムで状態をカプセル化する場合、mouse_downハンドラでクラスのインスタンスを作成できます。インスタンスは、他のマウスイベントやUIイベントを受け取り、処理し、必要に応じて(マウスが上がったり、ウィンドウシステムがキャプチャモードをキャンセルする)、自身を登録解除して破壊するランタイムに自身を登録します。関数型の言語ほど上手くはありませんが、一般的なUIクラスでは可変状態を維持する方がずっと優れています。

+0

私はこれらの素敵なヒントを慎重に読んでいきます。ありがとう! –