クラス設計ってどうやってやる?どんなこと考えるべき?


なぜ「クラス設計」について学習したいと思ったか?

理由1:「クラス設計」が適切に行われていないと、可読性が低くなると思ったから

1つのクラスに多くの処理(メソッド)が含まれていると、クラスが肥大化してしまい、処理を追うのが難しくなる。
(※というか、読む気が起きなくなってしまう...)

理由2:「クラス設計」が適切に行われていると、処理の流れがわかりやすくなるから

それに引き換え「クラス設計」がちゃんと行われているソースは、
各クラスやメソッドが非常に簡潔に実装されているため、処理全体の流れがわかりやすい。
(「データ取得」してから「加工」して「登録」、みたいな流れが一目でわかる)

オブジェクト指向の機能

「継承」

「親クラス(抽象クラス/スーパークラス)」 > 「子クラス(具象クラス/サブクラス)」という関係を作ることができる。
複数のクラスで記述されていた「共通処理」を親クラスにまとめられるため、「コードの再利用」ができる

「インターフェース」

「このクラスは、こういうメソッドを持つ」ということを定義した、「規格」のようなもの。

ex)「動画・再生ソフト」だったらこんな規格(メソッド)を持つインターフェースになる
・再生
・停止
・一時停止
・早送り
・早戻し

インターフェースを実装するクラスは、インターフェースに定義されているメソッドが必ず含まれていないといけない(「メソッドの実装強制」)。
これにより、新しくクラスを追加する際にも、「あまりにも現在存在するプログラムとかけ離れたクラス」になることを防ぐことができる。

インターフェース自体には「処理」は実装されていない。
そのため、インターフェースの役割は「振る舞いを共通化」すること。

クラス設計のやり方(個人の見解)

1.インターフェースを作成する

「どういう振る舞いが必要か」という、一番大きな視点からインターフェースを設計する。

2.インターフェースを実装するクラスを作成する

まずはこの時点で「継承」とかを考えない。

3.共通化できる処理があれば、抽象クラスを作成する

共通処理を抽象クラスに持たせて「コードの再利用」を行うことで、コード量を減らすことができる。

「継承は、『共通の機能があるからやる』のではなくて、根本は『同じものだからやる』」

いつだったか会社の同僚にこんなコメントをいただいたことがあり、今でもよく覚えている。(非常に勉強になったので)
「継承」が適切に行われていないクラス設計のプログラムで、「共通しているから抽象クラスに持たせよー」とかやっていると、「抽象クラスが肥大化」してしまう。
今回記述した、「インターフェースから実装した上で、共通処理を抽象クラスに持たせる」という手法であれば、この考え方は取り入れられているのでは、と思う。

考え方/原則

単一責任原則

「変更する理由が同じものは集める、変更する理由が違うものは分ける。」
出来るだけ「1つのクラスに役割を持たせすぎない」ように...
単一責任原則 | プログラマが知るべき97のこと

参考URL

どのようにしてクラス設計を行うのか?クラス設計の考え方とコツ
継承によってコードを再利用する
インターフェースとは?~継承とは役割が違う~