2008年12月22日月曜日

【PAIP】13 Object-Oriented Programming


  • プログラミングの黎明期はまず命令型プログラミング・スタイルだったよ。アセンブラとか。
  • そこで、大域状態というのが厄介でありプログラムがどんどん複雑になる、ということにプログラマは気づいていった。
  • そのうち、サブルーチンという考え方がでてきたよ。それらはアルゴリズミックとか手続き型プログラミング・スタイルと呼ばれたよ。FORTRANとかCとかLisp(setfを使う場合)とか。
  • サブルーチンは、問題を小さな問題に分解する手法であり、プログラムの複雑さを低減させたよ。しかし、大域状態に依存していたので、問題分解という意味では完全ではなかったよ。
  • そこで、受け取ったものだけに依存して、同じ入力に関しては同じ出力を常に返すという関数プログラミング・スタイルがでてきたよ。FPとかLisp (setfを使わない場合)とか。
  • こういう風に、プログラミング・スタイルは大域状態への非依存に向ってかわってきた。
  • しかし、ある種の問題を解くには、大域状態というものに依存した方が自然な場合もあるよ。
  • オブジェクト指向プログラミングというのは、大域状態に対する違った処方箋なのだよ。
  • 大域状態というのを細切れに小さくしつつ、管理可能にする方法なんだよ。

  • なるほど。

  • (ついでに) 宣言的言語というのは、ELIZAやSTUDENTのように、"what to do"を表現するものだよ("how to do"ではなく)。これらはルールベースプログラミングと呼ぶよ。
  • 宣言的プログラミングの一種が論理プログラミングだよ。Prologとか。

  • 13.1 Object-Oriented Programming
  • "Object-orientation = Objects + Classes + Inheritance" (Peter Wegner 1987)

  • 13.2 Objects
  • メモリ上にあるデータは全部Objectと言えばObject。整数の3もObject。
  • しかしObject指向というときのObjectは、もう少し大きいデータを想定していることが多いよ。
  • クロージャをつかうことによって、メソッド経由以外では状態にアクセスできないようにする、こうやってObjectというものを実現できる。

  • 13.3 Generic Functions
  • Generic Functionの実装って、なんというか、空洞化したSIベンダみたいなもんだな。

  • 13.4 Classes
  • define-classなどを実装。特になし。

  • 13.5 Delegation
  • 13.4の実装にてメソッド処理の移譲をやってみる。継承の概念の準備かな。

  • 13.6 Inheritance
  • ああ、ここのマトリックスは重要。昔、自分でOOについて考えたときも、このマトリックスを使って理解した。
  • 横軸がデータ型(classes)で、縦軸が関数(messages)のときに、
  • 縦(column)単位でまとめるのがOOのやり方よ。
  • 横(row)単位でまとめるのが古典的手続き型のやり方よ。
  • 升目ひとつずつバラで取り扱うのがデータ駆動型またはジェネリック型のやり方よ。
  • これ、自分で考えたときは誰だからの論文がベースなんだけど、縦軸指向がOOで、横軸指向がADTであると。ADTは抽象データ型で、MLとか関数型言語の重要な部分。で、どっちがいいかは扱う問題次第だね、ということ。

ふーむ。とりあえずここまで。
次回は、CLOS:The Common Lisp Object System から。
ぼちぼち。

0 件のコメント: