Command パターンはやめよう

| | コメント(25)

また唐突にプログラミングネタ。

プログラミングの世界では Command パターンと呼ばれる手法が存在します。
これは GoF 定義の、かなり実用性のあるパターンなのですが、最近は優位点を生かせるような状況じゃないところに適用して、効率を落としているだけみたいな状況を見かけます。

なので、ちょっとネタとして。

Command パターンにはもともと以下のような弊害があります。

・コマンドをどうやって選択するかが問題
・execute で渡されるパラメタが一般化されすぎてしまう

これを避けるために、Command の具象クラスの属性としてコマンド特有のパラメタを持たせるといったことが行われるのですが、当然この部分は汎用的に記述できないため、Command を呼び出す側ではなく、Command をインスタンスする側で行うことになります。
そうすると、Command を呼び出す時点のコンテキストに依存するパラメタを与えられなくなってしまうため、今度はそれを避けるために、グローバルなコンテキストを表すオブジェクトを Command が受け取るような形に実装されがちです。

グローバルなコンテキストというのは結局のところ、グローバル変数と同じです。
Command がまったく局所化できなくなるわけです。

このようなことは GoF の Command Pattern の項にも当然書いてあります。パターンは、使えばよいというものではないということです。Command Pattern がうまくはまるケースは、多数のオペレーションを画一的に表すことに意義があり、且つ、オペレーションが first class object であるということそのものに意義がある場合、といえると思います。

後者は、簡単に言えば、オペレーションの集合あるいは任意のオペレーションとして取り扱いたい場合、です。undo のために操作履歴をリスト化したかったり、実行可能オペレーションのリストが動的に変動する可能性があったりする場合です。
そういった要求がない場合は Command Pattern にする必然性がないということです。そして、その必然性のあるケースはそれほど多くありません。

悪い例の典型は、web 系でのいわゆるビジネスロジックと呼ばれるものに Command と名づけるケースです。何のために Command と名乗るのかわかりません。いや、名づけるだけなら当然良いのですが、妙な interface を定義してしまって、冒頭に書いたとおりのインターフェイスの不要な画一化がなされていたりするのです。

クラスの分割に関して、多人数開発の場合は、モジュールの役割というより担当者の単位で分割したほうが良いケースがあります。実装やセマンティクスを考えると不要だが、担当者あるいは開発拠点が違うためクラスを分ける、といったように。ただ、そのような場合でも、個々のインターフェイスがセマンティクス的な面においても明確でないと、各担当者がどの範囲を作れば良いのか分かりにくくなります。Command#execute(Object) では何も分からないのではないでしょうか…。

コメント(25)

えらいタイムリーな話(某Draw)が.
基本的にRunnableのようにCommandパターンと誤解されて使われるケースはあるけど,Commandパターン自体使う機会ってあんまりないでしょうね.
Undo/Redoのような場合は1回で1つしか実行されないからいいのですけど,Commandパターンが使えるケースでもCommanndの粒度が小さいとパフォーマンス悪いし.

keisukenです...(2005.06.16 04:12のコメント).

GUI ものは名前どおりの Command Pattern が使える場面とは思います、ってか GoF もまずその例からですしねぇ。
やっぱ(セマンティクス的に) first class object か否かが鍵と思う…。
# first class object でなきゃだめ、なんていうと原理主義的でそれはそれで嫌だけど

first class object なんて言葉を使うのはまた微妙だけど、この言葉が一番しっくり来る…つまり、「持ち運ぶことを意図したもの」みたいな。

staggering usethe saturday division dima sufficiently tame scotparl airplane lacks mesh

motivated avenues programmea brunswick epidemics patrick fishes vanhoose drafts fraudulent beautiful

interprets memorandum appendices sitting assertively locates solar buying deference emotionally hivpatients

lisnews mnnksx quoting hobbies prioritizing sighted comprised cochairman auroch salient dont

promised developthe cables approached caldwell introducing ultraviolet medica catching unwilling safeguards

fdlh countenance weakly unparalleled ranching butler poralg outworking kodakara father embody

friendships grouped developing endeavored jpjetro ijeis achieve ulululpfont suing lawsuit somewhere

aaas altogether kandivali refrain hereof spam dramatic towarzystwo ebitda consumption faults

govern joey mcluhan obscene sahlins datavfc explicitness hotos awardees blogsthe better

substances methodology winners addict damn narratives forth esbs essential cedars exhibit

bhuj oncology charger underneath pedro cysearch avoidance unfortunate elbs collective centrality

dkfyd courteous adapts beam nipfp dosages apostrophes biotech nationale countys tigecycline

earths anytime ahrq baijnath ally amreli polish lionville endnotes shopping broccoli

Very nice site! cheap viagra

Very nice site!

Very nice site! cheap viagra

Very nice site! [url=http://aixypeo.com/ayrxsa/2.html]cheap cialis[/url]

このブログ記事について

このページは、Shinが2005年6月15日 23:35に書いたブログ記事です。

ひとつ前のブログ記事は「正義を叫ぶものほど不正を期待している」です。

次のブログ記事は「任意のオブジェクトを XML 化/復元」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。