Molecules-ClickItemComponent

Admin私のストア

MoleculesのClickItemComponentについて説明します。

ClickItemComponentはClickComponentと任意のComponentの組み合わせです。

 

ClickComponentはstd::function<void()>型を用いてクリックイベント時に任意の関数を実行します。ClickItemComponentはClickComponentの子要素に任意のComponentを子要素にして指定したComponentのクリック時の動作を実現しています。

Kotaroではstd::functionを使ってイベントハンドラに関数処理を委譲したり、コンポーネントの構成処理の委譲も行います。Componentの実装ではstd::functionを使った委譲を理解する必要があります。

委譲のイディオムはjavascriptでもよく使われる一般的なものです。関数の定義を行い、インスタンス化して別のスコープに渡して、そこで実行します。

次の例ではjavascriptのクロージャオブジェクトをクリックイベントハンドラに渡して委譲を行なっています。

var click = ()=>{ var hoge="hoge"; return ()=>{console.log(hoge); };

<Button onClick=click()/>

オブジェクトを渡してメソッドを実行するのと同じですが、オブジェクトの所有権は渡した先に移します。

C++ではstd::moveを使って委譲を実装できます。std::unique_ptrはムーブ可能でコピー禁止なので、std::moveとstd::unique_ptrを使って委譲のイディオムを堅牢で効率よく実装できます。

javascriptの例ではonClickに委譲するオブジェクトの型は指定していません。C++ではstd::functionを使用してさらに委譲処理を抽象化し、javascriptのような抽象的な委譲を簡単に実装できます。

class Click{ void operator( )( ){ std::cost << hoge << std::endl; } };

std::function<void()> click = Click{&hoge};

Clickオブジェクトのコンストラクタは省略していますが実際は必要です。std::functionを使ってclickの型からユーザー定義型Clickを消去します。std::functionを渡して委譲するため、委譲先ではどのような定義のオブジェクトであるかを知る必要がなくなります。

委譲処理のイディオムについて厳密な定義は見たことないですが、私はこのイディオムをオブジェクト指向プログラミングにおいて型消去による関数オブジェクト渡しによって実装するものだと思っています。そもそもjavascriptには型はないため、関数オブジェクトのインスタンスを渡すだけで任意のオブジェクトに委譲できます。javascriptは強力な言語だと思います。C++は静的言語で言語機能を拡張しながら新しいプログラミングスタイルを提供してくれています。

ClickItemComponentのテストでは、カウントを増やす関数とImageComponentを引数にしてクリックイベント時の動作を確認できます。

ブログに戻る

コメントを残す

コメントは公開前に承認される必要があることにご注意ください。