WHITEPLUS TechBlog

株式会社ホワイトプラスのエンジニアによる開発ブログです。

クリーンアーキテクチャ+DDDの魅力

ホワイトプラスでユーザー向けのWEB開発を行っているアキト927です。

業務系WEB開発が5年ほど、BtoC向けWEB開発に10年ほど携わってきました。 ホワイトプラスには入社して1年弱です。

経歴はそこそこ長くなりましたが、まだまだ勉強中の日々を送っています。

今回はホワイトプラスで採用しているクリーンアーキテクチャ+DDDについてざっくりとした解説を行い、これらを採用する魅力をお伝えできればと思います。

What's クリーンアーキテクチャ?

早速ですが、クリーンアーキテクチャって何?という部分を紹介していきたいと思います。

クリーンアーキテクチャはRobert C. Martin氏が提唱したソフトウェアを変更や拡張に強くすることができるアーキテクチャです。

これは以下の特性を持っています。(クリーンアーキテクチャ 達人から学ぶソフトウェアの構造と設計より引用)

  • フレームワークに依存しない

クリーンアーキテクチャは機能満載のソフトウェアライブラリに依存しません。 これにより、システムをフレームワークの制約で縛るのではなく、フレームワークをツールとして使用できます。

  • テスト可能

ビジネスルールは、UI、データベース、ウェブサーバー、その他の外部要素がなくてもテストが行えます。

  • UI非依存

UIはシステムの他の部分を変更することなく簡単に変更できます。

例えば、ビジネスルールを変更することなく、ウェブUIをコンソールUIに置き換えることができます。

  • データベース非依存

ビジネスルールはデータベースに束縛されていません。

そのため、あらゆるデータベースシステムに対応することができます。

  • 外部エージェント非依存

ビジネスルールは外界のインターフェースについて何も知らない状態です。


以上の特徴を図にしたものが以下になります(The Clean Code Blogより引用)

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


依存関係を制御する

図の詳細についてはクリーンアーキテクチャ 達人から学ぶソフトウェアの構造と設計を読んでください。ここでは説明を割愛します。(というより、本書を読んでいただくことが一番誤解なく理解いただく近道と考えています)

各レイヤーがどういうものかということも大事ですが、それよりも各レイヤーの矢印が外側から内側に向いていること、これが非常に重要です。

各レイヤーは自分の外側について何も知らない状態を作ることにより、自分の外側で変更が発生した場合でも自分自身には影響が発生しない状態を作り出しています。(内側のレイヤーは外側のレイヤーに依存していない)

そうすることにより、例えばフレームワークのバージョンを更新するなどの大掛かりな変更があったとしても、ビジネスやアプリケーションの中核であるエンティティやユースケースは影響を受けないというメリットを享受できます。(フレームワークやデータベースに依存しないシステム設計)

What's DDD(ドメイン駆動設計)?

続けてドメイン駆動設計について触れていきたいと思います。(ドメイン駆動設計入門 ボトムアップでわかる! ドメイン駆動設計の基本より引用)

ドメイン駆動設計はエリック・エヴァンス氏が提唱する設計手法です。

この設計手法はソフトウェアの利用者にとって価値あるソフトウェアを構築するため利用者の問題を見極め、解決するための最善種を常に考えていくといった洞察を繰り返しながら設計を行い、ソフトウェアの利用者を取り巻く世界と実装を結びつけることを目的としています。

ドメインとは

ドメインは「領域」の意味を持った言葉です。ソフトウェア開発におけるドメインは「プログラムを適用する対象となる領域」を指します。そして重要なのはドメインが何かではなく、ドメインに含まれるものが何かです。

会計の世界には金銭や帳票といった概念が、物流の世界には貨物や倉庫、輸送手段といった概念が、というようにドメインに含まれるものはシステムが対象とするものや領域によって大きく変化します。

ドメインの知識に焦点をあてた設計手法

ソフトウェアの目的は利用者のドメインにおける何らかの問題の解決であり、「利用者が直面している問題」を正確に理解することが必要です。

つまり、利用者のドメインと向き合い問題の解決にフォーカスした設計手法がドメイン駆動設計であると言えます。

クリーンアーキテクチャとDDDを組み合わせる

以上のことから、DDDは利用者の問題にフォーカスしたシステム設計を提供してくれます。

また、クリーンアーキテクチャは関心を分離し、依存関係を制御することにより、変更に強いシステム設計を提供してくれます。

これらの設計手法を組み合わせて用いることにより、利用者の問題解決にしっかりとフォーカスを当てながら利用者には関係のないライブラリやフレームワークなどの変更に強いシステムを構築することができます。

かなりざっくりとまとめてみましたが、いかがでしょうか?私もまだこの道に足を踏み出したばかりであり、勉強の毎日を送っております。

クリーンアーキテクチャ+DDDを導入することは簡単ではありませんが、導入する対価はその苦労を遥かに凌ぐものと思います。この記事をきっかけに皆様のシステム開発、ひいてはシステム利用者がよりハッピーになっていただけると幸いです。

参考文献

さいごに

ホワイトプラスでは、ビジョンバリューに共感していただけるエンジニアを募集しています!
ネットクリーニングの「リネット」など「生活領域×テクノロジー」で事業を展開している会社です。
どんな会社か気になった方はオウンドメディア「ホワプラSTYLE」をぜひご覧ください。
オンラインでカジュアル面談もできますので、ぜひお気軽にお問い合わせください。