良いコード/悪いコードで学ぶ設計入門(1〜3章)

Tags
設計
Published
February 12, 2024
Author

背景

  • Javaによる開発現場が多く、レビューする立場になることも多いため

学んだこと

  • 関係し合うデータとロジックを1つのクラスにまとめる
データモデルのクラスとそのデータに対して行われる操作は一つにまとめること。
Moneyクラスを例にすると以下のようになる。
class Money { final int amount; final Currency currency; Money(final int amount, final Currency currency) { if (amount < 0) { throw new IllegalArgumentException("金額が0以上ではありません"); } if (currency == null) { throw new NullPointerException("通貨を指定してください"); } this.amount = amount; this.currency = currency; } Money add(final Money other) { if (!currency.equals(other.currency)) { throw new IllegalArgumentException("通貨単位が違います"); } final int added = amount + other.amount; return new Money(added, currency); }
特徴
メリット
メソッド引数やローカル変数にもfinalをつけること
値が変更されていないことが保証される
値を変更させたい場合はインスタンスを新規生成すること。addメソッドのような例。
値が変更されていないことが保証される
コンストラクタで確実に初期値を設定すること。例えばcurrencyは初期化されなければプリミティブ型でないためnullが初期値になってしまう。
利用側が初期化した時点で安全に使える。

Todo

  • クラス設計の時は「そのクラス単体で利用可能か」の観点で設計する。インスタンスを初期化するときに初期値を確実に設定するようにしてNullPointerが起きないようにする。
  • オブジェクトを型の指定で使うようにする。プリミティブ型であればインスタンスに渡す引数の順番を間違える可能性があるのでオブジェクト型の定義を作るようにする。
  • データモデルと行われる操作は一つのクラスにまとめる。