kr_ryo 徒然日誌 <2004年12月26日分>

三國志製作記86〜オブジェクト指向に終わる2004年!〜

とうとう今年最後の徒然日誌です(^o^)今年から来年にかけては元旦が土曜日ということで、非常に休みが少ない印象です(~_~;)今週は今年最後の週なのにまだ仕事をしているので、なんだか年の瀬という気はしませんね〜!

しかも我がプロバイダのlivedoor、年末にかけてメールサーバのメンテナンスをされてたんですが、メンテナンスが終わったとたんに私がメールを受信できなくなりました( ̄□ ̄;)先週受信できないことに気づいたんですが、それ以来ずーっとできてません(TдT)どうなってるんでしょう?あれやこれや試してみたんですが、どうも決定的な原因はよくわかりません。正しい設定とかなんとか色々試してみてるんですが、無情にも受信できません、のエラーが…(x_x)

これまでできていて、設定を何もかえていないのにある日突然できなくなった、その契機はサーバメンテ……原因は明らかというか、手が出ないというか…(--;)なんらかの原因が天上の方で起きていて、直してくれるのを待つしかないか…!天災続きの今年最後が、こんなことで終わるとなかなかつらいものがあります(TдT)

と、気をとりなおして(^^;;今年1年、SWGのバージョンアップにはじまり、三國志のプログラム再構築、インターフェースの変更、Delphi7の導入とデータベース使用にともなう変更、さらにはオブジェクト指向に変更するためまたまた変更がありそうと、変更プログラムに明け暮れた感じです(^^ゞ完成しないのはともかく(~_~;)だんだん技術も内容も向上している、と思いたいところです(^^;;;そんな今年最後の流行り(^^;;はオブジェクト指向、意外とあっという間になんとなくまで理解したような気がします(^-^)必要は発明の母とはよくいったものです。

ところで、今更ながら、我ながら、前回前々回オブジェクト指向の理解の説明はわかりにくい(^^;;;そのうえ簡単に言おうとすればするほどはまってしまいます。なるほど、プロでも理解されていないことが多いというのもよくわかります。簡単に説明したから簡単になるというものでもない(~_~;)ただ、技術うんぬんよりも発想の転換なだけに、理解して一度ピンと来ると、DelphiじゃなくともC++でもJavaでもプログラムがなんとなくでも普通に読めたりします。

さらに、どうやら前回なんだかもやもやと、けれどもこれはオブジェクト指向の限界ではないか、という点についても、すでに議論がなされていました(^^;;オブジェクト指向は実はクラス指向なのではないか、というお話です。ここのサイトにはオブジェクト指向に関して惜しみなくいろいろな議論がなされています。最初からこのサイトを見つけていれば、もうちょっと理解が早かった…かもしれません(^^;;

それにしても、前回私が気にしていた問題点はやはり生じるようです。つまり、一度オブジェクトをインスタンス化(生成)してしまうと、オブジェクトとして当初準備していた内容と異なる変更修正は一切きかない、ということです。たとえば、クラス分けとして武将の身分を準備しても、移行できないのです。そういう前提として何をどのようにオブジェクトとするのかきちんと分析しないといけません。

その意味ではオブジェクトを「もの」とはよくいったもので、人や生き物と違って本質的に成長しないのです。パラメータとしてのデータは上げ下げ変更がきくとしても、当初準備していた以上のことには対応できません。ラジオという「もの」は、パラメータを変更して番組を変えたり、音量を変えたりすることはできますが、テレビでないので事前に用意していない、「映像を写す」ということはできない、ということです。

そういう意味では当たり前じゃないか、という気はします。けれどもオブジェクトを「人」として考えると、人はできることは色々あるわけです。あらかじめ用意していたことしかできない、ということはなかなかもどかしい感じはしますね。しかしながら、ゲームではあらかじめ用意しておいたことしかできないわけですから、これはこれでまあいいか、とも思えたりします(^^ゞ

そんな風に考えていくと、身分によってできることが違ったり、することが変わったりするという分析自体がおかしいとも思えます。どういうことかというと、ラジオが音楽やニュースを音声で届ける、というのと、諸葛亮が軍師として天下三分の計を思いつくというのとではわけが違うのです。ラジオができることはそれしか準備していないからですが、実際の諸葛亮は軍師でなくたって天下三分の計を考えたりするのです。それを諸葛亮が軍師だから策を思いつく機能がある(^^;という分析をするのが不自然です。

ただ逆に、将軍だから兵を指揮することができる、という発想もあるわけで、文官ならたとえ張飛であろうと軍団を指揮させてもらえません。そういう意味では機能として捉えることも自然です。張飛は張飛という特質があって、それが将軍に向いてるとしても、将軍としてオブジェクト化されなければ、将軍として行動できないのです。そして、原則として張飛オブジェクトは最初にインスタンス化されれば改めて別の身分でインスタンス化されないのです。つまり、文官の1人としての張飛という存在(オブジェクト)を消滅させなければ、文官という身分からは逃れられず、将軍の1人としての張飛という存在に身分変更できないのです。クラスチェンジ不可、完全身分階級社会的発想ですね。オブジェクト指向ではなくクラス(階級)指向といわれるわけです。

こう考えていくと、どんな命令でもとりあえず受けることができる、命令対象としての武将と、実際にある行動をすることができるかどうか、という行動対象としての身分役割を別と考えた方がよさそうですね。そうしないと、身分ごとにできうる行動を異ならせる、という現在のコマンド体系を考え直さなくっちゃあならないということになります(T-T)

ただ、これまた前回でも気づいたとおり、全部の身分でできること、つまりどういう武将でもできるコマンドをすべて武将クラスに詰め込み、身分パラメータによってできたりできなかったり、ということを決めるとすると、単に巨大な武将クラスがどでんとあるだけで、機能別手続指向型よりもより一層複雑化しそうな気もします。

どうすればいいでしょう?基礎に立ち返ってみましょうか(^-^)まず、オブジェクト指向を目指した理由は、複雑怪奇化するプログラムの見通しをよくしようとしたことにあります。オブジェクト指向により、手続全体を考えるんでなく、細かい完結したオブジェクト同士のメッセージのやりとりでプログラムを組んでいけば、途中で無数に枝分かれするスパゲティなプログラムにならなくてすむ、ということです。

ただオブジェクト指向では、すること、つまり、機能については、それ自身をオブジェクトとして見るのでなく、オブジェクトのすること、オブジェクトの機能(これをメソッドといいます)として考えるのが基本のようです。「すること」そのものには、データを含まないだけでなく、こうやってああやって、という、手続そのものであって、オブジェクトがする、というオブジェクト指向ではなく、単なる手続指向に陥ってしまうからです。

ということで、オブジェクト指向では、「すること」「機能」でなにかをひとまとめにするんでなく、無理にでも(?)「もの」をオブジェクトとするように考えます。やや教条的な気もしますが、そうしないと正しいオブジェクト指向になりがたいのでしょう。三國志のゲームでは「もの」は城でや武将であったりすることが自然です。それから軍団であったり、勢力であったりの集団も「もの」に入りそうです。ここに、将軍や軍師といった身分が「もの」に入るかどうかが問題となってくるのです。武将と将軍などの身分はかぶります。同じ張飛を表現するとして、将軍や軍師を含む身分で表現しても、1000人分武将の1人として表現してもどちらも成り立つのです。

将軍や軍師という身分は、できること、に差がありますが、武将、では原則差はありません。前者の問題は、身分の移転によって結局せっかくつくったオブジェクトが消えてしまって、張飛という究極のアイデンティティのよりどころとなりづらい点です。後者の問題は、武将のオブジェクト部分だけプログラム的に大きくなることと、基本的に各身分ごとのすべての行動ができるのに、結局できることに差を設けることが不自然な点です。やはり、最上位概念に武将、があって、下位に将軍や軍師という具体的身分クラスがあるのが自然に思えます。

とすると、武将オブジェクトでは名前や能力などの基本的要素だけを持ち、行動するためには身分クラスを別につくり、その身分クラスを通していろんなことをすることになります。ちょうど虚亜ファイターが上半身オブジェクトと下半身オブジェクトをくっつけて、機動歩兵となるようなものです……よくよく考えると、やっぱりなんでそんなことをわざわざしないといけないのか理解に苦しみますが(^^;;そういうお約束の機動歩兵であれば、単なる戦闘機よりもいろんなことができるということなのでしょう。そうであってもそんな複雑なことをせず、最初から機動歩兵にしておけばいいようなもんですが(^^;;;まあ、で、虚亜ファイターが武将オブジェクト、上半身とか下半身が身分オブジェクトで、武将オブジェクトが身分オブジェクトを持ってはじめて何かできる、というイメージです。

そうすると、武将オブジェクトは身分オブジェクトを持っているというイメージで、持っている身分オブジェクトに応じてできることが変わってきます……とすると、武将オブジェクトに命じるよりも、身分オブジェクトに命じる方が自然ですね…だいたい、命じることができるかどうかは、武将オブジェクトがどうこうというよりも、どの身分オブジェクトを持っているかによります。と、なると、武将に対して命じる、というより身分に対して命じ、たまたまその身分に武将がいた、という感じであって、これだとなんだか身分の下に武将がいるようなイメージです。あれ、いつの間にか逆転していますね(?_?)

まあ、身分によってできることが違うとするからそういうことになるんであって、誰でもなんでもできるのであればそうはならないでしょう。ところが誰でもなんでもできるとすると、身分なんていりません。せめて現在の役割がある、という程度でしょう。ただ、これまた現在の役割によってできることは変わります。現在文官なのに突然軍団を指揮したりはしないのが自然です。となると、文官という役割、武官という役割によってそれぞれ現在できることが変わります。となると、役割オブジェクトを持つことになって……なんだ、結局一緒じゃん( °O °;)

うーん、こうやってつらつら考えていくと、どうもよくいわれるオブジェクト指向の三要素、カプセル化、継承、多態性だけでは何かが抜けている気がするんですね(~_~;)それだけではプログラムをオブジェクト指向にしたからといって、うまくプログラムが作れるような感じがしません。結局はどうやってオブジェクトを作るか、何をもってどのようにしてオブジェクトを作るか、という視点が、例の三要素だけではよくわからない、というのが正直なところです(x_x)

そうそう、何かがおかしいと思いながら色々調べていくと、オブジェクト指向は例の三要素が重要だ、という意見もあれば、例の三要素はC++が特に強調しているだけで、本家筋のsmalltalkではオブジェクト同士がやりとりすることだけに着目するものであって、三要素を特別視するのはおかしい、という意見もあります。

こうやって考えていくと、実は私が生まれる前からすでに登場していたという意外に古い方法であるオブジェクト指向も、いまだ成長中、発展途上に見えます。うーむ、これでは移行はなかなか簡単にはいきません。オブジェクト指向に移行するためには、オブジェクトをどうやって作るかを学ばねばなりません。そのオブジェクトをどうやって設計すればいいのかが、例の三要素だけでは明示されていません。オブジェクト設計をどうやって行い、何をもってオブジェクトとし、オブジェクト同士をどう扱うか、本当に重要なのはそのまさに設計にゆだねられているところの、設計の方法なのかもしれません。む、こりゃあオブジェクト指向に終わるといいながら今年の謎は今年のうちに解けなさそう、来年につづく、というところでしょうか(^^ゞ

と、落ちもついたところで(T-T)それでは皆様よいお年をお迎えください(^0^)/~~

index

〔TopPage〕

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