『手を動かしてわかるクリーンアーキテクチャ』の感想
書籍『手を動かしてわかるクリーンアーキテクチャ ヘキサゴナルアーキテクチャによるクリーンなアプリケーション開発』を読んだので感想を書きます。
何の本か
クリーン「な」アーキテクチャの具体的な設計・実装方法に焦点を当てた本です。タイトルおよびサブタイトルに「クリーンアーキテクチャ」と「ヘキサゴナルアーキテクチャ」の両方が入っているので、若干混乱を招きそうですが、クリーン「な」アーキテクチャの具体例の一つであるヘキサゴナルアーキテクチャの解説書と捉えた方がよいでしょう。原著のタイトルには「ヘキサゴナルアーキテクチャ」という言葉は入っておりませんが、蓋を開けて驚かないように日本語版のサブタイトルには「ヘキサゴナルアーキテクチャ」を入れたのかなと推測しました。
サンプルコードはJavaで書かれています。内容的には他の言語でも通用する設計方針の話が多いですが、一部Spring Bootに特化した話もあるため、その辺りの知識がないと読みづらい章もあると思います。
なお「手を動かしてわかる」とありますが、ハンズオン形式になっているわけでもなく、演習問題が付いているわけでもありません。
良いところ
ヘキサゴナルアーキテクチャの解説
ヘキサゴナルアーキテクチャ、あるいはポート&アダプタアーキテクチャは比較的耳にすることも多く、「あの六角形のやつね」と思い浮かべる方も多いでしょう。しかし、具体的にヘキサゴナルアーキテクチャをどう実装すればよいかを解説した書籍は多くありません。この本では、六角形の絵で表現されるモデルを、ソースレベルで具体的にどのように落とし込めばよいのかを詳しく述べています。
レイヤー間のモデルの変換
ヘキサゴナルアーキテクチャでも、(狭義の)クリーンアーキテクチャでも、ドメイン層のオブジェクト(ドメインオブジェクト、あるいはエンティティ)と、外部のアダプター層で使うオブジェクトとの間の変換処理が必要となります。アダプター層で使うオブジェクトは、例えばO/Rマッパーを使ってRDBへ読み書きするために所定のインターフェースを実装したり、アノテーションを付与したりするなど実装技術への依存が生じるため、ドメイン層のオブジェクトとは分けておきたいからです。
一般的なユースケースではin(例えばWeb)とout(例えばRDB)とで最低二種類のアダプターが存在し、それぞれでオブジェクトの変換処理が発生するため、かなりの量のボイラープレートコードを書く必要があります。この本では、変換処理の課題に対していくつかの作戦を提示し、比較を行なっています。結局はトレードオフを考慮してアーキテクトが判断しましょう、というところに落ちるのですが、参考になるでしょう。
翻訳の質
全体としてとても読みやすかったです。著者の主張にはところどころ「ん?」となる点もあるのですが、そういったところにはうまく訳注が入っており、ドメインに知見のある方の翻訳というのは安心感を持って読むことができるなと感じました。
いまいちなところ
サービスの定義がよくわからない
第3章で示されるヘキサゴナルアーキテクチャの構成図(図3.6)にドメインサービスとアプリケーションサービスが登場します。どうやら一般的に使われるドメインサービス、アプリケーションサービスとは異なるようなのですが、具体的に何なのかがよくわかりませんでした。サンプルコードではこれらは分離されておらず、一つのサービスとして実装されていて、いわゆるアプリケーションサービス、あるいはクリーンアーキテクチャにおけるユースケースに相当するものに見えます。
このあたりは読者に混乱を引き起こしそうです。
境界づけられたコンテキストの管理方法
第13章「複数の境界づけられたコンテキストの管理」では、一つの核(六角形)の中に複数の境界づけられたコンテキストを配置し、その核内でそれぞれをうまく分離した方がよいと述べられていますが、この主張には賛同できませんでした。
著者はその根拠として、境界づけられたコンテキストをそれぞれ核とした場合、例えばそれが4つあれば6つの依存関係が生まれ、各々に接続アダプターが必要になってしまうため、としています。しかしそのような状態は、境界づけの仕方すなわちハイレベルな設計が失敗している可能性が高いです。
また、核内で各コンテキストをうまく分離するというのは実際には難しく、ぐちゃぐちゃな依存関係が生じるリスクが高いというのが私の意見です。
境界づけられたコンテキストは必ずしもマイクロサービスの単位とは一致せず、複数をまとめるという設計判断もあり得るのですが、その場合もモジュール単位としては分離するのが定石だと思います(モジュラーモノリスか、それに準じた構造)。
誰が読むべきか
以下のような目的において役立つ書籍だと思います。
クリーンなアーキテクチャの実装例についてソースコードレベルで学びたい方
ヘキサゴナルアーキテクチャの設計・実装方法について学びたい方
狭義のクリーンアーキテクチャ(CA本で典型例として提示された構造)で生じる諸問題を解決または改善したい方
ただし、この本が提示するアーキテクチャもクリーン「な」アーキテクチャの一例に過ぎません。なぜそのように設計するのか、という問いを立てながら読むことで、自分達のアーキテクチャに応用可能な知恵を得られるのではないかと思います。
この記事が気に入ったらサポートをしてみませんか?