buto > /dev/null

だいたい急に挑戦してゴールにたどり着かずに飽きる日々です

DDD(ドメイン駆動設計)を調べてみた

DDD(ドメイン駆動設計)とは

ドメイン(ソフトウェアで問題解決しようとする対象)に焦点を当てるソフトウェアの設計方法

「ドメイン駆動設計」は新人SEの必修項目でいいと思う

コーディングする時サービスクラスに何でもかんでもロジックを詰め込むのではなく、DTOクラスに対象のロジックを書く!って理解(ちゃんと勉強すると実装手法はたくさんありそう)

DDDのモデリングとは何なのか、 そしてどうコードに落とすのか

DTOクラスがgetter/setterしかない状態をドメインモデル貧血症と言うらしい(いつも私が書くコードだ笑)

ドメインモデル貧血症

とにかくやってみる

引数に食材を渡して食材を使う料理を返す処理を作ります

メインメソッドを持つコントローラー

package controller;

import domain.Receipt;
import logic.ReceiptLogic;

public class ReceiptController {

    public static void main(String... args) {

        Receipt receipt = new Receipt(args[0].toUpperCase());
        ReceiptLogic logic = new ReceiptLogic();

        System.out.println(logic.getDate() + "のメニュー : " + receipt.search(receipt.getIngredient()));
    }
}

ドメインクラス 料理の検索メソッドをこちらに書きました!

package domain;

public class Receipt {

    public Receipt(String ingredient){
        this.ingredient = Receipt.Ingredients.valueOf(ingredient.toUpperCase());
    }

    private Ingredients ingredient;

    public Ingredients getIngredient() {
        return ingredient;
    }

    public Dishes search(Ingredients ingredient){
        // 本来はDB接続して料理を検索
        Dishes dish = switch(ingredient){
            case CABBAGE -> Dishes.COLESLAW;
            case EGG -> Dishes.QUICHE;
            case BACON, POTATO -> Dishes.GRATIN;
            case CARROT, ONION, TURNIP -> Dishes.POTAUFEU;
        };
        return dish;
    }
    // 本来はDBに食材や料理を登録しておく
    public enum Ingredients {
        BACON,
        CABBAGE,
        CARROT,
        EGG,
        ONION,
        POTATO,
        TURNIP;
    }

    public enum Dishes {
        POTAUFEU,
        COLESLAW,
        QUICHE,
        GRATIN
    }
}

サービスクラス ドメインとは関係のない日付取得はこちらに書いています

package logic;

import java.time.LocalDate;

public class ReceiptLogic {

    public String getDate(){
        LocalDate now = LocalDate.now();
        return now.getMonthValue() + "/" + now.getDayOfMonth();
    }
}

メインメソッドに引数「cabbage」を渡して実行すると以下が返ってきます

12/4のメニュー : COLESLAW

ドメインクラスに書いたsearchメソッドは今までだったらサービスクラスに書いていました

いつもサービスクラスのコードが多くなってしまい、メンテ時にサービスクラス内で迷子になることがしばしば…

ドメインクラスに対象の処理も書くようにすれば処理詳細を見る前に「何に関わる処理か」というところまでは分かりそう!