コーディングしていくと、あれもこれもとクラスにいろいろ機能をつけてしまいがち。するとそのクラスが持つ責任が多くなってしまう。こんなときはその責任がクラスとして抽出できないか考えてみる。責任とは責務ともいい、英語でresponsibilityのこと。
クラス抽出の手順
- 抽出する責任を果たす新しいクラスを作る
- このとき責任が分かるような名前を付けること。さらに元のクラスの名前も再度検討。
- 元のクラスから新しいクラスへリンク
- フィールドに新しいクラスを作る。つまり委譲。新しいクラスから元のクラスへの逆方向のリンクは必要ない。
- 必要なフィールドを移動
- 移動でミスしていないか確認するため、移動するたびにコンパイルしてチェック。
- 必要なメソッドを移動
- こちらも移動するたびにコンパイルしてチェック。
- 抽出したクラスの検討
- クラスのインターフェースを減らせないか。新しいクラスを外部に公開するか。公開して外部からの修正を許すか。
機能をクラスとして抽出することはわりと以前から行ってきたもの。よくやってしまうミスがフィールドやメソッドの移動が中途半端になり、結局双方向リンクをすることになって余計煩雑になってしまうこと。ちゃんとクラスの責任をどう抽出するか検討しなくてはならない。