bbz

oop

_
previous | next | edit
1: 2004/07/19
オブジェクト指向。

オブジェクトを作った。まだ存在していない。名前を「物」としよう。「物」は存在していない。

我輩は猫であるみたいだな。



「おや?君は今『物』を作ったといったではないか?それなのに存在しないとは如何に?」



それなら、こう言い換えよう。私は「物」という「概念」を作った。「物」は概念として存在するが、

現実に存在していない。これを「実存」していない、と名づけよう。



実存と存在のどちらが先にあったのか、これは議論の対象になる問題である。

哲学のいわゆる「実存主義」では、実存が存在(本質)に先立つと主張する。



「人間」という概念があって、それを具体化した「ジャンポールサルトル」という「ひとりの人間」が実存したのではなく、

ジャンポールサルトル、エドムンドフッサール、セーレンキェルケゴール、イマヌエルカント・・・などのさまざまな実存を抽象化して、「人間」という概念を作ったのである、というのが実存主義だ。



人間の属性(property)には、以下のようなものがある。

・生きている。{ IsAlive:Boolean}

・性別{Gender (Male, Female)}

・年齢 {Age:Integer}

・名前{Name:String}

・職業

・物理的空間を占める

・ユニークである

など。



さて、これらの人間の属性のうち、「生きている」、「性別」、「年齢」などは、「動物」も持つ属性である。

さらに、「物理的空間を占める」などという属性は、さらに下位階層の属性である。



「上位じゃないのか?」



プログラミングではオブジェクトを最上位とする。

たとえばDelphiのTFormは、以下のような階層の最下層である。

TObject
TPersistent
TComponent
TControl
TWinControl
TScrollingWinControl
TCustomForm
TForm


めんどくさいから「上位」にしようか。しかし、「上位」イコール「優越」ではないからね。



・・・



目が覚め、布団の中で考えていた。

「オブジェクトを作っても、描画しなくてもよいのではないか」

VirtuaStrikerでは、22人のプレイヤーと審判が存在している。

おそらく、「プレイヤー」というクラスがあって、スタミナ、スピード、国籍、ポジションなどという属性を持っているだろう。

ゲームプレイヤーがコインを入れてStartボタンを押し、国を選択した時に、プレイヤーというクラスが22個、Createされる。

しかしCreateすることと描画することは別のことである。



BASICで原始的なシューティングゲームや物体落下のシミュレーションなどを書く場合は、描画=存在であった。



さて、限りなく現実に近い存在をプログラミングで描こうとすると、非常に複雑な処理が必要であることが想像できる。

しかしその複雑さはほとんど描画に付随するものである。ひとつの直方体を存在させることは容易なことだ。

タテ、ヨコ、タカサ、表面の色程度の属性しかない。それを描画することは、オブジェクトではなく、観察者の仕事である。



3Dの描画を行うには、オブジェクトの定義と、観察者の位置-オブジェクトとの相対的な位置-と、光源が必要である。

動きを伴うならば、オブジェクトが地面においてあるのか、宙に浮いているのか、重力定数や質量も定義する。

落ちたときに壊れたり弾んだりするにはオブジェクトの材質の定義も必要になる。



・・・



こんなプログラムはどうだろう。

Editボックスとボタンが一つずつある。

ボタンを押すと、Editボックスに入力した名前のオブジェクトが作成されるが、何も描画しない。

ユーザはボタンを押し、オブジェクトがCreateされるだろう。しかし、ユーザは何もしらない。

それではあんまりなので、そのオブジェクトが声を出すようにしてみようか。といっても四六時中しゃべるわけではない。

そうだな・・・おなかが空いたら泣き声をあげるようにしようか。・・・たまごっちみたいだな。



「おなかが空く」という定義は、Createされてから1分たった、ということにする。

ユーザがボタンを押して一分後、「オギャー」という泣き声がする。しかしユーザは何もできない。

その泣き声が自分がCreateしたオブジェクトのものだとは知る由もない。



