Weitere ähnliche Inhalte Ähnlich wie オブジェクト指向とは何ですか? (7) Kürzlich hochgeladen (11) オブジェクト指向とは何ですか?14. ビアルネ・ストラウストラップらのOOP
「What is “Object-Oriented Programming”?」 [1987, 1991改訂]
→ what-is stroustrup で検索!
抽象データ型およびその部分型の定義に「クラス」とその継承機構
を使うアイデア(ただし前後して複数のグループが独自に発案)
※「抽象データ型」は「ユーザー定義型」と読み替えて良い
具象データ型(int, float, string等、言語組み込みの型)に対する
「抽象」の、つまりユーザー定義のデータ型ということ
• カプセル化 = 抽象データ型の特徴
• 継承 = クラスの特徴
• ポリモーフィズム = 継承を使った部分型定義
キモ: 多くを早期に決定し、確実・安全を目指す
(差分プログラミング)
(抽象データ型のスーパーセット)
15. アラン・ケイのOOP
「Is “Software Engineering” an Oxymoron?」 [2002]が比較的よい
→ oxymoron kay で検索!
「オブジェクト」と“メッセージ”を使ってインターネットを模倣したプロ
グラミングを実践するアイデア(厳密にはSimula 67以前から着想)
• オブジェクト = 小さなコンピューター
• メッセージ = 高速なLAN接続を介して伝えられる情報
コンピューターを「データ型」や「手続き」「関数」といった、無機的な
部品に分解してしまうのではなく、「コンピューター」のまま活用
コンピューター(つまりオブジェクト)を組み合わせてより高度な機能
を持つコンピューター(同オブジェクト)を再帰的に作る
キモ: 極力、決定を遅延し、予測不能な変化にも対応可能に
16. Smalltalkの系譜
• Smalltalk-72 … タートル描画が使えるスクリプト言語
• Smalltalk-74 … -74+高速描画ルーチン(BitBLT)→GUI
• Smalltalk-76 … -72とは別物。“省コスト版”メッセージング発明
• Smalltalk-78 … 8086でも動かせるコンパクト版-76
• Smalltalk-80 … 実験色を排除し商用言語処理系(IDE)へ
Smalltalk-72 Smalltalk-74 Smalltalk-76 Smalltalk-80
Reenskaug, Jobs, ..
Beck, Cunningham,
Armstrong, D.Thomas...
3 に + 4 を送ると 7 を返す!
MVC!
17. ・クラスはJavaScriptのような関数(if式のネスト) → メソッドはパターン記述の一
・継承はない → 無いとつらいと気がついて-76ではSimulaタイプのクラス導入へ
条件 ⇒(非false時の処理) false時の処理,条件分岐式 … ? キーで入力
∢(アイボール),パターンマッチ … 同、%
☺(スマイリー),タートル(クラス turtle のインスタンス) … 同、@
☞(指さし矢印)+文字列,シンボルリテラル表現(主に変数) … 同、"
:(コロン),解釈中メッセージ内の次のオブジェクトの読み込み
・メッセージはメソッド呼び出しではなくトークン列 → ただし非同期ではない
Smalltalk-72
20. 「決定の遅延」をどこまでサポートするか? vs Ruby
例1: オープンクラス
Rubyも同様の機能を有するが、
Smalltalkでは、インタラクティブ、インクリメンタルな開発スタイルの
ためにより積極的に活用。
クラス定義 → メソッドを追加
LISP処理系に似た、エラーからの復旧の機構も。
実行中に中断 → メソッド等を追加して続行
22. 「決定の遅延」をどこまでサポートするか? vs Ruby
例2: インスタンス変数の追加
RubyはHashライク(インスタンスベース)な機構なので不要。
"Smalltalk"
Object subclass: #C
instanceVariableNames: 'foo bar ' ...
TEMP ← C new.
Object subclass: #C
instanceVariableNames: 'foo bar baz ' ...
TEMP inspect
23. 「決定の遅延」をどこまでサポートするか? vs Ruby
例3: スーパークラスのすげ替え
Rubyでは不可。
#Ruby
class B1; end
class B2; end
class C < B1; end
class C < B2; end #TypeError (superclass mismatch for class C)
"Smalltalk"
Object subclass: #B1...
Object subclass: #B2...
B1 subclass: #C...
B2 subclass: #C...
C superclass "=> B2 "
24. 「決定の遅延」をどこまでサポートするか? vs Ruby
例4: オブジェクトのすり替え(become:)
Rubyではstring限定、かつ、置き換えのみ。
#Ruby
str1 = "string1"
str2 = str3 = "string2"
str2.replace(str1)
p str3 #=> "string1"
"Smalltalk"
| string float |
string := 'string'.
float := 1.0.
string become: float.
{string. float} "=> (1.0 'string' ) "
25. 「決定の遅延」をどこまでサポートするか? vs Ruby
例5: 永続化
そもそも、決定を遅延するためには、オブジェクトが永続的に存在し
ないと効果が薄い。
Smalltalkではすべてのオブジェクトが永続化を前提としている。
スナップショット(save) → 「仮想イメージ」
文字通り“時空”を超えてオブジェクトを永続させられる。
• プラットフォームとしてのアルトが死んでもSmalltalkは生き残った
• マシンを変えて開発・運用を続行可能
26. 「決定の遅延」をどこまでサポートするか? vs Ruby
例6: 文法の拡張
Rubyで試験導入されたパイプライン演算子(|>)もどきを追加。
#Ruby
(1 .. 10).select{ |x| x % 2 == 1 }.collect{ |x| x * 3 } #=> [3, 9, 15, 21, 27]
1 .. 10 |> select{ |x} x % 2 == 1 } |> collect{ |x| x * 3 } #=> [3, 9, 15, 21, 27]
"Smalltalk"
((1 to: 10) select: [:x | x ¥¥ 2 = 1]) collect: [:x | x * 3]
3 + 4 + 5 "=> 12 "
3 + 4; + 5 "=> 8 " ← カスケード糖衣構文 ←
1 to: 10; select: [:x | x ¥¥ 2 = 1]; collect: [:x | x * 3] "=> ? "
もう少しまじめにてんてん
1 to: 10 :> select: [:x | x ¥¥ 2 = 1] :> collect: [:x | x * 3] "=> ? "
| temp |
temp := 3.
temp + 4.
temp + 5.
これを流用