All Articles

ddd part.2

ドメインモデリングの方法

なぜやるか

コードを書く開発前に考慮漏れがないようにする

どうやるか

実装するソフトウェアの対象領域に詳しい人間を呼んでアウトプットのイメージをすり合わせる
開発者の足りない知識を埋め合わせる

ドメインモデル図

簡易なクラス図程度のものでよい

  • オブジェクトの代表的なフィールドを書く
  • オブジェクト動詞の has-a 関係、参照関係を表現する
  • ルール/制約を吹き出しに書き出す
  • 集約の範囲を定義する

今回の対象

面接管理システム

モデル図

digraph G { 
    //  
    // Defaults
    //  
 
    // Box for entities
    node [shape=none, margin=0]
 
    //  
    // Entities
    //  
    応募 [label=<
        <table border="0" cellborder="1" cellspacing="0" cellpadding="4">
            <tr><td bgcolor="lightblue">応募</td></tr>
            <tr><td align="left">id</td></tr>
        </table>
    >]
 
    選考 [label=<
        <table border="0" cellborder="1" cellspacing="0" cellpadding="4">
            <tr><td bgcolor="lightblue">選考</td></tr>
            <tr><td align="left">id</td></tr>
        </table>
    >]
    
    選考結果 [label=<
        <table border="0" cellborder="1" cellspacing="0" cellpadding="4">
            <tr><td bgcolor="lightblue">選考結果</td></tr>
            <tr><td align="left">id</td></tr>
        </table>
    >]
    
    面談 [label=<
        <table border="0" cellborder="1" cellspacing="0" cellpadding="4">
            <tr><td bgcolor="lightblue">面談</td></tr>
            <tr><td align="left">id</td></tr>
        </table>
    >]
    
    候補者 [label=<
        <table border="0" cellborder="1" cellspacing="0" cellpadding="4">
            <tr><td bgcolor="lightblue">候補者</td></tr>
            <tr><td align="left">id</td></tr>
        </table>
    >]
    
    合格者 [label=<
        <table border="0" cellborder="1" cellspacing="0" cellpadding="4">
            <tr><td bgcolor="lightblue">合格者</td></tr>
            <tr><td align="left">id</td></tr>
        </table>
    >]
    
    落選者 [label=<
        <table border="0" cellborder="1" cellspacing="0" cellpadding="4">
            <tr><td bgcolor="lightblue">落選者</td></tr>
            <tr><td align="left">id</td></tr>
        </table>
    >]
    
    管理者 [label=<
        <table border="0" cellborder="1" cellspacing="0" cellpadding="4">
            <tr><td bgcolor="lightblue">管理者</td></tr>
            <tr><td align="left">id</td></tr>
        </table>
    >]
    
    採用担当者 [label=<
        <table border="0" cellborder="1" cellspacing="0" cellpadding="4">
            <tr><td bgcolor="lightblue">採用担当者</td></tr>
            <tr><td align="left">id</td></tr>
        </table>
    >]
    
    選考担当 [label=<
        <table border="0" cellborder="1" cellspacing="0" cellpadding="4">
            <tr><td bgcolor="lightblue">選考担当</td></tr>
            <tr><td align="left">id</td></tr>
        </table>
    >]
    
    面談担当 [label=<
        <table border="0" cellborder="1" cellspacing="0" cellpadding="4">
            <tr><td bgcolor="lightblue">面談担当</td></tr>
            <tr><td align="left">id</td></tr>
        </table>
    >]
 
    //  
    // Relationships
    // 
    // One-to-many relation (from one, to many)
    edge [arrowhead=crow, arrowtail=none, dir=both]
    応募 -> 選考
    応募 -> 面談
    選考 -> 選考担当
    採用担当者 -> 選考担当
    面談 -> 面談担当
    採用担当者 -> 面談担当
    
    // Many-to-Many relation (from many, to many)
    edge [arrowhead=crow, arrowtail=crow, dir=both]
    
    // One-to-one relation (from one, to one)
    edge [arrowhead=none, arrowtail=none, dir=both]
    候補者-> 応募
    候補者->落選者
    候補者->合格者
    選考->選考結果
}

想定イベント

  • 面接を登録する
  • 選考を登録する
  • 選考結果を登録する

モデルを定義していくと、本で見ているように採用管理システムに近くなった。
イミュータブルモデルを意識してモデリングしたので基本的にインサートでいけるはず。
応募エンティティのみ最終ステータスを更新する必要がある。ex.)内定/辞退/お見送り など