そして、それからさらに1分たったらオブジェクトが死ぬことにしよう。ユーザが泣き声を聞いて一分後、オブジェクトはFreeされる。そのこともまた、この世の人間の死と同様、誰も知ることがなくひっそりと起こる出来事だ。しかし、オブジェクトは跡形もなく消滅してしまう。人間のように霊界へいくとか地獄へ行くとかいう事がない。



と、ここで気付いた。「1分たったら泣き声をあげる」という動作をさせるには、タイマーが必要である。タイマーコンポーネントは非ビジュアルである。それをフォームに貼り付ける。フォームは空間を意味する。時間と空間は、ユーザとオブジェクトのための存在の枠組みである。タイマーコンポーネントはFormなしには使えないだろうな・・・でも、時間の経過を測る非ビジュアルのオブジェクトは作れそうだ。まてよ、オブジェクトの生存時間をオブジェクト(クラス)のプロパティとし定義できたとして、その経過時間の更新はどうやっておこなうのか。



生存時間はオブジェクトの属性ではない・・・。考えてみればもっともである。年齢は、存在してからの経過時間であるから、存在する場との関係なしにはありえないものだ。

・・・

type
TMyObject=class
Name: String;
private
public
constructor Create;
end;

まるっきり新しく、Nameというプロパティと、Createというコンストラクタ以外に何も定義のないオブジェクトを定義した。

そして、コンストラクタの内容。



var

Form1: TForm1;

AnObject:TObject;

AMyObject:TMyObject;



implementation



{$R *.DFM}



constructor TMyObject.Create;

begin

Name:='baby';

end;





このオブジェクト(クラス)は、TMyObjectという名前だ。Tを先頭につけたのはDelphiの慣例に従った。

このオブジェクトはIntegerとかStringのように、変数の種類として使用される。

実際にこのクラスを実存させる。



procedure TForm1.Button1Click(Sender: TObject);

begin

AMyObject:=TMyObject.Create;

AMyObject.Free;

end;



プログラムが使用するのは、AMyObjectである。 "a my"って、おかしいけど。



ここで、「英語は冠詞だ」を思い出した。

"an apple"であって、"apple"ではない。

appleというのは概念で、"an apple"となって初めて実存となり、それを指すことができる。



・・・



さて、これで一応オブジェクトを作成することができた。しかし、これではまだオブジェクト化のメリットがわからない。

ボタンを押すとオブジェクトが作成され、すぐ破棄される。ボタンを何度押しても、同じ名前のオブジェクトが一つだけ、作成されたり廃棄されたりするのが繰り返されるだけだ。



では、たとえばボールのクラスを作ったとして、ボタンを押すたびにボールが一つずつ作成されていくプログラムは、どうやって書けばよいだろうか?



上記のプログラムを拡張しようとすると、

AMyObject:TMyObject;

という変数を複数定義するとか、配列にするとかいうことが考えられるが、オブジェクトがいくつ作成されるかは不明で、1個だけかも知れないし、1万個かもしれない。とりあえず1万個定義しておいて、それを上限とするように制限することも可能かもしれない。



便利な方法がある。この方法はDelphi2.0のObjectPascal言語リファレンス151ページに書いてあったものである。

function CreateControl (ControlClass : TControlClass;
const ControlName: string; X, Y, W, H: Integer) : TControl;

begin

Result := ControlClass.Create(MainFom);

With Result do
begin
parent := MainForm;
Name : = ControlName;
setBounds(X, Y, W, H);
Visible := True;
end;
end;

この関数によって、フォーム上に任意のコントロールが作成できる。
たとえば

CreateControl(TEdit, 'Edit1', 10, 10, 100, 20);

という風に。
わたしはとても感動して、このやり方でDFSSpのラベルの作成・廃棄をおこなった。

DFSSpはPCの全HDDの空き領域を表示するだけの簡単なプログラムであるが、

存在するドライブの数だけラベルを作成・表示し、フォームの大きさをそれらのラベルがおさまる最小の大きさにして描画するのである。





書籍やWebでソースを見ると、クラスの使用法は変数として定義してCreateする、というのがほとんどである。

それしか知らない人は、多分「OOPなんて知らなくてもプログラムは書けるよ」と言って徹夜を繰り返しているに違いない。
^
previous | next | edit