[雑談]オブジェクト指向はなぜ難しいのか
オブジェクト指向型言語ではコンストラクタを理解するのが難しいという話を聞きました。
オブジェクト指向は対象の要素をオブジェクトとしてモデル化し、オブジェクト間でのメッセージのやり取りによってシステムを表現するという高い抽象度での説明があり、かたや実装面ではコンストラクタやカプセル化、継承やポリモーフィズムといったオブジェクトモデルとのつながりが自明とはとても思えないものが基本的な要素として取り上げられているからではないか、そんなことを考えています。
プログラミング言語は特定の問題領域において問題解決を容易にするためのツールとして用意されているものです。
割と広範な問題領域においてプログラムを容易に書くための考え方としてオブジェクト指向があり、さらにオブジェクト指向を補強するものとしてカプセル化や継承、ポリモーフィズムがあるというように考えるほうが実態に近いのではないかと思うわけです。
それをオブジェクト指向の3要素などと称して、カプセル化、継承、ポリモーフィズムがオブジェクト指向に必須の基盤のように言うのが混乱のもとになっているのではないか、そんなことを感じています。
それとは別にコンストラクタがあります。
多くのプログラムはコンピュータの主記憶上にデータを一時的に記憶して、そのデータをもとに計算を行っていきます。
ところがプログラムが使おうとしている主記憶領域はほかのプログラムで直前まで使われていたかもしれませんし、プログラム自身の別の処理が使っていたかもしれません。
そのため、プログラムがオブジェクトとして使うために確保した主記憶領域にどのような値が書かれているかを推測することも、何らかの前提を置くこともできません。
プログラムがオブジェクトとして主記憶領域を確保した後に何らかの確定的な値を確保した主記憶領域に記憶させて、確定的な初期状態を作る必要があります。
この役目を担うのがコンストラクタだと私は認識しています。
多くのプログラミング言語においてコンストラクタ呼び出しでオブジェクトが生成されるような説明がされますが、実態としてはオブジェクトに必要な主記憶領域を確保するプロセスとコンストラクタによって確保した主記憶領域を確定的な状態に設定するプロセスの2段階のプロセスで構成されているということです。
コンストラクタの理解が難しいのはオブジェクトという抽象的な考え方と主記憶領域といったベタな実装とが交わる海面だからではないか、とこれも考えています。
こんなことを考えるとプログラミング言語を教える、学ぶというのは本当に難しいなとそんなことを思っています。
おまけ
オブジェクト指向を説明するのにふと食堂モデルというのがいいのかなと、そんなことを思いつきました。
ファミリーレストランでも何でもいいのですが、食堂に入るとまず、フロア係に注文を聞かれます。これがプログラム的には外界からの入力を受け付けるオブジェクトとしてモデル化され、客からの注文というメソッドが呼び出されます。
フロア係が受けた注文は調理場に注文として伝達されます。調理場というオブジェクトに対するメソッド呼び出しに当たる行為です。フロア係オブジェクトは客からの注文メソッドの処理としてテーブル番号と注文内容を組みにして調理場の調理メソッドを呼び出します。
調理場では注文内容に応じて調理を行い、料理が出来上がったところで出来上がった料理と注文を受けたテーブル番号を組みにしてフロア係のは依然メソッドを呼び出します。
フロア係はは依然メソッドの処理として料理を客のテーブルまで運びます。
フロア係は調理がどのように行われるかを知らなくても注文を伝える、料理を運ぶといった機能だけを知っていれば仕事は回りますし、調理場はテーブルがどこであろうと指定された料理を作るだけで、テーブル番号との関連付けさえ守っていれば仕事は回ります。
このように役割を分離して役割ごとに受け取るメッセージを決め、メッセージに応じた振る舞いを作っていくのがオブジェクト指向プログラミングと言うとわかりやすいと思います。
そしてここにはカプセル化や継承、ポリモーフィズムは登場してきません。これらはまた別の例で説明すべきなのではないかなと思います。
0コメント