#はじめに
「オブジェクト指向プログラミングとドメイン駆動設計を学ぶのに適切な書籍とおすすめの読む順番」
(https://qiita.com/yushi_koga/items/655fd11396f6b502eaa4)
の記事で、「現場で役立つシステム設計の原則」の本が紹介されていた。
読んでみたので備忘録を書いておこう(少しずつ)。
##第1章 小さくまとめてわかりやすくする
###なぜソフトウェアの変更は大変なのか
変更が大変なプログラムの特徴
・メソッドが長い
・クラスが大きい
・引数が多い
###プログラムの変更を楽にするには、「メソッドは短く、クラスは小さく」
・名前は(略語でなく)普通の単語を使う
・数行のコードを意味のある単位として「段落」に分ける
・「目的別の変数」を使う(1つの変数を使いまわさない)
・意味のあるコードのまとまり(段落)を「メソッド」として独立させる
・業務の関心事に対応したクラス(ドメインオブジェクト)を作る
####異なるクラスの重複したコードをなくす手順
①それぞれのクラスで該当するコード部分(段落)をメソッドに抽出
②2つのクラスに参照関係がある場合:
参照する側で抽出したメソッド呼び出しを参照先のオブジェクトのメソッドの呼び出しに書き換える
②’2つのクラスに参照関係がない場合:
共通のメソッドの置き場所として、別のクラスを新たに作成し、元のクラスで抽出したメソッドを移動する
③元のクラスのメソッド呼び出しを、それぞれ新しいクラスの共通メソッドを利用するように書き換える
###小さいクラスでわかりやすく安全に作る
「値」を扱うための専用のクラスを作る
class Quantity{
int Min = 1;
int Max = 100;
int value;
Quantity(int value)
{
if (value < Min)
throw new IllegalArgumentException("不正:" + Min + "未満")
if (value > Max)
throw new IllegalArgumentException("不正:" + Max + "超")
this.value = value;
}
List<Customer> customers;
void add(Customer customer){・・・}
void removeIfExist(Customer customer){・・・}
int count(){・・・}
Customers importantCustomers(){・・・}
}
###コレクションオブジェクトで、複雑なロジックを集約して整理する
コレクション型を扱うロジックを専用クラスに閉じ込める
コレクションへの参照は変更不可にして渡す
class Customers{
List<Customer> customers;
void add(Customer customer){・・・}
void removeIfExist(Customer customer){・・・}
int count(){・・・}
Customers importantCustomers(){・・・}
}
クラス名やメソッド名と業務の用語が一致するほど、プログラムの意図がわかりやすくなり、変更が楽で安全になる