前置き
オブジェクト指向
という言葉を正確に理解するために、『コーディングを支える技術 成り立ちから学ぶプログラミング 作法』(第11章 オブジェクトとクラス)が、かなり役立ったと思ったので、memoとして残します。
僕同様、オブジェクト指向の言葉で迷った人は、一度目を通されてみると、視点が増えて整理にいいかもです🙋♂️
オブジェクト指向とは何か
- 言語によって、「オブジェクト指向」の言葉の意味が違う
C++ (Bjarne Stroustrup)
-
型や継承にとても肯定的
- 「classはユーザ定義型を作るための仕組み」
- 「Stimulaの継承機構が問題解決の鍵」
- 「オブジェクト指向プログラミング とは、ユーザ定義型と継承を使ったプログラミング のこと」
Smaltalk (Alan Kay)
- 型や継承に否定的な立場 (メッセージに着目)
- 「型に反対なわけではないが、苦痛でない型システムを見たことがない」
- 「Simulaの継承のやり方は好きではない」
- 「オブジェクト指向とは『状態を持ったオブジェクトがメッセージを送り合うことでコミュニケーションする』というモデルでプログラムを表現すること」
オブジェクトは現実世界の模型
-
現実世界の「モノ」(object)の「模型」(model)をコンピュータの中に作るにはどうすればいいか?
- その結果生まれたのが、「オブジェクト指向」という概念
- Cf. ALGOL60の設計者のHoareの講演内容 1996
クラスとは
- C++ (静的型付け言語)
- 「クラスはユーザが定義できる型」のこと
- Java
- 「クラスという部品を定義して、それを組み立てることがプログラミング だ」という設計の言語
変数と関数を束ねて模型を作る方法
- プログラマの目的は、「まとめて模型を作りたい」
方法1: モジュール、パッケージ
- 関連性の強いものを「いくつかのまとまり」に分けたほうが理解が楽である。
- 理解が楽なようにプログラムを設計すると、いくつかの「お互いに結びつきの強いグループ」ができる傾向がある。
- モジュールとは、「まとめる方法」
方法2: 関数もハッシュに入れる
-
ファーストクラスの値
- 「変数に代入する」「関数の引数として渡す」「関数の戻り値として返す」などが可能である値のこと。
- JavaScriptでは、関数もファーストクラスの値である。
- 「変数に代入する」「関数の引数として渡す」「関数の戻り値として返す」などが可能である値のこと。
方法3: クロージャ
- オブジェクト的なものを作るためのテクニック
- 関数を関数の中で定義でき、ネストできる静的スコープがあり、関数を戻り値で返したり変数に代入したりできる言語では、単に関数をネストするだけで状態を持った関数を作ることができる
方法4: クラス
Hoareの考えたクラス
- Hoareにとってクラスは分類
- 「現実世界のモノ(objects)は、しばしば便宜上、いくつかの相互排除的な種類(classes)に分類される」
C++のクラス
-
クラスはタイプ(型)である
- ユーザが型(type)を定義するために作られた
-
クラス(=型)は仕様の表明でもある
- クラスは「オブジェクトがどういうメソッドを持っていて、どういうメソッドを持っていないか」という仕様を宣言する役割を持っていた。
Smalltalkのメソッド呼び出し
- 「こういう名前のメソッドを実行してくれ」というメッセージをオブジェクトに送るこ
- そのメッセージを受け取ったオブジェクトがどう振る舞うのかは、受けてオブジェクトが自由に決めることができる
(補)クラスとは結局何であるか
- クラスとは、たかだか数十年前に、誰かが「こういう仕組みがあると便利じゃないかな?」と作ってみたものに過ぎない
- 「そうかけたほうが楽だから」という理由で作られた約束事に過ぎない
クラスが持つ3つの役割
-
まとまったものを作る生成器 (
鯛焼きの型
) -
どういう操作が可能かという仕様 (
Javaのインターフェース
)- 動的型付け言語では重視されない
- コードを再利用する単位 (
継承
)
感想
言語によって、オブジェクト指向が指しているものが違うという考えは、今までオブジェクト指向の言葉の理解を邪魔していたものを取り払ってくれたように感じる。
特に、C++では、クラスとは型であるという考えが新鮮だった。
Rubyでは、Smalltalkの影響を受けているため、Alan Kayの メッセージに着目する
考え方が大事であると理解。
この章を読むことで、オブジェクト指向への自分のモヤが結構スッキリした気がする。🙋♂️