オブジェクト指向について学べる記事を紹介して頂いたので、自身のアプトプット用にまとめました。
こちらの記事を参考に勉強したいと思います!
オブジェクト指向の3大要素
1. 継承
クラス同士の関係性を「AはBである」
と表現することができる。
例)トラックは車である。
継承は親クラスの要素を受け継ぐという意味と解説されることが多いが、継承の本質は***「交換可能なパーツを作成するために共通点を「規格」としてまとめることができるインターフェース」***である。
例)車の部品(エンジン、ハンドル、タイヤ等)はどの車でも使うので、共通部品としておく。
Engine engine = new JetEngine();
Handle handle = new QuickHandle();
Brake brake = new AntilockBrake();
Wheel wheel = new StudlessWheel();
Car car = new Car(engine, handle, brake, wheel);
そうすることで部品は何度も1から作る手間がなくなり、かつハンドルを変えたりすることが容易になりプログラムに柔軟性が生まれる。
2. ポリモーフィズム(多様性)
抽象クラスやインターフェースなどを利用して、メソッドの呼び出し方法を共通化し、「オーバーライド」させることによって、インスタンスごとに違う挙動をさせる。
例)犬でも猫でも動物として扱い、鳴くという処理を犬「わんわん」猫「にゃー」とさせる。
//動物の鳴くの処理はこれだけで済む
//なんの動物か書いてないので、抽象的である。※1
animal.bark();
//犬クラス
public void bark() {
System.out.println("いぬ:ワンワンワン");
}
ポリモーフィズムは***「インターフェース(抽象・規格)に対してプログラムする」***(※1)
3. カプセル化
情報を隠蔽することによって、不整合を起こすような操作ができないようにする仕組み。
フィールドをprivateにすると外部から操作できないので、使いたいときはgetterとsetterにしていたやつですね。
カプセル化とは抽象化のことであり、無駄を省き、外から見ても複雑でない状態を作ること。
実現させるためにはクラスの役割は1つにし、正しい名前を付ける必要がある。
よくわからなかったのでこちらの記事を参考にしました。
カプセル化はどうすればよい感じに実現できるのか?
getter,setter使いまくってたら意味ないよね?
例えば満腹度が上下するプログラムの時、満腹度が直接いじれてしまうとまずいですよね。
急に満腹になったりお腹が空いたりしてしまいます。
外部から隠蔽するためにカプセル化(private)しておきます。
満腹度を直接いじるのではなく、走ったり食べたりするメソッドにより満腹度が上下するようにします。
これならいきなり満腹度をいじることはできなくなります。
public class Human{
private static int count_Human = 0;
private String name;
private int birthday;
private int manpukudo;
// getter,setter省略
public int getManpukudo(){
return this.manpukudo;
}
public void eat(){
this.manpukudo += 60;
}
public void walk(){
this.manpukudo -= 10;
}
public void run(){
this.manpukudo -= 20;
}
}
オブジェクト指向の目的
オブジェクト指向の目的は***「変更に対して柔軟に対応する」ためです。
プログラムには変更がされない箇所と、頻繁に変更されるであろう箇所が出てきます。
オブジェクト指向は頻繁に変更される箇所をクラスに抽出するプログラミングスタイル***です。
例)ハンバーガーファストフード店で新商品が発売される前提でシステム開発をすると、新しいポテトが発売しても柔軟に対応できます。
しかし、PCも販売するかも!と設計するのは過剰実装です。
頻繁に変更されるであろう「食品の新商品」は加味して設計する必要がありますが、自動車製品の販売をすることは変更の可能性が低いです。
変更の可能性が低い箇所を土台に、高い箇所に気を配って設計する必要があります。
感想
オブジェクト指向は、頻繁に変更される事項を共通点としてをまとめておいて、使いやすい、分かりやすいを実現させようということでしょうか。
まだ理解はできていないですが、実務でなるほどと思えると嬉しいです。