Object 指向プログラミング

Menu Menu


Simula 67

離散イベントシミュレーター

   Lion   個々のLion, 位置、状態
   並列にオブジェクトは動く
   オブジェクト = 自然の中にいる動物とか


Smalltalk 80

Xerox Parc

   Ethernet, Mouse, Bitmap display, Multi Window, Workstion, Dynabook, Unicode
   Mesa, Smalltalk, Interlisp D
   Wyswig ( What you see is what you get )

1984 年から

    Alan Kay

byte code machine
   inline compiler


MVC

   Model/View/Controller
       (-> Rails )


Squeak

Smalltalk 80 の dead copy 。Opoen License。

   Morph   ( MVC の replace )

http://www.squeak.org/


Squeakの技術

byte code machine
    x inline compiler

bitblit ( bitmap display の基本操作)

Image File

    Snapshot


Browser, Inpecter


Objective C

Squeak / Smalltalk の構文を、そまま持ってきている


Object 指向言語の特徴

self があるかどうか。

   C++  this
   Java this


C++

C の構造体をオブジェクトとみなす。


Java

VM とかは Smalltalk から。構文は C++ から取っている。


型とオブジェクトID

Smalltalk は、すべてオブジェクト

   数字もオブジェクト
   オブジェクトには id がある
   対応するオブジェクトを書き換えられる   become
   全部オブジェクトだから、型はない

C++ は、オブジェクトはメモリ上の構造体

   メソッドは、構造体の中に入っている関数 ( virutal )
    オブジェクトは構造体に対応する型を持つ
        => Template でコンパイル時に型を整合させる
    オブジェクトはアドレスで識別

Java は、オブジェクトはメモリ上の構造体

   メソッドはすべて virtual
    すべてのオブジェクトは型を持つ

  配列の中のオブジェクトは、型の情報を持ってない

        => generic でコンパイル時に型を整合させる
    オブジェクトはアドレスで識別


関数型言語とオブジェクト指向言語

オブジェクト指向言語はだいたい副作用を持つ

  関数と、関数が定義された環境

        a := 3
        return fun x => a + x
    Closure  = 関数 + 環境
    Closure はだいたい Object と一緒
    self は自分で用意する


オブジェクトとデーターベス

    オブジェクトは、データベースの一つのレコード
    オブジェクトは、一般的にはキーをもたない
    オブジェクトどうしは、リンクで結ばれる
   
    サブクラスがあるので、レコードの型が一つとは限らない


オブジェクト指向プログラミング


利点

    データやレコード、メソッドのグルーピングを提供する

  self を持つ モジュール / パッケージ

    Wysiwig のような実際にあるものとの対応
    デザインパターンが用意されている
        abstract factory
        state pattern 
        command pattern


欠点

    クラスとかモジュールは、一意に定まらない

  色んな設計があり得る

    何をクラス/オブジェクトにして良いかわからない

  オブジェクト間の依存関係が複雑に密になる

         => 継承
    デザインパターンを使うと、プログラムがわからりづらくなる


対処

    クラスやオブジェクトの依存関係をなるべく小さくする
    デザインパターンを目標にプログラミングしない
       => ここにはデザインパターンが有効だと見えたら使う

一般的な注意 / アンチパターン

プログラミング作法とか、達人プログラマー、コードコンプリートとかにあるが....

    大域変数を避ける
    Singleton pattern を避ける
    インスタンス変数での結びつきを小さくする
       メソッド間での引数渡しにインスタンス変数を使わない
    オブジェクトの状態を少なくする
        引数は状態に入らない
    破壊代入しない
    インスタンスの再利用を避ける
    継承を多用しない

 


Shinji KONO / Tue Jul 17 14:18:17 2012