Open3

現場で役立つシステム設計の原則 × Dart 自分用メモ

RyosukeOKRyosukeOK

現場で役立つシステム設計の原則

CHAPTER2

場合分けのロジックを整理する

  • プログラムを複雑にする「場合分け」のコード
    • Javaの列挙型を使えばもっとかんたん

if分を使わない実装を目指す。
上記をDartで書いてみる。

RyosukeOKRyosukeOK

Javaでは列挙型もクラスです。区分ごとの値をインスタンス変数として保持したり、区分ごとのロジックをメソッドとして記述できたりします。

Dartのenhanced enumsを使えば、interface自体不要になる。

RyosukeOKRyosukeOK

enhanced enumsを使う場合

void main() {
  // e.g. 画面のドロップダウンリストで選択された区分名から対応する区分オブジェクトを探す
  final selectedFeeTypeName = 'adult';

  final fee = Fee.values.byName(selectedFeeTypeName);
  print(fee);
  assert(fee.yen.value == Yen(100).value);
  assert(Fee.adult.compareTo(Fee.child) == 50);
}

/// 円の値オブジェクト
class Yen {
  const Yen(this.value);
  final int value;
}

/// enhanced enums
enum Fee implements Comparable<Fee> {
  adult(yen: Yen(100), label: '大人'),
  child(yen: Yen(50), label: '子供'),
  senior(yen: Yen(80), label: 'シニア'),
  ;

  const Fee({
    required this.yen,
    required this.label,
  });

  final Yen yen;
  final String label;

  
  int compareTo(Fee other) => yen.value - other.yen.value;
}

https://dartpad.dev/?id=061d3b5eb903d1ad09466b44c1ce0849