kr_ryo 徒然日誌 <2006年7月9日分>

三國志製作記145〜前へ進め!…前ってどっち?〜

前回まででようやく(-。-;)ルールの明確化が図られたところで、続いてようやくまたプログラムへの復帰です(^O^)なんだかめーっちゃ久しぶりな気がします(^^;Aこの間、プログラムからまったく離れてていたかというと、今のプログラム中にかなり気になる部分があったので本屋さんでいろいろ見たりしていました。

なんなのかというと、UI、ユーザインタフェースの部分です。以前、この検討から再びルールの検討に落ちていったことを思い出します。それでずいぶんいかにもゲーム風な雰囲気からシミュレーションできるようになってきたわけですが、プログラム自体に内在する問題はまだ存在しています。どういうことか。とにかく複雑なんです。

SWGのUIはひたすらボタンを押すだけで済みましたので、非常に簡単です(^^;A逆に言うと、コマンド主義、機能中心主義だから簡単だったわけです。つまりまず、何をしたいか→何にするか、何がするかという流れです。移動→第3艦隊→第4星系という感じです。これは人間の自然な思考に反している、ということで生まれてきたのがオブジェクト指向だったので、今から考えるとなるたけやりたくないわけです(^^;A

人間の自然な思考とはどういうことかというと、いきなり何々をしたい、というわけではなく、何か対象があって、それをどうしたい、ということなのではないか、ということです。つまり、機能中心主義は、いきなり動詞からスタートするわけです。移動したい→誰を→どこへ、という感じです。したい!というのがいきなり出る、なんだか危ない感じというか欲求不満な感じで相手はなんだっていい、後からついてくる、という感じですな(^^;A

しかし、自然な発想ではいきなり何々したい、とは思わないわけです。対象、たとえば第3艦隊があって、それをどこかへ移動したい、という流れです。それだって、第3艦隊「を」第4星系「へ」と、ここまで2つ対象を出した上で動詞がくるわけです。そういう意味では英語は主語の後動詞がくるので、かなりしたい派なんでしょう(^^;Aドイツ語なんかは動詞が一番最後に来たりするんで、ヨーロッパの人が必ずしもしたい派なわけではないわけでしょうが…(^^;A

で、我々日本人は、最後に、したい、という動詞が来るわけでして、まずは対象があってのことです。そういう意味では、目的語はともかくとして、主語・対象を先に指定してから、後から動詞・コマンドが来るという流れが自然で、これが対象中心主義、すなわちオブジェクト(もの・対象)指向です。こうすることで、最初に指定された対象によって、何をできるか、というコマンドが限定されます。SWGなんかでは、艦隊がいないのに艦隊移動コマンドが押せたりしますが(^^;Aそういう風にはならないんですね。

『オブジェクト指向開発講座』では、かつてのファイラ(今ならエクスプローラ)やワープロで、ファイルや文字列を選択してから、移動やコピーを選択するタイプと、いきなり移動やコピー機能を選択してから、それを行う対象を選択する、という二つのタイプがあり、結局オブジェクト指向的な前者、まず対象を選んで機能を選ぶという方が選ばれた、という話がありました。かつてのOSも、MS−DOSなんかでは、「コマンド 対象」だったわけで、こっちがメインだったところ、今のWindowsでは「ファイル 機能(たとえばダブルクリックで開く)」の順番、つまりオブジェクト指向になった、という話もあります。

ゲームがいまだに機能・コマンドを選択して対象を選ぶのは、MS−DOS時代のゲームの名残なのかもしれません。で、もちろん私の三国志はそれをオブジェクト指向にしよう、ということで、ここで悩みが出てくるわけです。ああ長かった(^^;A

何が問題かというと、武将や城をリストから選択して、それが実行できる機能を表示しつつ、選択されればどうするか、という流れの組み合わせを全部作っていかなければならないからです。武将が実行できる行動はいろいろありますし、武将の状態によっても変えたりすることも考えられます。そうするとものすごい組み合わせが予見されます(*_*)問題はここです。コマンド自体は右クリックで選択することが予定されています。ここでまたボタンの羅列はかえってスペースの問題やなんかを呼び起こして非常に邪魔臭い、と。

オブジェクト指向的な内容をオブジェクト指向で表現するわけですから、親和性が高いというものの、改めてプログラムを見ると、ものすごい組み合わせの量です。コマンドをひとつひねり出すたびに、リスト表示、クリック結果、右クリックメニューの設定をそれぞれ用意しなきゃならんですからね。いくらオブジェクト指向といえども、内容は単純であってもその量によって何がなんだかわからなくなる、というわけです。

ん?こう書いていて問題がはっきりしてきたような気がします。現状はリスト表示、クリック結果、右クリックメニュー設定のそれぞれが実はオブジェクトだったりします。武将移動用リスト表示、武将移動用クリック結果、武将移動用右クリックメニュー、という具合に、何かの「機能」ごとにオブジェクトがある、と言えますね。そうです、これはオブジェクト指向の殻をかぶった機能中心主義です。ああなるほど、だからオブジェクトが無限に増えるような感じになって見通しが悪くなるわけです。

「機能」が主語になると、とにかく量が増え、収拾がつかなくなります。そうです。そうでした。コマンド型OS、コマンド型シミュレーションゲームがコマンドが多すぎてとっつきが悪くなる、というのと同じ、とにかく量が、ちょっとの違いだけで量がものすごく増えるのです。これはオブジェクト指向に立ち戻らないといけません(`´)

オブジェクト指向では、オブジェクトは対象、その機能はメソッドと言います。リスト表示なんてのは、本来メソッドであるべきで、オブジェクトにしちゃあいけなかったんです。じゃあリスト表示というメソッドを持つオブジェクトはなんぞいな。そりゃあリストでしょう。じゃあ、リストに表示させる対象を用意するメソッドをもつオブジェクトはなんぞいな?んん、ここが問題です。

んんんん、ゲーム上には実は登場しません。当然です。ユーザ様ですからね。(ああ、きっとこれがアクターってやつだ…と独り言)じゃあユーザ様というオブジェクトを作ることになるんでしょうか?んんん、実際は現実のユーザ様はいらっしゃいます。ユーザ様はウィンドウを通じて命令をプログラムに送られてくるわけですから、メソッドはフォームにあるわけです。(やっぱりアクターはオブジェクトじゃあないんだ…と独り言)

ユーザ様はオブジェクトとして表現しないとして、では、リストに武将を表示させる、その表示させる、のは、どのオブジェクトか。この中では、リストか武将かしかありません。リストは表示をさせられる方なので、では、武将かというと、自分自身のうち、ユーザ様の手下の武将を選択してリスト表示する、というような内容を自ら持つか…うーん煩雑くさいですねえ〜(-_-)一覧の表示は、手下武将だったり、移動できる武将だったり、太守だけだったり、いろんなパターンがありますが、それが全部武将が持っている、というのは変な気がします。

結局リストとは別のリストコントロールというようなオブジェクトを作ることになります。で、それぞれのリスト表示内容やクリックした結果がどうなるかというような内容のオブジェクトを作ることになります……んん?結局また戻ってきているような気がしますね(--;

整理すると、コマンドをひとつ実行しようとするたびに、次の対象をリスト表示する、対象の左クリック内容を準備する、対象の右クリックメニュー内容を準備する、この3つの内容を実行しなければなりません。これまではそれぞれを別々のオブジェクトにして組み合わせてきたわけです。それが多くなるとだんだんこんがらがってきた、というわけです。ただし、この3つは常に生じるわけです。だったら3つまとめたひとつのオブジェクトにすればいいんじゃあないか?

もっとも、リストの表示方法は同じものをよく使うわけです。将軍に任命するのも、太守に任命するのも、頸にするのも、手下武将一覧なわけです。それをいちいちすべての3つまとめたオブジェクトのメソッドにもたせるのはあまりに無駄が多い、と。だから3つばらばらにして組み合わせようとしていたわけなんですね。で、増えまくる、と。

こういう実際の機能内容を関数にする、というのがオブジェクト指向以前の方法でした。もちろん関数でなく、単機能オブジェクトにしたとしても実態はほとんど同じです。そうか、オブジェクト指向にしても、これでは関数にしているのと同じなんだ!(@_@)もうちょっと値打ちのある方法にしなきゃ、メリットがありません。うーん、よーく考えなきゃ…

……(~O~)(-.-)(_ _)……(-_-)zz‥(-.-)Zzzzz(_ _).oO‥……フアア(~ρ~*)と、こうやって考えてるとよく寝ちゃうんですよね(^^;Aそれにしても、まさに単機能オブジェクトと関数って、まったく同じですね。実態が同じというより、役割も中身もプログラム的意味も同じじゃあないか?グローバル関数でなくローカル関数にすれば、まったくもって同じ…後はオブジェクトにすると生成消滅に手間がかかるくらい…それだったら関数の方がよくわないか???

これはオブジェクト指向のメリットというか、意味から考えていかなきゃあならないという気がしてきましたね。オブジェクト指向のメリットは、データがある程度永続するオブジェクト内に封じられていて一体のものであって、他からは勝手に変更されない、ということです(カプセル化)。だとすると、データを持たない単機能オブジェクトだったら、やっぱり単機能関数と同じなわけです。ここでわざわざオブジェクトにするからには、瞬間で消えるわけでもなく、データを持っている、という方がいいわけです。

もちろんデザインパターンを知った今では、デザインパターンのために作られる単機能オブジェクトがあってもいいし、それで意味がある、と知っています。とはいえ、デザインパターンを形作るわけでもないなら、まさにオブジェクト指向で作っているからオブジェクトにしている、というにすぎないようにも見えます。うむむ…

だとすると、別にもとのままでもいいような気がしてきました…ああ、今回は考えつつまあ、いいか、というお話ということで…(^^;A

index

〔TopPage〕

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