kr_ryo 徒然日誌 <2005年11月13日分>

三國志製作記119〜抽象的工場の使いすぎは危険〜

2週間のオヤジパソコンかかりきりから一転、ようやく三國志製作復帰です(^O^)いやはや、新しいパソコンさわってると、やっぱり我がVAIOはもっさりした動きのような気がしますが、なんであれ動くのがよろしい(^O^)

さて、製作をお休みしている間に頭の中でデザインパターン知識が発酵してきたのか、いい感じに煮詰まってきました。これまでのAbstractFactoryパターン、つまり「抽象的な工場」って、かえってよくわかったようなわからないようなパターンですけども、これを武将や城といった、中身がかなりばらばらなものには使わない方がいいという決断をしました(^^;

前回までがまだ発酵前の知識をもとに検討していたため、自分の言葉でないというか、自分で見てもよくわからないというか、まあ、こなれてない文章だったので、もう一度はっきり問題点をはっきりさせてみましょう(^^;;Aまず、武将や軍団や城、これはプレイヤーが操作できる対象(オブジェクト)です。操作できる対象は、ボードゲーム時代からの伝統ゆかしくいくと、ユニット、という言葉でまとめられます。前回まではこれらをユニットとしてまとめてAbstractFactoryでいこうと考えていました。

ここでもうちょっと詳しく検討すると、まず城はマップに描かれていることが多いし、本来は移動もできません。だいたい城に対して操作するというよりは、城は操作される、と言う方が実質にあってそうです。また、軍団は武将がいなくては存在しませんし、そういう組織は会社なんかでもそうですけど、単に武将や兵をまとめた以上に、人とは別に存在していると考えられるけれども、城や武将と違って目に見える実体がありません。まずもって基本的に最初から存在している城や武将に対して、後から作ったり変えたり消したりが簡単に出来てしまう軍団は、まあ、結局、武将などのまとめ、ボードゲームでいうところのマーカーに近いものだと考えられるんですね。

と考えると、武将はユニットと言えるけれども、城や軍団はだいぶ性質が違うもので、共通化できそうなコマンド、たとえば移動なんかも、城はできませんし、そうするとほとんど見当たりません。ここでAbstractFactoryについて検討すると、大元のFactoryパターンとは、オブジェクト生産と管理の専属オブジェクトとする、というものなのです。関羽や張飛といった武将オブジェクトに、関羽という名前や武力99という情報を与えて実体化させるというのがFactoryパターンの役割です。適切な作りをしたFactoryオブジェクトに、作れ、という命令を与えるだけで、Factoryオブジェクト側でどんどかどんどか、関羽や張飛や蔡瑁なんかを量産してくれるのです。

じゃあ、AbstractFactoryとは何かというと、Abstract、抽象的という言葉が示しているように、生産すべきものが抽象的にまとめられるものであるならば、生産するときも抽象的にまとめてみよう、というものなのです。抽象的にまとめられるとは、関羽や張飛は武将としてまとめられますので、武将、が抽象的なことばです。私が文官は武将とは別だ、と言い張って設計したとして、孫乾や簡雍は文官で、関羽や張飛など武将とは別にした場合、文官と武将を揃えてユニットと言ったり、人物だとしてまとめることが考えられます。同じように、ここで私は、城と軍団と武将をユニットとしてまとめたわけです。

そうそう、こういう設計の部分で、オブジェクト指向設計は設計者がどういう風に世界を見ているのかが明らかになる、と言われます。それが恥ずかしい、といわれることもありますが、なんとなくその気持ちはわかりますね(^^;私はボードゲーム風に、城と武将を軍団をセットでユニットと考えたわけですが、これがいけない。

まず、抽象的オブジェクトとされるユニット、これは下位の、具体的なオブジェクトが持つすべての要素を基本的に持っていなければなりません。武将という言葉で関羽を表すことはできても洛陽は表せないですが、武将という言葉で関羽を表せないといけません。そういう意味では、文官という言葉で関羽を表すのはかなり無理がありますね。また、張飛は武将の下位概念というのもすんなり納得いくでしょう。そういう意味で、武将ができることは、関羽ができて、関羽ができることは武将ができる、ということも納得いってもらえるでしょう。

そのため、関羽や張飛が移動したり太守となったり、戦闘したり兵を訓練したりすることが、すべて、武将が移動したり太守となったり、戦闘したりすることができる、と言っても、当たり前に聞こえましょう。では、武将と城と軍団をセットでユニットという概念で抽象化するとどうなるでしょうか。ユニットは、それぞれの下位の下位の、関羽でもあり、洛陽でもあり、張飛軍団でもあるわけです。ユニットが移動できるとすると、洛陽も移動できないといけません。また、ユニットに生産力があるというと、張飛にも生産力があることになります。まあ、あるっちゃあありますが(^^;;これらの共通点は、いいところ、兵を持てる、というところでしょうか。それだって、洛陽は兵を訓練できません。

こうやってみると、武将と軍団と城を共通化するのはかなり無理があるのに、それを抽象的概念であるユニットという言葉でまとめても、ほとんど共通化されないわけです。共通部分がほとんどないものを抽象化したとしても、具体的な部分で補えばいいわけですけども、それだったら共通部分の必要性がほとんどなくなってしまうわけです。

抽象化とは結局、オブジェクト指向の継承と同じものでして、過剰な継承は戒められています。継承についてはいいたとえを思いつきました(^-^)Windowsのフォルダをイメージしてください。過剰に整理しないと気が済まない人がいます。その人がデジカメで写真を取って、フォルダで整理したとします。運動会で子どもの写真を撮ったとして、C:\個人フォルダ\画像\デジタルカメラ\写真\花子\保育園\運動会\4歳\かけっこ\スタート前、というフォルダ構成で、ようやく目当ての画像にたどり着くなんてことを、する人、いませんか?(^^;;花子と太郎が一緒の写真は、花子と太郎というフォルダに分けていれるんでしょうか?これは過剰だとしても、これの半分くらいになっている人も多いでしょう。反対に、全部がひとつのフォルダに入っていて、整理しなきゃ、と強迫観念におちていて、でもしない、という人もいるかもしれません。で、オブジェクト指向の継承も、結局は同じことで、過剰な分類同様、過剰な継承にすぐなってしまうのです。

過剰な継承は、目指す具体の対象に対して、抽象的な名称がすべてを言い表せないことから生じています。とはいえ、先程のフォルダ構成、画像、というだけですべてを表していると言えませんか?だから分類なんてせず、せいぜい画像\2005\の直下ぐらいで十分なのです。逆に、抽象的な名称が具体をまったくかすめもしないというのは問題です。\戦車\関羽ってのは、戦車に関羽という名前をつけているならともかく、三國志のゲームではわけがわかりませんね。

そう考えていくと、やっぱり城と武将をセットに考えるのはかなり無理があります。ユニットという言葉で表せる内容がかなり少なくなっているのです。共通部分がないのに、ユニットということばで表すと、結局何も言っていないことになって、抽象化が無駄になるとともに、過剰な継承をしているだけに思えてくるんですね。過剰な継承は煩雑になるばかりで実際にはそれほど役にたちません。けれども、分かるとは分けること、人間はついつい分類してしまいがちで、フォルダにしても継承にしても、あっと言う間に複雑に分類してしまうことができてしまうのです。

これに対してAbstractFactoryでは、抽象的なオブジェクトが下位のオブジェクトのすべて、操作や状態すべてを持っていないといけないとされます。デザインパターンとは、そういう発想なのです。だから、抽象化は非常に窮屈になります。下位の武将が移動できて武力を持つなら、上位のユニットも移動ができて武力を持つのです。とすると、下位の城も移動ができて武力を持つのです…?ん、やっぱり妙ですね(~_~;)逆に、下位の城と武将が兵を持つということだけ共通であるならば、上位のユニットは兵を持つということだけ持ちます…意味が限りなくありませんね。それでも、上位で共通化した部分以外を下位は持ってはいけない、という発想なのです。そうすることによって、作る際も使う際も、城だとか武将だとか気にせず、ユニットに対して操作すればすむ、という発想なのです。

AbstractFactory以外の部分では、ユニットに対して移動命令を出したり、生産したりするわけですから、武将とか城とかの区別をせずともすみ、楽です。楽ですが、城に対しては移動命令を出せないので、共通部分が少ないならAbstractFactoryは使えない、使えないのになんとか使おうとしていて、無理があった、デザインパターンの過剰な当てはめに落ちていたのです(*_*)ここでも、なんとかしてデザインパターンを当てはめた方がいい、という思い込みがあったようです…むむむ(~_~;)

それでようやく、せっかくAbstractFactoryのユニットとしていろいろ作っていたのですけども、すべて御破算にして(T-T)やっぱりまた作り直しです(ToT)とはいえ、AbstractFactoryという作りが、使う側、たとえば操作部分にはさほど影響しないので、ここだけ直せばとりあえず済みます(^o^)デザインパターン&オブジェクト指向のメリットで、使う側はユニットに対して、表示せよ、とか言っているだけで、使う側の方で、味方武将を順番に名前と所在を表示して…というプログラムでないおかげで、修正が最小限で済みます。ほっ…(;^o^A後は進む進む…って、これで何度目かの修正、修正してばっさり削除したときに、いっつも進んでいるような気がしますねぇ(^^;;;

index

〔TopPage〕

このページへのリンクはフリーです。
このページについてのご意見、ご質問などは、kr_ryo_green@yahoo.co.jpまでお願いします。
Copyright 2005© kr_ryo All rights reserved.
訪問件数