【読書会メモ】現場で役立つシステム設計の原則(1)

実施日時:2019/11/6
対象範囲:第1章
参加者:みずき、yodai、くめごん、まぶり、kassyi

1章
ソフトウェアの設計とは、ソースコードを整理整頓してどこに何が書いてあるのかわかりやすくするもの。
変更が大変なプログラムとは、メソッドが長い、クラスが大きい、引数が多い
これらは、関心事を詰め込みすぎたため
なぜそうなるのか?
⇒コードの追加・変更を繰り返したため。
〇それを防ぐために
・分かりやすい名前を使う
 変数は、1文字や省略形は止める。
・段落に分ける
 空白行を使って、意味事に段落に分ける
・目的ごとに変数を用意する
 変数の使いまわしを止める(破壊的代入の阻止)
 目的別に専用のローカル変数を用意する・
 ⇒説明用の変数を導入する。
・メソッドとして独立させる
 メソッドが独立した部品となり、変更の影響を限定できる。
 ロジックやデータを別メソッドに独立させることをメソッドの抽出と呼ぶ
・異なるクラスの重複したコードをなくす
 1つのクラスだけでは、メソッドの抽出だけでできる。
 2つのクラスでは工夫が必要(手順1~3)
・狭い関心事に特化したクラスにする
 業務で使われる用語に合わせて、その用語の関心事に対応するクラスをドメインオブジェクトと呼ぶ
・メソッドは短く、クラスは小さく
 送料という関心事に限定してコードを整理した結果、数行の短いメソッドを持つ10行ほどのクラスになった。
 コードの意図を分かりやすく説明するためには、1行の計算式でもメソッドに独立させる。
 長いメソッドと大きなクラスは変更が大変なので、短いメソッドと小さなクラスに小分けして整理する。
 ドメインを中心に考えると良い。

〇小さなクラスで分かりやすく安全に
クラスの設計について
・データとロジック
 基本データを対象に業務の約束事に従って判断、加工、計算を記述するのが業務ロジック
・基本データ型の落とし穴
 intやGigDecimalは通常の業務で扱うには大きすぎる
 業務の関心事から考えるとかけ離れた異常な値を扱うことになる。
・値の範囲を制限してプログラムを分かりやすくする
 最小最大を設定した独自クラスを宣言する
 電話番号でもStringでなく、桁数や入力可能な数字を設定する。
 数量は単なるintではなく、電話番号は単なるStringではない
・値を扱うための専用クラスを作る
 値を扱うための専用クラスを作るやり方を値オブジェクト(Value Object)と呼ぶ
 int,Stringだけだと業務が何をやっているのか分かりにくくなる。
 業務で必要な値の範囲とはかけ離れているので、バグを生みやすくなる。
・値オブジェクトは不変にする
 変数の値の上書きは危険なので、別の値が必要になったら別のオブジェクトを作成する。
 上書きすると、ある時点でどの値になっているのかが不明になる。
 インスタンス変数が変化しない不変な値オブジェクトで設計するのを完全コンストラクタと呼ぶ
・型を使ってコードを分かりやすく安全にする
 quantityとunitPriceを間違って渡した場合正しい値を返さない
 int型の渡し間違いのバグは発見し辛い
 独自の型を使って意図を明らかにする。
 値オブジェクトは業務の関心事を直接的に表現する

〇複雑さを閉じ込める
・配列やコレクションはコードを複雑にする
 配列やコレクション型を操作するロジックは、小さなクラスのまとめる
・コレクション型を扱うコードの整理
 コレクション型の状態を正しく把握するのは大変
・コレクション型を扱うロジックを専用クラスに閉じ込める
 例えば、List<Customer>を操作するロジックはCustomersクラスに集める。
 追加、削除、カウント、抽出など
 また、Customersクラスでは、List<Customer>以外のインスタンス変数は持たないようにする。
 コレクション型のデータとロジックを特別扱いにして、専用クラスを作るやり方をコレクションオブジェクトまたはファーストクラスコレクションと呼ぶ
 これらで使う側のロジックが単純になる。
・コレクションオブジェクトを安定させる
 コレクションオブジェクトもできるだけ不変スタイルで設計する方がプログラムが安定する。
 getList()では、newして渡す、加えてCollections.unmodifiableList(customers)などを使用する
 コレクションの要素が変更できないようにする。
・コレクションオブジェクトは業務の関心事
 業務の関心事とクラスを一対一に対応させる工夫

議論
ユーザクラスの状態を取りたいとき、ユーザがログインするなどユースケースが増えると
クラスが大きくなるので、ユースケースごとにクラスを分割する。
関心事で切り出す。
イテレータパターンで実際にループしているのは別のもの
業務で関心事の対象を切り出す(クラスの分割)には、議論が必要

この記事が気に入ったらサポートをしてみませんか?