kr_ryo 徒然日誌 <2003年5月11日分>

三國志製作記20〜オブジェクト思考?〜

先週はゴールデンウィークだったようですが、お出かけと二日(その日?)酔いでほとんど三國志製作ができないままあっと言う間にすぎさってしまいました(^^;で、久しぶりに三國志製作にかかろうと、いよいよプログラムを書きはじめようとしたんですが…むむむ、難しい?というか、なんだっけ?と、すっかり忘れてしまっています(--;)

色々この日誌でも書いていますが、今回の三國志製作はDelphiという開発ツールを使うことにしています。このDelphiはオブジェクトPascalという言語によるプログラム製作ツールです。オブジェクトPascalというように、いわゆるオブジェクト指向言語なんですが、このオブジェクト指向、うむ、やっぱりよくわからない( °〜 °)

以前私もオブジェクト指向について書いたことがありますが、その後色々オブジェクト指向について書かれたものを読んでいくうちに、オブジェクト=物とかいう説明とかがあったりして余計にわけがわからなくなってたりするんですよね。物?プログラムが?なんでやねん(?_?)いったいオブジェクト指向とはどういう思考なんじゃ?

しかし、このオブジェクト指向というものがよくわからないとDelphiでちゃんとしたプログラムが書けなかったりします。これまでの私のプログラムの書き方経験では、BASICやHSPから入ったせいか、プログラムとは、1行目からずらずらずらずらずら…と処理すべき内容を書いていくという感じのものです。書いた内容は基本的にすべて実行されます。というか、実行する内容を、実行する順番に並べて書いていきます。これが私のプログラムに対してもっているイメージです。まさにProgramですね。手順指向プログラムとでも呼びましょうか。

ところがDelphi(が採用しているPascalという言語。Delphi7からDelphi言語ということにしたらしい。ので、これからDelphiと呼びます)では、プログラム(これ自体も先程の1行目からずらずら…と書く方式のことを指しているようなので、コードとした方がいいんでしょうけども、やっぱりプログラムと呼びます(^^;)構成として、大きく2つに分かれます。宣言部(interface)と実現部(implementation)で、実現部がプログラム中実行する命令が書かれる部分です。では宣言部はなんのためにいるのか?以前Delphiを学習していた際には、なんだかよくわからないけどこっちにも実行する命令集のタイトルを書いておかなければならん部分と理解、というか無理やり納得させてました。久しぶりにDelphiに触れてみると、実行されるわけでもなく、後で中身が出てくるのになんでわざわざタイトルだけ抜き出して書かなきゃならないのか、面倒くさい、と思ってました。目次、と言えないこともないですが、なんのために目次をたててるのか、よくわからない。

こんな時、図書館でいい本を見つけました(^O^)「Delphi7オフィシャルコースウェア」基礎編と応用編です(井上勉著、ASCII刊)。それぞれ2800円&4800円+税で、2冊で全体像がわかるようになっています。この値段と2冊で6pと電話帳並みの厚さ、図書館でなければ手が出ませんな(^^;初歩から文法や考え方などをみっちり教えてくれます。これまで色々体系的でなく勉強してきたので、体系的なこの本を読むとなるほど〜と思えますが、最初からこの本から入っていると、多分挫折してたでしょうね(^^;;;

で、ようやくなんとなくクラスやら宣言部の意味やらがわかるようになってきて、オブジェクト指向がなんとなくわかるようになってきました。

さっきのリンク先の日誌で、オブジェクト指向について理解した部分を書いていたのですが、やや受け売り的で本当に理解していたと痛感しました。それとともに、以前理解したつもりであったのに、やはり自分が抜き難く手順指向プログラムにはまっていることに気がつきました。

つまり今回私が改めてDelphiでプログラムを書こうとすると、なぜか最初に実行されるものは何も書かれない宣言部があり(動くわけでもないのになんでこんなもん書かなあかんねや!)、次の実現部についても処理内容を順番にずらずら…と書くのではない(どっからスタートするんや?どこに行くんや?)ため、以前同様やっぱりどうしていいのかわからなくなっていたのです。Delphiでは実現部についても、実行される部分は基本的にプロシージャ(procedure、手続)という小さな小プログラムを単位に組み立てていきます。色々サンプルを見てきたのでそうするんだろうなあ、ということはわかります。ところが手順指向思考だと、完結されたプロシージャを見ると、あれ?このプロシージャ終わったら、次のプロシージャにどうやって移るんだ?とか、そもそもどっからスタートするんだ?と不安になります。まさしく実行すべき「手順」を「指向」してますね。

もともと私は、小プログラムともいえるプロシージャを、手順指向や、さらに発展した構造化指向プログラムでいうところのサブルーチンと同じに考えていましたので、サブに対するメインルーチンがある「べき」と思っていました。ところが、基本的にオブジェクト指向ではメインルーチン(基本手順)にあたるものはありません。いやもちろん、1つのプロシージャに延々ずらずらずらずらずら…と実行すべき命令を書いていけば、それはメインルーチンになります。ただし、Delphi、というよりオブジェクト指向ではそういう発想を取らないようです。

手順指向では処理する内容を処理する順番に書いていく発想です。これに対し、オブジェクト指向では、処理する内容をひと固まりとしてとらえ、「オブジェクト=対象」としてその中で完結させます。オブジェクトとして処理する内容は、「画面に城の旗を表示させる」とか、「攻撃した結果の損害の判定」とか、その中では常に一連のものとして処理すべき内容をまとめたものであって、恣意的といえば恣意的です。そのため、順番にオブジェクトを実行させるためのメインルーチンとしてのオブジェクトを作っても成立します。ところがオブジェクト指向寄りの思考だとそのメインルーチンの必要性を感じなくなるんですよね(^^;ユーザの操作によってオブジェクトが動いていくとして、それが順番に自動的になっていきます。

もちろん、ここまでは構造化指向プログラムでも同じで、オブジェクト指向というためにはカプセル化(独立性)や継承や多義性という3原則を備えていかねばならないようです。厳密に違いを切り分けるほど理解はしていませんがm(__)mDelphiでは、プロシージャ内の変数はプロシージャ内でしか有効でないという性質をもち、手順指向型のように同じ変数はメインルーチンでもどのサブルーチンでも同じように有効というわけではなく、カプセル化が可能になっています。もちろん、同じ変数をよそでも使いたいということはありうるわけで、そのためにスコープ(有効範囲)やそのための宣言部があったんですね。宣言部に変数名やプロシージャなどを書けば、別のプログラム(ユニット)でも利用できるようになる。だから基本は変数も1プロシージャ内で有効という発想で、何でもかんでも外からでも見えて利用できるようにするために宣言部に書くというのは、オブジェクト指向ではなく手順指向思考だったといえます!( °O °)

まあ、やりたいことを一つの装置と考え、その装置に必要な部品をつくり、その部品を動かすための部品をつくり…と考えていく思考が構造化指向やオブジェクト指向なんでしょうねぇ。どうも今まで、やりたいことをやりたい順番に並べるという発想でしたが、それでも順番に書いていくとあまりに全体の見通しが立たないし、繰り返して使う部分が多かったので、部品としてサブルーチン化して後ろの方にもっていったりしていました。こうすると究極的にはほとんどサブルーチンだけになるというのもよくわかります。SWGの時も、メインルーチンは単に画面表示を維持するだけの数行しかなかったりしますし。

ということで、宣言部がなぜあるのか、プロシージャだらけになってスタートから最後までの順番を指示する部分がないのがなぜか、ということがようやく腑に落ちてきました(^ー^)しかし、よく考えると、今までのプログラム作法とかなり違うんですよね( °O °;)考え方や組み立て方を変えて考えていかないといけない。う〜ん、先は長い?(~_~;)

index

〔TopPage〕

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