- Published on
オブジェクト指向設計について学ぶ
- Authors

- Name
- Ippei Shimizu
- @ippei_111
オブジェクト指向プログラミング(OOP)
オブジェクト指向は、データとそのデータを操作する処理を一つのオブジェクトとしてまとめ、それらを組み合わせてシステムを構築するプログラミングの考え方です。例えば、「人」というクラス(設計図)を作成し、そこから「たろう」や「はなこ」といった具体的なオブジェクト(インスタンス)を生成します。各オブジェクトは独自のデータを持ちながら、クラスで定義された共通のメソッドとして使用できます。
オブジェクト指向の主な特徴として、「カプセル化」「継承」「ポリモーフィズム」「抽象化」があげられます。
カプセル化は、データの隠蔽の役割があり、クラス内のデータを外部から直接アクセスできないようにすることができます。外部からデータにアクセスする際には、クラスが提供するメソッドを通じて行うことで、データの安全性と整合性が保たれます。
継承は、親クラスの機能を子クラスに引き継げる仕組みです。これにより、子クラスは親クラスに定義されている機能を使用することができ、コードの再利用性が可能になります。
ポリモーフィズムは、同じメソッド名でも、オブジェクトの種類によって異なる振る舞いをさせられる特性です。
抽象化は、複雑な実装の詳細を隠して、必要な機能だけを公開することです。利用者は内部の複雑さを気にせず、シンプルなインターフェースを通じてオブジェクトを使用できます。
OOPの特徴
- カプセル化 : オブジェクトの内部データを外部から直接触れないようにして、メソッドを通じてのみアクセスできるようにします。データの整合性を保ちやすくなります。
- 継承 : 既存のクラスの特性を引き継いで新しいクラスを作る仕組みです。共通の処理をまとめることができます。
- ポリモーフィズム : 同じメソッド名でも、オブジェクトの種類によって異なる動作をさせられる特性です。
手続き型プログラミング
プログラミングを、手続き(処理の手順)の集まりとして構成する設計手法です。上から下へ、順番に命令を実行していくイメージ。データと処理が分離されているのが特徴です。
特徴としては、データと処理が別々に管理されており、ユーザー情報は配列や構造体として保存し、それを操作する関数は別に定義します。データを関数に渡して処理をする形です。
OOPとの違いとしては、手続き型ではデータと処理が分離しているため、プログラムが大きくなると、どの関数がどのデータを扱うのか把握しづらくなることがあります。一方、OOPではオブジェクトとしてまとまっているので、関連性が明確になります。
クラス設計
クラス = 設計図と定義され、どんなデータを持ち、どんな処理ができるのかを定義します。 インスタンス = 実態と定義され、同じクラスから複数のインスタンスを作ることができ、それぞれが独立したデータを持ちます。
- クラス変数 : クラスの全インスタンスに共有されます。
- インスタンス変数 : 各インスタンスごとに独立した値を持ちます。
- コンストラクタ関数 : オブジェクトを生成する際に自動的に呼び出されるメソッドです。そのため、クラスのインスタンス化を行うタイミングで特定の処理を実行するのに適しています。
メンバ変数
メンバ変数とメソッドというものがある。メンバ変数は、クラス内で定義された変数で、オブジェクトの状態を表すために使用される。 メソッドは、クラス内で定義された関数のことで、オブジェクト自体の振る舞いを定義するものになります。
メモリ
オブジェクトを生成すると、そのデータを保存するためのメモリがヒープに常に確保されます。変数自体はスタックにあり、実際のオブジェクトのデータはヒープに保存されています。
- スタック : 関数の呼び出し情報やローカル変数など、短命なデータを保存する領域です。関数が呼ばれると自動的に確保され、関数が終わると自動的に解放されます。高速だが、サイズに制限あり。
- ヒープ : 動的に生成されるオブジェクトなど、長生きするデータを保存する領域です。プログラマ自身が明示的に確保・解放を管理します。スタックより大きい領域が使用できるが、管理が複雑です。
拡張性の必要性
クラスを設計する際には、将来的に新しい機能を追加しないといけない場合などに対応できるように、拡張性を持たせておくことが重要だと思います。ようは、クラス自体に影響を与えずにコードを修正したり、変更したりできるようにしておくことが重要です。