この記事は株式会社ヘンリー Advent Calendar 2024の18日目の記事です。
18日 26:20に書き上げました!セーフ!!!!
ドメインエキスパートとの会話で難しい概念やロジックがでてくることがある。
それらは一見、意味がわからないものであったりするが、ドメインを理解することで適切な表現であることを理解する瞬間がある。
最近それを感じた瞬間があったので、紹介してみようと思う。
前提知識の共有
まず、具体例を理解するための前提知識を共有させてほしい。
- 患者は医療保険によって、医療費の1割〜3割を負担することで医療を受けることができる。
- 患者は公費と呼ばれる制度によって、医療費の負担を更に減らすことができる
- たとえば、難病医療費助成と呼ばれる公費(以下、難病公費)を持っていると医療費の2割まで負担するだけで済むようになる*1
- また、患者が負担しなかった金額は、医療保険または公費によって給付された金額という扱いとなる
ちょっと難しいかもしれないので、具体的な事例を2つ紹介する。
事例 1) 3割負担の医療保険と難病公費を持っている患者が医療費が10,000円の医療サービスを受けた場合
- 医療保険によって発生する負担額は3,000円(10,000円 の 3割)となる
- 難病公費によって発生する負担額は2,000円(10,000円 の2割)となる
- このとき
- 患者の負担額は*2は2,000円となる
- 医療保険の給付額は7,000円となる
- 難病公費の給付額は1,000円となる
- 1,000円 = 医療保険によって発生する負担額(3,000円) - 難病によって発生する負担額(2,000円)
事例 2) 1割負担の医療保険と難病公費を持っている患者が医療費が10,000円の医療サービスを受けた場合
- 医療保険によって発生する負担額は1,000円(10,000円 の 1割)となる
- 難病公費によって発生する負担額は2,000円(10,000円 の 2割)となる
- このとき
- 患者の負担額はは1,000円となる
- 医療保険の給付額は9,000円となる
- 難病公費の給付額は0円となる
- 難病公費は患者に2,000円まで患者に負担を求めるが、医療保険によってそれを下回る負担額となっているた0円となる
(難解な前提知識で申し訳ない。)
Henryでの実装
負担額と給付額という概念はシステム的に重要で算出し永続化されている。
上で紹介した内容を見ても負担額・給付額の計算ロジックは複雑だなと思われたかもしれないが、他にも影響を与える要素が多数あり、計算ロジックはよりさらに難解となる。
難解なロジックの認知コストを下げるモチベーションは高い。
仮に公費による給付が発生しないのであれば、公費によるロジックをスキップすることが可能であり、全体の見通しを上げることができる。それが認知コストを下げることに繋がる。
さて、あなたは、公費による給付が発生するかどうかを、どのような判定式として書くだろうか?
事例をシンプルに判定式に落とすと以下のような式を書こうと思うのではないか。
val is給付あり = 医療保険による負担額 > 公費による負担額
一方、Henryのプロダクトコードとして以下のような判定式が存在している。
val is給付あり = 医療保険の負担割合 > 公費の負担割合
同じ結果になることを理解できるだろうか?
これは、以下の式から共通の項である「医療費」を打ち消した式である。
val is給付あり = 医療費 * 医療保険の負担割合 > 医療費 * 公費の負担割合
さらに、項を整理すると、1つ目の式と同様のものとなる。
val 医療保険による負担額 = 医療費 * 医療保険の負担割合
val 公費による負担額 = 医療費 * 公費の負担割合
val is給付あり = 医療保険による負担額 > 公費による負担額
最初の式と同じ結果となる判定式であることは理解いただけたと思う。
難解に感じる式が使われている理由
どちらの式が理解しやすいと感じただろうか?
この記事を読んだ方は、前者の式が理解しやすいと感じたのではないかと思う。
それは、おそらく、前提知識の共有として説明した内容では負担割合の比較という表現はないからだ。
では、なぜHenryでは難解と感じる式が使われているのか。
それは、ドメインエキスパートとの対話ででてくる表現が後者であったからだと考えている。
ドメインエキスパートの使う表現を可能な限りコードに落とし込む大切さ
複雑なドメインのプロダクトを作るにあたって、ドメインエキスパートとの対話が欠かせないものである。
対話の中ででてくる表現を理解することが、ドメインの理解につながる。
そして、その理解をコードに落とし込むからこそ、ドメインエキスパートの表現と、実装の表現の差を減らすことが可能になっていくのである。
一見難解なコードであったとしても、それをドメインエキスパートとの対話のきっかけとして利用し、ドメインの理解を進めるほうが、より良い状況を生み出すであろう。
逆に、そうしない場合、表現の差が増えてしまう。
この場合、ドメインを理解するきっかけは減ってしまう可能性もある。
更には、異なる事象の説明をされているように感じてしまうかもしれない。
結果、ドメイン理解を進める足かせになってしまうかもしれない。
この記事を読んでくれたあなたの中で、ドメインエキスパートの使う表現を可能な限りコードに落とし込む大切さが少しでも上がれば幸いである。