Skip to content

Instantly share code, notes, and snippets.

@j5ik2o
Last active November 20, 2019 07:01
Show Gist options
  • Save j5ik2o/842f12a2cfc008ef564fe8d1e0c0259a to your computer and use it in GitHub Desktop.
Save j5ik2o/842f12a2cfc008ef564fe8d1e0c0259a to your computer and use it in GitHub Desktop.

「割り勘」ドメインのワークショップ(WIP)

成果物

  • チームで設計に合意すること

副産物

  • ドメインモデル図
    • モデル名を書いた付箋を模造紙に貼る
    • モデル同士の関連を書く
  • ドメインオブジェクトの型定義
    • 型名、プロパティ、メソッドの形式が分かればよい
    • 処理を書くことは任意

チーム

1チーム最大7名でモブワークしながら進める

実装言語

制限はないが以下あたりを想定

  • Java

対象ドメイン

飲み会の割り勘をソフトウェアで解決する

アクター

  • ユーザ
    • 主催者(幹事)
    • 参加者

ユースケース

  • 主催者が飲み会を開催する
    • 支払クラスごとに支払金額負担を追加/削除する
    • 開催した飲み会に参加者を追加/削除する
    • 飲み会の合計金額を設定する
    • 幹事の分担方法を決定する(負担ゼロ、残額負担、クラス指定)
  • 主催者も含めて参加者ごとの支払い金額を計算する
    • 全員の支払い金額が100%を超えないようにするには…。
    • 足りない端数金額は幹事が負担?それもと誰かにカンパしてもらう?

ユースケースに対する姿勢

  • ユースケースに疑問を感じたらいつでも意見や感想を共有しよう。そこからモデルのヒントが得られるかもしれない
  • ユースケースを変更したい場合はスタッフと相談してください。
  • ここに示したユースケースは顕在的な要求を表している。実現方法はともかく目的として達成されなければならない
  • 一方でまだ言語されていない潜在的な要求もあるかもしれない。余裕があれば考えてみよう

ドメインロジックに注目する

  • ドメイン上で扱われる情報だけでなく、意味のある計算処理に注目し、それをメソッドとして定義すること

考えなくてよいこと

  • 割り勘計算後の実際の支払に関すること。端数金額の支払いの手間はゼロと考えてください。
  • HTTPやDB I/Oなどの入出力。リポジトリの実装は無視してよいが、抽象的なインターフェイスは必要ならば考慮に入れて良い

ドメインモデルの洗い出し(30分)

  • ドメインモデル(浅いモデル)を洗い出し共有する
    • もくもくと考え込まずに声に出す
    • 思い付いた概念名を付箋に書き出して共有する
      • モデルの種別: ヒト・モノ・コト(コトの例:受注,出荷,入金など)
      • ステレオタイプ例: エンティティ、バリューオブジェクト、サービス、ポリシー。まずはエンティティからよい
    • その概念の目的を説明してみよう
    • 概念と概念の繋がりを線で結び、その線の名前をつける
    • 用語に漏れダブりがないか
    • 違和感がないか。違和感がすぐに解決しないならメモに残す

以下は一例。他にどんな概念があるか議論してみよう。

名前(日本語) 英語名(任意) 概要
飲み会
参加者
支払クラス
...

ドメインオブジェクトを実装する(30分)

  • 概念モデルを実装に反映する
    • モデル名はユビキタス言語を反映してください
    • UMLで具体的なクラス図を書く代わりに実際にコードにします
    • 全体の方針を合意するために、初期実装ではインターフェイス(抽象型)だけで表現する
    • どこからどこまでが一つのオブジェクトか、決めてください。場合によってはモデルを見直さないといけないかもしれません
  • 必要に応じてテストも追加する
    • 今回の場合は、テストがユースケースを表しているとなお良い

ドメインオブジェクトを改善する(45分)

  • モデルに対してチームで議論し深いモデルへ改善していく。以下 主な設計や実装の観点
    • クラス名、プロパティ名、メソッド名はユビキタス言語を反映する
    • ユースケース実現のために、役に立つ計算を考える
    • 責務の分類と分割
    • モジュール(クラス)の責務を考える
    • プリミティブ型よりドメイン固有型を選択する
    • 不変条件を表明する(型レベル、実行時レベル)
  • その場で解決できそうにない問題やリスクについては、赤い付箋でホットスポットとして表現しておく
  • 目的に立ち戻り全く新しい方法を提案する(任意)

成果物を共有する(15分=3分/チーム*5チーム)

  • チーム内でモデルと実装が一致しているかをレビューする
  • チームごとに以下を軸に考えたモデルを共有する
    • ドメインモデルの選択と集中
    • 議論が白熱したホットスポット
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment