富士五湖.TVへ
|
小説のページへ
|
その他コンピュータの目次へ
オブジェクト指向を考える
copyright 1992
Kubo
オブジェクト指向とは?
「オブジェクト指向って何?」、「今までの考え方とどこが違うの?」と言う 質問にあなたは直ぐに答えられるだろうか?
そこで「オブジェクト指向」を分かりやすくするキーワードを幾つか用意した 。
1.
オブジェクトつまり、「物」である。物とは、実体であったり、観念であった りする。オブジェクト指向の一歩は、「空中に浮かんでいる物(球)に対して何 か問いかけを行うと、その物が反応して何か振る舞う」と言うイメージを自然に 頭の中で想像できることから始まる。
2.
データの隠蔽とデータ優先の考えは、「
カプセル化と抽象化を考える
」に掲載してあるので深くは触れない。(球のイメージは隠蔽のイメージでも ある)
3.
継承基本的な考えは、似たような事柄(コーディング等)は、継承によって後 工程を容易にすると言うこと。
本件は、生命進化の継承図(生命の木)を想像すると分かりやすいかもしれな い。 例えば人間の赤ちゃんが母親の胎内の中で、進化の数十億年を10カ月余 りで行ってしまう話である。遺伝子が生命継承を全て記憶していて胎内で忠実に 生育しているのである。
つまり、似たような性質を意識しながら設計やコーディングを行っていけば、 (単細胞生物と多細胞生物の差分、多細胞生物と…の差分、猿と人間の差分 と言うように)差分だけを設計者は記述するだけでシステム全体を記述できると 言う概念である。
ただし、このあたりのことを本当に理解するには相当なセンスが要求されるこ とを忘れなく。
考える参考として継承には2つのパターンがあることを記しておく。(これは ノウハウ)
1.単に継承によって機能が複雑になるパターン(生命の木)
ほとんどの技術者はこのイメージしかないと思われる。一般的に理解を超えな い継承パターン。(構造化と隠蔽を完全に取得している技術者なら移行できる)
2.全ての可能性を継承図の大基に置いて継承させる(インターフェイス概念)
こちらの設計となると相当センスが要求される。簡単に説明すると、将来どの ように継承されても最初のインターフェイスに変更を加えることなく基本動作を 保証することである。
この事は後述の「動的結合」と深く関与する。これが本当のオブジェクト指向 である。
4.
動的結合
本来オブジェクトとは、単独で浮かんでいる球だと説明した。本記述ではあま り触れていないが、この球に対して何かしらの指令(メッセージ)を投げかける と、浮かんでいる球は何かしらの反応をする。
今、ここに「桃太郎」と「猿」と「キジ」と「犬」がオブジェクトとして存在 していると仮定しよう。
ここで、「桃太郎オブジェクト」が「鳴け」と指令をした場合、それぞれの家 来オブジェクトは反応し、それぞれの鳴き声を発するであろう。また、「攻撃」 と指令を発すればそれぞれのオブジェクトは、それぞれの武器で攻撃するであろ う。
また、「鳴け」とか「攻撃」とか言う指令はそれぞれの家来に対してインター フェイスとして取れる。
つまり、どのような家来が付こうとベースとなる指令は全てに於いて共通であ ると考えられる。よって、このベースとなる基本指令(インターフェイス)は基 本として隠蔽し、各家来オブジェクトをここから派生させると都合がよいと考え られる。
つまり、本項での要点は、将来性のある基本部を如何に設計するかである。
このことから「継承図」の設計は、従来のように行き当たりばったりでは決し てうまくいかない。ボトム・アップとトップ・ダウンを何度も繰り返してセンス 良く設計する必要がある。(経験から全工程の1/2程度もしくはそれ以上かか る)
5.
イベント・ドリブン今後主流となるOSの姿。(WINDOWSもそうである)本説明 ではタイムスライスと区別する。
イベント・ドリブンとは、何か環境に変化があったり、何かしたいときにOS等 がメッセージを無秩序に発行し(イベント)、メッセージに対応したオブジェク トがメッセージを捕まえて何か仕事をする(ドリブン)関係のことを言う。
このことは、今まで説明してきたオブジェクト指向の考えに適した方法である と判断できる。
オブジェクト指向の今後
現在WINDOWS用に続々とオブジェクト指向用の開発ツールが出てきて、簡単にWINDOWS アプリケーションができる時代になりつつあるが、簡単に開発できるかどうか はオブジェクト(球)自身が如何に汎用性のある(ユーザーに即した)製品を提 供してくるかにかかっている。
もし、優れた開発ツール(オブジェクトの張り付けだけで動作する)が提供さ れればシステム開発者にとって(ユーザーも含む)今まで余計だと思われた工程 (メニュー・レイアウトやちょっとしたアプリケーション等)はずいぶん楽にな る。
また、社内での継承構造群がそろってくれば社内開発もずいぶん楽になる。欠 点は継承構造図を全て把握しないと開発に入れない面があることはある。ただし 今後、独自オブジェクトのビジュアル化によるツールが進化すれば、この辺も解 消されるだろうが。
こう考えると、従来で言うところのアプリケーションしか制作できないエンジ ニアはいらなくなる。これは脅しではなく本当にいらない。データ中心に物事を 考えれば、今まで開発してきたようなシステムは、ほとんど周辺で出尽くしてし まい、もうアプリケーションの道が残っていない(必要ならちょっとしたアマチ ュアにも開発できる)。
そうすると、今後求められる開発者像とは、何かに突起した人(ハードに強い とかアイディアに優れている)か、ユーザーに対してコンサルティングできる人 の2局面しか残らない。しかも、プロらしく開発の仕事を進めていくには、オブ ジェクト指向の設計が少なくともできなければ確実にお荷物になってしまう。
本当である。社内開発が楽になると言うことはそう言う面も含んでいるのであ る。従来の設計の方がコンピュータ的で異常である(特殊能力を身に付けたり、 強引に動かす姿勢)。早急に過去のことを振り切って技術向上をはかるよう望む 。まず手始めに「
カプセル化と抽象化を考える
」を読もう。そうすれば従来の言語でも、どのように設計したらよいか自ずと 答えは出るはず。
マトリクスを例にとって
注意:C++では、継承の1つの箱のことを「クラス」と言う。
思考過程
1.
マトリクス(行列)を応用した座標変換を従来の考えで設計すると、単純に2 次元とか、3次元とかの座標変換専用のモジュールにしてしまい、その時の場面 でしか役立てないだろう。
仮に汎用的にしてもどこか使い勝手が悪い「めんどくさい」モジュールになる 。
細かいことは別としておおむねこんな設計。
2.
オブジェクト指向では…
1)マトリクスを専用に扱うクラスが必要だろうと想定する。
2)このクラスから派生させるクラスには何が必要か考える。
(1)ベクトルはマトリクスの一種では無いだろうか?
(2)各次元の座標変換にも使えるぞ!
3)ベクトルと座標変換クラスからマトリクス クラスを見直す。
(1)次元数に依存してはいけないのだな。
(2)単位行列や逆行列やコピー関数も必要だな。
(3)加減乗除は矛盾しないか?
4)更に深く検討
(1)数学演算に必要なクラスが更にあっても良いではないか?
(2)数学演算クラスは全ての演算系の基本クラスにしよう。
5)などと継承図を何度となく検討すると…。
実際とは違う箇所もあり。
6)このような継承図になり、例えばクラス使用の際、図形変換の実際のコーデ ィング量は、以下の通り。
2次元座標(4,5)を(10、20)移動後30度回転する場合、
M2Coordinate p( 4,5 ); //座標(4,5)を用意。これは基本的に 「1行3列」マトリクスである。
M2Move move( 10, 20 ); //移動マトリクス「3行3列」を用意 したのと同じこと。
M2Rotate rotate( Rad( 30 ) ); //回転マトリクス「3行3列」を用意 したのと同じこと。
p = p.Mul( move ).Mul( ratate ); //行列クラスが行うかけ算
x = p.GetX();
y = p.GetY();
概略は、変換専用マトリクスを変換クラスで用意し、以降はマトリクス クラ スの積算を使用しているにすぎない。
7)式で書くと…。
8)ベクトルも同様な考えである。(説明は無い)
9)つまり、ベクトルも座標変換もクラス内に加減乗除のコーディングは成され ていない。しかし、両者の性質がマトリクスを通して見ると同一だと言う観念に 従えば、自然に上記のような継承図になる。
以上マトリクスを例として揚げたが、随所に於いてこのような場面に陥った時 に「自身を持って設計できる」と言う技術力は必要である。
最後に
不思議なことながら(当然かもしれないが)、初めてコンピュータを覚える人 に最初からオブジェクト指向法で設計を指導すると全く抵抗感が無く入っていけ るようである。
戻る