今回は『オブジェクト指向でなぜつくるのか』(日経BP社・平澤章著)を解説します。
1. 歴史
まずは、歴史からです。プログラミング言語は、機械語からアセンブリ言語へ、そして高級言語へと進化してきました。その中で、プログラムの可読性や保守性を向上させるための取り組みが行われました。
その取り組みの中で、まず、分かりやすさを重視した構造化プログラミングが登場しました。これは基本三構造(順次進行、条件分岐、繰り返し)を中心にプログラムを組み立てる方法です。さらに、GOTO文に頼らないプログラミングスタイルも提唱されました。
その後、サブルーチン(手続きや関数)の登場により、プログラムの独立性が高まりました。ローカル変数と引数を使用することで、グローバル変数の使用を減らし、プログラムの再利用性を向上させることができました。
しかし、グローバル変数の使用を最小限にするためには限界がありました。そこで、オブジェクト指向プログラミングが登場しました。
2. OOPの仕組み
オブジェクト指向プログラミングでは、以下のような仕組みがあります。
クラス
クラスは、サブルーチン(メソッド)と変数(プロパティ)をまとめたものです。クラスはオブジェクト(インスタンス)の設計図として機能し、同じクラスから複数のインスタンスを作成することができます。
ポリモーフィズム
ポリモーフィズムは、異なるクラスのオブジェクトに対して同じメソッドを呼び出すことができる仕組みです。これにより、呼び出す側のロジックを一本化することができます。
継承
継承は、既存のクラスを基にして新しいクラスを作成する仕組みです。継承を使用することで、クラス定義の重複を排除することができます。
3. OOPの進化
オブジェクト指向プログラミングは、その後も進化を続けています。いくつかの進化した要素を紹介します。
パッケージ
パッケージは、関連するクラスやモジュールをグループ化する仕組みです。パッケージを使用することで、プログラムの構造を整理し、管理しやすくすることができます。
例外
例外は、メソッドから特別なエラーを返す仕組みです。通常の戻り値とは異なる形でエラーを処理することができます。
ガベージコレクション
ガベージコレクションは、不要なインスタンスを自動的に削除する仕組みです。これにより、メモリ管理の手間を減らし、プログラムの安定性を向上させることができます。
4. メモリの仕組み
オブジェクト指向プログラミングにおけるメモリの仕組みについても触れておきましょう。
プログラムの実行には、静的領域、ヒープ領域、スタック領域の3つのメモリ領域が使われます。
- 静的領域:グローバル変数とプログラムの命令を実行可能に変換したコード情報が格納されます。
- ヒープ領域:プログラム実行時に動的に確保するためのメモリ領域です。オブジェクトのインスタンスなどが格納されます。
- スタック領域:スレッド制御に使用されるメモリ領域です。
また、1つのクラスにつき1つのコード情報がメモリ(静的領域)にロードされます。作成したインスタンスはヒープ領域を使用して動作します。インスタンスを格納する変数には、そのインスタンスのポインタが格納され、メモリ領域の場所を示す情報となります。
メソッドの呼び出しには、メソッドテーブルが使用されます。メソッドテーブルを使用することで、呼び出す側に影響を与えずにポリモーフィズムを実現することができます。
また、スーパークラスのインスタンス変数はヒープ領域にあるサブクラスのすべてのインスタンスにコピーされ、保持されます。
5. 上流工程でのオブジェクト指向
オブジェクト指向は、プログラムの設計の上流工程から適用することが重要です。以下は、設計の目標や上流工程でのオブジェクト指向の活用方法の一例です。
- 重複を排除する:類似の機能を持つ部分を特定し、共通化することで重複を排除します。
- 部品の独立性を高める:各部品が独立して動作できるように設計します。
- 一言で表現する名前をつける:部品の役割を簡潔に表現する名前を付けます。
- 秘密を作る:各部品の内部実装を隠蔽し、他の部品からの干渉を制限します。
- 小さく作る:各部品を小さな単位に分割し、管理しやすくします。
- 依存関係を循環させない:部品間の依存関係を一方向にすることで、プログラムの複雑さを抑えます。
今回は以上になります。最後まで閲覧くださりありがとうございました。