今月(2024年7月)に発売された「手を動かしてわかるクリーンアーキテクチャ ヘキサゴナルアーキテクチャによるクリーンなアプリケーション開発」(Tom Hombergs著, 須田智之訳)を読みました。同じく今月(2024年7月)に発売されたムック本「[入門]ドメイン駆動設計 ――基礎と実践・クリーンアーキテクチャ」のクリーンアーキテクチャの章に寄稿した著者のひとりとしては、是非ともチェックしておかなくてはならないという想いで読みました(宣伝失礼しました)。
「手を動かしてわかるクリーンアーキテクチャ」は、概念としてのクリーンアーキテクチャの解説書としての体裁を取りつつ、具体的な実装についてはヘキサゴナルアーキテクチャを採用して説明しています。この手の解説はどうしたって著者の主観・意見が強く反映される運命にあると思っているんですが、本書もその例に漏れず、著者の見解を交えて説明がなされていますが、筆者の見解については「筆者の見解である」旨が書かれているので親切です。また本書では訳注が多く追加されており、訳注をあわせて読むことで理解を深められる構成になっています。訳注がある分、原著で読むよりお得です。
本書の第1章「保守容易性」では、保守容易性がいかに大切か、他のソフトウェア品質要件と比較して保守容易性が何故特別なのか、といったことが主張の出発点として語られています。「優れたアーキテクチャを選択すれば、保守容易性は向上する」という理由から、クリーンアーキテクチャ・ヘキサゴナルアーキテクチャを採用する有用性も主張されます。
書籍「クリーンアーキテクチャ」の著者であるRobert C.Martinも、別の書籍「クリーンコーダー」の中で「構造を犠牲にして機能を届けるのはバカのやること」と書いて、保守容易性が大切であることを主張しています。「構造を犠牲にして機能を届けるのはバカのやること」、私の好きな言葉です。
一方、書籍「クリーンアーキテクチャ」では、優れたアーキテクチャでは、重要でない選択肢(技術的な詳細)については、できるだけ長い期間、できるだけ多く選択肢を残すことがソフトウェアの保守容易性を高めるためには重要である、という主張をしています(Robert, (2018), p.151)。言い換えれば、詳細と無関係に方針を定められることが大切である、ということです。「手を動かしてわかるクリーンアーキテクチャ」では強く主張されていない点かと思いますが、補足する価値がある点だと考えます。
次に「手を動かしてわかるクリーンアーキテクチャ」では、従来の多層アーキテクチャの問題点を指摘しています。その詳細についてはここでは触れませんが、いくつかの落とし穴があることから、従来の多層アーキテクチャは保守容易性を低下させてしまうという旨の主張がされています。本書の出発点は、保守容易性は他のソフトウェア品質要件と比べても非常に大切であるということでした。本書の主張からすると、従来の多層アーキテクチャが保守性を低下させてしまうのであればそれは良いアーキテクチャではない、ということになるでしょう。
一方で書籍「クリーンアーキテクチャ」では、アーキテクチャの正当性を依存関係逆転の原則と安定度・抽象度等価の原則を用いて説明しています。書籍「クリーンアーキテクチャ」においては、ソフトウェアの設計原則として、SOLID原則、コンポーネントの原則が説明されています(「手を動かしてわかるクリーンアーキテクチャ」でも依存関係逆転の原則については説明されている)。
2冊の間で説明の仕方は異なりますが、同じ結論に至っているところは興味深いです。
Robert C.Martinの説明するクリーンアーキテクチャは、オニオンアーキテクチャやヘキサゴナルアーキテクチャを一般化したものである、ということをご存知の方は多いと思います。私は、クリーンアーキテクチャの理解の難しさはそれが一般化されたものである故に具体的な実装が想像しにくいことにあるのではないかと愚考するものです。
本書では、クリーンアーキテクチャの具体的な実装としてヘキサゴナルアーキテクチャを用いています。これが本書の独自性を産んでいると共に、わかりやすくしている点であると思います。
クリーンアーキテクチャは一般化されたアーキテクチャであり、いわばメタ・アーキテクチャです。故に設計者・実装者によって様々な実装が可能である一方、理解の難しさにつながっている面もあると思います。また、クリーンアーキテクチャの説明においてドメイン駆動設計で示されるような設計パターンが部分的に取り入れられていたりすると、学習者としては「一体自分は何を学んでいるのだろうか?」という気持ちにもなるものです。クリーンアーキテクチャとドメイン駆動設計で同じ用語が異なる意味で用いられていることもあり、理解のしにくさに拍車がかかります。
本書ではヘキサゴナルアーキテクチャを用いて実装例が示されており、それがクリーンアーキテクチャに対する理解を助けてくれると感じました。また、ドメイン駆動設計で示されるような設計パターンについても、説明や訳注がなされており、これも理解を促進してくれます。