「オブジェクト指向プログラミング」の版間の差分

削除された内容 追加された内容
編集の要約なし
13行目:
プログラミングパラダイムとしてのオブジェクト指向の確立は紆余曲折を経ており(後述)その詳細の解釈も様々であるが、一定の枠組みとなる三つの原則(''fundamental principle'')が存在し、それに従った言語仕様を総体的または部分的に備えたプログラミング言語がオブジェクト指向準拠と判別される。1~3はオブジェクト指向プログラミングの三原則とされるものであり[[C++]]を契機にして提唱された。
 
また、4~6は[[Smalltalk]]が提唱する元祖オブジェクト指向の骨子(''essential ingredient'')とされるが現在、ほとんど一般的では亜流とって。元祖オブジェクト指向の方では継承と多態性は重視さ蚊帳の外に置かておらず、代わりに前者を包括するメッセージパッシングと、後者の置き換えとなる遅延バインディングが重視されている。ローカル保持はカプセル化と似た様なパラダイムである。
 
#[[カプセル化]](''encapsulation'')
51行目:
 
=== メッセージパッシング ===
これは式指向(''expression-oriented'')プログラミングまたは関数型プログラミングで用いられていた[[高階関数]]の仕組みを[[参照透過性]]とは異なる観点から独自に拡張させたパラダイムであり、この視点の下では変換式に独自の記憶を持たせたものがオブジェクトとなった。オブジェクトは[[第一級関数]]と同様にパラメータ値(引数)としてもリターン値としても使用可能である事がメッセージパッシングを表現する上での必須条件である。オブジェクトにメッセージを送るという行為は仕組み的には関数呼び出しと同義と考えてよい。これがスタックエリアなどを通した呼び出し形態ではなく、バイトデータ列の受け渡しで行なわれる場合は[[Object Request Broker|オブジェクト間通信]]に近いものとなった。メッセージの実体はパラメータ値またはセレクタ付きパラメータ値のどちらかであり、いずれもオブジェクトである。オブジェクトの代表関数と言えるレシーバーに対して、メッセージとして送られる引数オブジェクトは原則として一つであり、これは[[ラムダ計算]]の性質を踏襲している。レシーバーがメッセージを受け取る事で始めて一定のプロセスが開始され、リターン値としてのオブジェクトが返される。そのリターン値をメッセージとして他のオブジェクトに送り、更に得られたリターン値に他のメッセージを送るといったメッセージパッシングの連鎖と再帰により構成されるオブジェクト式が一つのプロセスを表現し、または結果値としてのデータを表現する。これがオブジェクトのコミュニケーションと呼ばれるものである。真偽値や数値やコードブロック([[クロージャ]])も当然オブジェクトなので、真偽値または数値に対して規定のセレクタを付けたコードブロックをメッセージとして送る事で、条件分岐や反復処理といった制御フローもオブジェクトのコミュニケーションで表現可能だった。オブジェクトがメッセージを受け取った時に始めて一定のプロセスないし一つのデータが発生するという原則がメッセージパッシングの本来のスタイルである。
 
しかし、このパラダイムは様々な理由から広くは認知されず、やがてその言葉だけが一人歩きするようになって本来の定義からシフトし、前述のオブジェクトの代表関数が一元的にメッセージを受け取るというレシーバーの仕組み自体がメッセージパッシングと見なされるようにもなった。レシーバーに類似した形態の[[Object Request Broker|オブジェクト間通信]]におけるバイトデータ列の送受信もメッセージパッシングの代表例となった。また、オブジェクトの単純なメソッドコール自体もメッセージパッシングであるとする見解も出たが、これは物議を醸している。この様にメッセージパッシングの本質は見失われながらも、その側面的仕様は数々のOOP言語に導入されてもいる。