のんラボ

社内でドメイン駆動設計入門の読書会 #14

2020/06/01 2020/06/01 社内でドメイン駆動設計入門の読書会 #14

社内でドメイン駆動設計入門の読書会 #14

こんにちは。Nonです。

今回も会社で読書会をしている話をしようと思います。

内容は控えめに、ディスカッションの内容重視で書いていきたいと思います。

より具体的なコードや内容がみたい!という方は購入しましょう!

前回:会社でドメイン駆動設計入門の読書会 #13

読んでいる本

読んでいる本はこちらのドメイン駆動設計です。

ドメイン駆動設計入門 ボトムアップでわかる! ドメイン駆動設計の基本


以前の記事でも言っていたように、業務でDDDを利用して開発することが多くなったのですが、DDDに精通している人が少ないという問題がありました。

そこで、その精通している人が読書会をしようかと誘ってくださいまして、是非にと参加させていただきました。

進行方法

読書会の進行方法は

  1. 今回読書の対象にする章を決める。
  2. 10〜20分間その章を読む
    1. 読み終わってしまった人は、もう一周読み直すか、次の章に進んでもらう
  3. その後40分間で、その章に対する疑問や考え方をディスカッションする
  4. 1〜3を毎週定期的に行う

という進行方向となっています。

社内で読書会をするのはこれが初めてなので、進行方法はもっといいのあったら教えて下さい。

今回読んだ内容

  • アーキテクチャ
  • アーキテクチャの役目
    • アンチパターン:利口なUI
    • ドメイン駆動設計がアーキテクチャに求めること
  • アーキテクチャの解説
    • レイヤードアーキテクチャとは
    • ヘキサゴナルアーキテクチャとは
    • クリーンアーキテクチャとは
  • まとめ

ディスカッション

今回はアーキテクチャについて

これまでのドメインオブジェクトをどうやって実装していくか、それにあったアーキテクチャを紹介してくれている章でした。

抽象に依存せよ

これまでの章で何度も登場してきたのが、この文言です。

抽象に依存しておけば、実装クラスの内容をある程度縛ることができますし、抽象クラスを見るだけどんな内容が実装されるべきなのかわかります。

クリーンアーキテクチャ

The Clean Code Blogより抜粋

CleanArchitecture.jpg

https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html

徹底的に依存を嫌うので、値を返さない用な処理が多いです。

前回試しにかいたコードを見てみましょう。

copied.class CreateCircle
{
    private $userService;

    public function __construct(UserService $userService)
    {
        $this->userService = $userService;
    }

    public function process(CreateCircleInputPort $inputPort, CreateCircleOutputPort $outputPort)
    {
        $circleName = new CircleName($inputPort->circleName());
        $circle = $this->userService->createCircle($circleName);
        $outputPort->output($circle);
    }
}

interface CreateCircleInputPort
{
    public function circleName(): string;
}

interface CreateCircleOutputPort
{
    public function output(Circle $circle): void;
}

このprocess関数は何も返却されていません。

Actionからこのアプリケーションサービスを呼び出すイメージなので、アクションには何も帰らないことになります。
こうすることで、Actionはこのアプリケーションサービスに依存しないようにできています。

ではActionは何をレスポンスとして返せばいいのかというと、上図にあるようにUse Case Output Portに返したいものを注入しておきます。

copied.class CreateCircleAction extends Controller
{
    private $useCase;

    public function __construct(CreateCircle $useCase)
    {
        $this->useCase = $useCase;
    }

    public function __invoke(Request $request)
    {
        $response = new CreateCircleResponse();
        $this->useCase->process($request, $response);
        return response()->json($response);
    }
}

returnするのは同一のドメイン内だけで行うことのようです。

アーキテクチャの勉強にもなった

正直この読書会をするまでは、MVCすら危うい感じでしたが、このように具体的に書いてくれる本があったので、設計にも少しは明るく慣れたと思います。

  • 抽象に依存せよ。(interfaceを利用せよ)
  • ドメイン内以外でreturnするな(オブジェクトを渡して、結果はそこに注入せよ)
  • 強いてあげるなら、フレームワークに依存するな。

これくらいを守れればコードの可読性と保守性は飛躍的に向上すると思います。

最後に

どうやって設計すれば。。。という壁にぶち当たっていたので、今回の章(今回の読書会)でこの壁は壊せたと思います。

このアーキテクチャはドメイン駆動だけでなく他のモデルにも通じますし、PHPだけじゃなくてjavascriptにも通用しますので、フロントのコードも多少はきれいになると思います。

次回はドメイン駆動設計のとびらを開こうです。
また記事にしますので、その時はよしなに。

.