CureApp開発者ブログ

アプリで治療する未来を創造するCureApp, Inc. のエンジニアブログです

JavaScriptでDDD(ドメイン駆動設計) その2 ドメイン知識を分離する

ドメイン知識を分離する

ドメイン知識とは、関心領域の知識のことです。 例えば弊社の扱う領域は医療 / 医学です。

「患者さんに運動療法を提案したい。ただ、 高度の腎機能障害、心不全徴候がある場合は提案しないようにしたい。」

という要件があったとします。 悪いコードの例は、

if (patient.sex is 'male' and patient.sCr >= 2.5) or (patient.sex is 'female' and patient.sCr >= 2) or patient.BNP > 100
    notify '運動は控えましょう。'
else
    notify '運動しましょう。'

重要なドメイン知識が手続きの一部に埋まってしまっています。 そうではなく、

if patient.exerciseAllowable()
    notify '運動しましょう。'
else
    notify '運動は控えましょう。'
class Patient

    ###*
    運動をしてもよいか
    @method exerciseAllowable
    @return {Boolean}
    ###
    exerciseAllowable: ->

        return not @hasCKD() and not @hasCHF()


    ###*
    慢性腎臓病であるか
    @method hasCKD
    @return {Boolean}
    ###
    hasCKD: -> 
        if @sex is 'male'
            return @sCr >= 2.5
        else
            return @sCr >= 2

    ###*
    (検査値による)慢性心不全であるか
    @method hasCHF
    @return {Boolean}
    ###
    hasCHF: ->
        @BNP > 100

このようにして、医学・医療に関する知識=ドメイン知識 を分離します。

対話できる

こうすると、医師(=ドメインエキスパート)は仕様を把握し、

「違う、全然診断基準が違うし、最新のガイドラインに基づいたものにしてほしい!」

などと言ってくれて、最終的によりよいものができていきます。

前者の実装だと医師と対話する土台に立つことができません。

再利用可能

ドメイン知識を分離させることで、ロジックは再利用可能です。

慢性腎臓病の有無で食事指導の内容を変えたい

というときに、もちろん先ほどのメソッドを使って、

if patient.hasCKD()
    notify '生野菜を控えましょう。'

とできます。

JavaScriptは再利用の幅が広い

様々なプラットフォームで動作するJavaScriptでは、 ドメイン知識を様々なプラットフォームで利用できるようになります。

ドメイン知識は、基本的には論理であり、プラットフォームに依存しません。 (インフラ層とやり取りするレポジトリは例外です。ここをisomorphicにする方法もいずれご紹介します。)

どの環境でも同じように、ビジネスロジックを利用できる、というのがJavaScriptの強みです。

次回、第3回目は、「EntityとValueObject」です。

CureAppはDDDで医療を変えるソフトウェアエンジニアを募集しています!