【本】オブジェクト指向でなぜ作るのかのメモ
本書の目的
オブジェクト指向で作る必要性、メリットを知る
このスクラップの目的
オブジェクト指向で作る必要性、メリットを知る
カプセル化、ポリモーフィズム、継承について知る+それぞれどんな時に使うかを知る
オブジェクト指向プログラミングの3大要素
-
カプセル化
-
ポリモーフィズム
どのクラスのインスタンスが関数を呼び出しているかを意識せずに関数を呼び出せる仕組み
親クラスで定義した抽象関数を具体実装することでポリモーフィズムを使用したことになる。
ポリモーフィズムを使用した例
class Animal {
abstract String cry(); // 具体的な鳴き方を定義しない
}
class Baby extends Animal {
String Cry() {
return "オギャー";
}
}
class Trainer {
void execute(Animal animal) {
System.out.println(animal.cry); // 引数にBabyのインスタンスを入れても良い
}
}
- 継承
似たもの同士のクラスの共通点と相違点を整理する仕組み
全体集合:スーパークラス(親クラス)
部分集合:サブクラス(子クラス)
プログラミングの基本3構造:順次実行、条件分岐、繰り返し
グローバル変数:複数の関数から参照される変数のこと
ローカル変数と引数のメリット:グローバル変数の問題点である、グローバル変数を更新している箇所の特定が難しい問題点が少ない
「変数のスコープを小さくしよう運動・変数に再代入やめようキャンペーン」があるのはデバッグを容易にするためかもしれない
OOPはプログラムの無駄を省き、整理整頓するための仕組み
クラスは関連性の強い関数とグローバル変数を一つにまとめる仕組み
クラスにまとめた関数をメソッドと呼ぶ
グローバル変数をインスタンス変数と呼ぶ
OOPのメリット
1.関係性の高い関数とグローバル変数を一つのクラスにまとめることができる
→行数が減る、メソッドの名前づけが簡単になる(他のクラスに同名のクラスがあっても大丈夫な理由で)、メソッドが探しやすくなる
2.変数を参照する元を絞れる
→クラスとクラスを継承したクラスからのみ参照できるようにする
3.再利用できる
設計の目標
- 重複の排除
変更が入った時の修正漏れを少なくできる - 小さなまとまりで分割する
変更が入った時の影響範囲を小さくできる。コードリーディングが容易になる - 依存関係を循環させない
変更を加えた際に参照元に影響がないことを確認しやすくするため
インスタンスのメリット
- 同種の情報を複数同時に互いに干渉することなく扱うことができる
ローカル変数 | グローバル変数 | インスタンス変数 | |
---|---|---|---|
複数関数からの参照 | × | ○ | ○ |
アクセス可能範囲 | 1つの関数 | どこからでも | 同じクラスのメソッドからのみ |
存在期間の長さ | 関数の処理中 | アプリケーションのライフサイクルと同じ | インスタンスのライフサイクルと同じ |
変数領域の複製 | × | × | ○ |
使用していないインスタンスはガベージコレクタがいい感じにメモリ上から削除してくれる
プログラムの実行方式
1.コンパイラ方式
プログラム→機械語→実行
実行速度が速いが、実行までに手間がかかる
- インタプリタ方式
プログラム逐次解釈→実行
異なるプラットフォームで互換性が保たれるが、実装速度が遅い
中間コード方式
コンパイラでソースコードを機械語に依存しない中間コードに変換→中間コードを専用のインタプリタによって解釈→実行
異なるプラットフォームで互換性を保ちつつ、コンパイラによる実行速度の速さのメリットを得るため
中間コードを解釈して動作する仕組み:仮想マシン
(仮想マシンには言語レベル、ハードウェアレベル、OSレベルなど複数ある)
静的領域:プログラム開始時に確保され、プログラムが終了するまで固定される領域。静的領域に配置されたデータはプログラム実行時に変化しない
ヒープ領域:プログラムの実行時に動的に確保するためのメモリ領域
スタック領域:スレッドの制御のために使うメモリ領域。スタック領域はスレッドごとに1つ用意される。
TextFileReader reader = new TextFileReacer();
のreaderにはインスタンスのポインタが代入されている
(javaに関しては)メソッドの引数や戻り値にオブジェクトを指定した時に渡されているのはポインタ
自分用メモ:どんな時にカプセル化、ポリモーフィズム、継承を行うのか逆引きで知りたい
かたまり(関数やクラス)の依存度を小さくするための指標
凝集度
ソフトウェアの機能のまとめり度合いを評価する尺度。まとまりが強いほど良いとされる。
関数には一つの機能を持たせることが一番凝集度が高い。
結合度
データの受け渡し方を評価する尺度。変更が入ったときに不具合が起きにくいようにするためのもの。
必要なデータが要素ごと(構造体でなく)に関数に渡されている状態が一番結合度が低い。
凝集度を高く、結合度を低くするためのコツ
一言で表現できる命名をする
クラスの外に公開する情報を少なくする
クラスと関係性のある関数のみ作る
凝集度・結合度に関する参考資料
※凝集度・結合度のそれぞれのレベルに関する具体的な実装を理解したい※
ソフトウェアを保守に強くするためには変更の影響範囲を小さくする必要がある
再利用するためには適した粒度に細分化する必要がある