🔖

OOPと設計について

2023/05/05に公開

本記事はOOPを用いて実装をする人の立場で書いており、OOPを持つプログラミング言語を作成したりOOPの裏側の挙動については書いていません。
間違っている箇所、不備がありましたらコメントいただけますと幸いです。

本記事の目的

OOPの特徴を知る
OOPの3大要素の具体実装を行える

OOPとは

保守性の高いコードを書くための仕組みであり、クラスを用いてコード内の関係性の高い箇所を分類し整理整頓する。

OOPで出てくる用語

クラス:関連性の強い、関数とグローバル変数を一つにまとめる仕組み
メソッド:クラスに定義した関数
クラス変数:クラス固有の変数で、インスタンスから呼び出し可能
インスタンス変数:インスタンス固有の変数、クラスからは呼び出し不可能

OOPを使用するメリット

  • クラスに関係性の高い関数と変数を一つにまとめることができる
    →行数が減る。メソッドの命名が簡単になる(他のクラスのメソッドと名前が被っても大丈夫なので)
  • 変数を参照する元を絞れる
    →クラスとクラスを継承したクラス、インスタンスから参照できるようになる
  • メソッドや変数を再利用できる

OOPを使用しての設計の目標

  • 重複が無い
    →変更が入った時に修正漏れを少なくするために
  • クラスと関数を小さなまとまりで分割する
    →変更が入った時に影響範囲を小さくするために
  • 依存関係を循環させない
    →変更が入った時に参照元に影響がないことを確認しやすくするために

インスタンスとインスタンス変数について

インスタンス:同種の情報を複数同時に互いに干渉することなく扱うための仕組み(ほんまか?)

ローカル変数 グローバル変数 インスタンス変数
複数関数からの参照 ×
アクセス可能範囲 1つの関数 どこからでも 同じクラスのメソッドからのみ
存在期間の長さ 関数の処理中 アプリケーションのライフサイクルと同じ インスタンスのライフサイクルと同じ
変数領域の複製 × ×

OOPの3大要素と実装例

カプセル化

クラスの中の情報に対するアクセスを制限するための仕組み。
情報に対する参照を制限することで変更が入った際にデバッグを簡単にすることができる。
また、情報に対する書き込みを制限することで、意図しない箇所で変数の中身が変更されることを防ぎ、バグを防ぎやすくすることができる。変数の中身を変更できる箇所を狭めることで、変数の中身を変更できる箇所が散らばっている時と比べてデバッグが容易になる。
書き込み専用のsetterメソッドを使用することで、書き込む要素のチェックを行える。

public class PC {
    private String os; // privateはクラス内のメソッドから参照できる
    
    public void setOs(String os) { // クラスの外から参照できる
	this.os = os;
    }
}

PC pc = new PC();
pc.setOs("mac");

ポリモーフィズム

どのクラスのインスタンスがメソッドを呼び出しているかを指定せずに関数を呼び出すための仕組み。
親クラスで定義した抽象メソッドを子クラスが具体実装することでポリモーフィズムを行う。
クラスを子クラスごとに指定しなくて良いので、全体のコードの量を抑えられると思う。

実装例

class Animal {
    abstract String cry(); // 具体的な鳴き方を定義しない
}

class Baby extends Animal {
    String Cry() {
        return "オギャー";
    }
}

class Trainer {
    void execute(Animal animal) {
        System.out.println(animal.cry); // 引数にBabyのインスタンスを入れても良い
    }
}

継承

他のクラスの関数や変数を他のクラスで使用できるようにする仕組み。
上記ポリモーフィズムの例で継承を行っている。

凝集度と結合度概要

かたまり(関数やクラス)の依存度を小さくするための指標

凝集度

ソフトウェアの機能のまとめり度合いを評価する尺度。まとまりが強いほど良いとされる。
関数には一つの機能を持たせることが一番凝集度が高い。

結合度

データの受け渡し方を評価する尺度。変更が入ったときに不具合が起きにくいようにするためのもの。
必要なデータが要素ごと(構造体でなく)に関数に渡されている状態が一番結合度が低い。

凝集度を高く、結合度を低くするためのコツ

  • 一言で表現できる命名をする
  • クラスの外に公開する情報を少なくする
  • クラスと関係性のある関数のみ作る

凝集度・結合度に関する参考資料
https://www.affordd.jp/koha_hp/KeyWords/KW.Coupling.html

参考文献

オブジェクト指向でなぜつくるのか

Discussion