情報システム学会 メールマガジン 2013.6.25 No.08-03 [11]

連載 オブジェクト指向と哲学
第30回 鶏と卵 - 自己増殖モデルを考える

河合 昭男

 前回までメディアをテーマに「『形相』と『質料』」および「『可能態』と『実現態』」という視点で考えてきました。
 アリストテレスなら本質はそれぞれのメディアの中に埋め込まれていて一体化しておりそれだけ取り出すことはできないと考え、プラトンなら本質は別のところにひとつ存在するだけですべてのものは光で照射されたその影にすぎないと考えます。

 オブジェクト指向により世界の森羅万象をどこまでモデリングできるのかその限界を考えています。人工物はオブジェクト指向によりかなりモデリングできそうですが、自然や生き物にはあまり適用できません。人間の自由意志や行動のようなものもうまく扱えません。
 今回は生物の自己増殖という問題を、鶏と卵を題材にしてオブジェクト指向モデルとして考えてみたいと思います。

第1のモデル
 鶏と卵を別クラスとします。鶏クラスには卵を生むという操作を定義します。その操作の実装で卵クラスから卵オブジェクトを生成します。
 ここまではよいのですが、卵オブジェクトはやがて雛にかえり、ひよこから親鳥へと成長できなければなりませんが、あるオブジェクトは別のクラスのオブジェクトには変れません。ひよこが成長しても鶏にはなれず、このモデルは使えません。

第2のモデル
 卵、ひよこおよび親鳥は鶏オブジェクトの状態と考えます。クラスは鶏のみとし、卵、ひよこおよび親鳥は別クラスとせず状態と考えます。卵からスタートします。

図1 鶏オブジェクトの状態変化(第2モデル:ステートマシン図)

図1 鶏オブジェクトの状態変化(第2モデル:ステートマシン図)

 この状態を変化させるトリガーとして鶏クラスに体内時計を持たせます。鶏オブジェクトが卵の状態で生成されたときから体内時計が動き始め、一定時間で卵状態からひよこ状態、親鳥状態に変化し寿命がきたら生命を持ったオブジェクトは消滅するとします。
 クラス図で表すなら鶏クラスと状態クラスを別にし、卵、ひよこおよび親鳥は状態のサブクラスとします。

図2 鶏に状態を持たせる(第2モデル:クラス図)

図2 鶏に状態を持たせる(第2モデル:クラス図)

図2のクラス図で図1の状態を表すと図3のようになります。

図3 状態とオブジェクト図の関係(第2モデル:オブジェクト図)

図3 状態とオブジェクト図の関係(第2モデル:オブジェクト図)

第3のモデル
 雌鳥の親鳥に卵を産むという操作を追加します。この操作は体内時計でキックされるとします。

図4 雌鳥に卵を産む操作を追加する(第3モデル:クラス図)

図4 雌鳥に卵を産む操作を追加する(第3モデル:クラス図)

 「卵を産む」という操作は鶏型のオブジェクトを生成します。オブジェクトの初期状態は卵とします。Javaのプログラム風に書くと次のようになります。

(第3モデル:プログラム)
--
class 雌鳥 {

鶏 子;
体内時計() {
一定時間で状態を変える
一定時間で「卵を産む」をキックする
}
卵を産む(){
子 = new 鶏();
}

}
--
図3のモデルで卵を産んだ状態をオブジェクト図で表すと図4のようになります。

図5 卵を産んだ状態のオブジェクト図(第3モデル:オブジェクト図)

図5 卵を産んだ状態のオブジェクト図(第3モデル:オブジェクト図)

第4のモデル
 雄鶏と雌鳥の交配はどうすればよいでしょう。これまで当連載でテーマとしてきた古典的な流出説が使えそうです。体内時計がある時間になると雌鳥はフェロモンを放出し、雄鶏のセンサーがそれを捕らえる。

図6 フェロモンとセンサーを追加する(第4モデル:クラス図)

図6 フェロモンとセンサーを追加する(第4モデル:クラス図)

 ここまで何とかモデルが出来ましたが、これらのモデルは当然ながら鶏クラスの存在が前提です。本連載第3回「アリストテレス − 形相と質料」で引用した「ソフィーの世界」の手紙を再掲します。
--
ソフィーは封筒から紙切れを取り出した。そこにはこう書いてあった。
鶏と「鶏」というイデアと、どっちが先か?
--
上記のモデルなら「鶏」のイデアが先に存在しなければなりません。・・・以下次回。


ODL ObjectDesignLaboratory,Inc. Akio Kawai