オブジェクト指向(OOP)とは, 一体...
駆け出しのエンジニアだったり, モダンなプログラミング言語を学び始めたばかりの人が一度は足踏みするであろう概念の一つが, オブジェクト指向(以下, OOP)である.
かくいう私も, 独学でやっていたプログラミングを仕事にするまでは, 触れていたはずのOOPについて, 1ミリも理解していなかった(今もフワッとしか分かっていないが…).
そこで, OOPについて腰を据えて理論的に学んでみようと思いたったのが昨日で, そこから急いで本屋に行き, OOPについて学べる参考書的な本を購入した.
そして今日から数回に分けて, 学習したことを記事にしていこう思う. 正直, 誰のためにもならない記事になるかと思うので, 期待はしないでほしい. 道端で拾った他人のつまらない日記でも眺めている気分で, ここから先は読み進めてくれ.
参考として書いているコードはJava.
オブジェクト指向の基本概念とメリット
OOPの基本概念は,「カプセル化」「継承」「ポリモーフィズム(多態性)」である. 参考書や記事, 経験からコンポジションをこれら概念に加えることもあるそうだ.ちなみにOOPとは, Object-Oriented Programmingの略である.
メリット
OOPはソフトウェア開発における主要なパラダイム(支配的な考え方や物の見方)であり, 以下のようなメリットがある。
1. 再利用性
OOPでは, 一度作成したクラスやオブジェクトを他のプログラムで再利用することが用意である.なぜ再利用が簡単である必要があるのか.それは単純に, 開発コストや時間の削減ができ,尚且つコードの重複が減ることで可動性が上がるところにある.
2.拡張性
既存のクラスを使用し, 新しいクラスを派生させることで, 新機能の追加が容易になる.OOPであることにより, アプリのスケールアップをする際の柔軟性が向上する
3.モジュール性
OOPは, プログラムがモジュール化されたオブジェクトの集合体として構築されている. モジュール化とは, 機能的にまとまった部分(部品)という認識でいいはず. モジュール化により, 一部の変更が他に与える影響が小さくなるのである.
4.保守性
先にあげたモジュール化により, 変更が容易で安全性が高いことと,可読性の向上により, 保守性の向上に繋がっている.
5.カプセル化
データ(属性, フィールド)とそれを操作する(メソッド, 振る舞い)コードを一緒にパッケージ化することで, 内部実装を外から覗けなくする.そうすることにより外部からの不正なアクセスを制御できる.これらの実現が, データの整合性の確保に繋がる.
6.継承
クラスには共通する処理がある.例えば, DogクラスとCatクラスは,共にsound, eyeColorといった共通するメソッドを持っている.そのような共通する振る舞いを一箇所にまとめ継承することで, コードの重複を避けることができる.
7.ポリモーフィズム
ギリシャ語で「多くの形態」のことをいうポリモーフィズム. それは継承と密接な関係にあるため, OOPの最も強力な利点の一つである.
例えば, DogクラスとCatクラスは共にAnimalクラスを親クラス(スーパークラス)とした子クラス(サブクラス)である.なので, AnimalクラスにまとめておいたsoundメソッドとeyeColorメソッドを呼び出すことができる.しかし, 犬と猫では, その種類によっては目の色が違うだろうし, そもそも犬と猫では鳴き声が違う.
そんな時は, 親クラスの振る舞いを子クラスで呼び出す際にオーバーライドして振る舞いを, そのクラス自身の振る舞いにしてしまえばいい. つまり, DogクラスもCatクラスも同じメソッドを呼び出しておきながら, それぞれが違った振る舞いを実現することができるというわけだ.これが, ポリモーフィズムである.
以下に, 簡単なコードの例を示す.
//親クラス
public abstract class Animal {
//属性
private String sound;
private String eyeColor;
//抽象メソッド(子クラスでオーバーライド)
public abstract void makeSound();
//ゲッター,セッター
public void setSound(String sound) {
this.sound = sound;
}
public void setEyeColor(String eyeColor) {
this.eyeColor = eyeColor;
}
public String getSound() {
return this.sound;
}
public String getEyeColor() {
return this.eyeColor;
}
}
//子クラス
public class Dog extends Animal {
public Dog(String sound, String eyeColor) {
setSound(sound);
setEyeColor(eyeColor);
}
@Override
public void makeSound() {
// 犬の鳴き声
System.out.println(getSound());
}
}
public class Cat extends Animal {
public Cat(String sound, String eyeColor) {
setBark(sound);
setEyeColor(eyeColor);
}
@Override
public void makeSound() {
// 猫の鳴き声
System.out.println(getSound());
}
}
他にも, デザインパターンの利用や構造の直感的理解のしやすさなどメリットはたくさんあるが, 上記にあげたメリットも含めそれらは実際にコードを書いてプロジェクトを進める内に実感できるものだと. そんな気がしている.
それでは.
Enjoy coding life👋.