アルパカログ

Webエンジニア兼マネージャーがプログラミングやマネジメント、読んだ本のまとめを中心に書いてます。

勉強会「実践クリーンアーキテクチャ」参加レポート

5連休初日に開催されたオンライン勉強会「実践クリーンアーキテクチャ」に参加しました。

nrs-seminar.connpass.com

私は最近仕事でクリーンアーキテクチャを採用したプロジェクトに関わるようになったのですが、いろいろ調べてみても概念的な話が多くいまいちピンと来ていませんでした。

そんなときこちらの勉強会をTwitterで見かけて、まさに渡りに船とばかりに参加ボタンを即押ししました。

勉強会の内容は動画とは別に、講師である @nrslib さんのブログに完璧にまとまっていますので、そちらもご覧ください。

nrslib.com

このエントリでは、個人的に勉強になったポイントをまとめます。

勉強会の動画

クリーンアーキテクチャとは

クリーンアーキテクチャを学ぶ前に、ヘキサゴナルアーキテクチャを学ぶと理解しやすくなります。

ビジネス(アプリケーション)を中心に見立て、それ以外を交換可能なものとする」これがヘキサゴナルアーキテクチャの考え方です。

そして、ヘキサゴナルで外側にあたる部分に対し、具体的な実装について言及したのがクリーンアーキテクチャです。

クリーンアーキテクチャと言えば、よく同心円の図に注目されますが、実は右下のUML図が重要で、クリーンアーキテクチャの実装例を表しています。

f:id:otoyo0122:20200503100314j:plain

さらに詳細な Robert.C.Martin の図があります。Robert.C.Martin はかの有名なSOLID原則の提唱者です。SOLID原則を忘れてしまった人は復習しておきましょうね。

f:id:otoyo0122:20200503100232j:plain

この図の左上にはControllerがあります。Controllerと言えばMVCにもありますね。

でもControllerっていったい何でしょうか?

この疑問に対する @nrslib さんの説明はとてもわかりやすいです(動画の42:25~付近)。

説明を要約すると次のようになります。

Controllerがやっていることは入力の変換です。テレビゲームのコントローラーをイメージしてください。

Bボタンを押したという事実はコントローラーで電気信号に変換され、コンピュータに入力されます。

ユースケースとは何か?

クリーンアーキテクチャの各レイヤの中で、個人的に一番理解に苦しんだ(何を書けば良いかわからなかった)のがユースケース(Application Business Rules)でした。

アプリケーションの目的であるドメインにおける問題を解決するため、ドメインオブジェクトを束ねあげユースケースを実現する

難しいですね。

しかし、説明を聞くとなんとなくイメージできるようになりました(動画では30:10~付近)。

(ECサービスを例とすると)「注文」や「受注」はビジネスのオブジェクト(ドメインオブジェクト)であり、買い物かごはビジネスを実現する(applyする)ためのオブジェクトである。

この買い物かごこそが、ビジネスを実現するためのビジネスにはなかった概念でユースケースにあたります。

クリーンアーキテクチャは何が嬉しいのか?

クリーンアーキテクチャを使うメリットは、ビジネスが技術の詳細に依存しなくなるということです。

技術の詳細とは、例えばAPIやDBなどがそれで「詳細なコード」や「ギークなコード」と呼ばれます。

「ビジネスが技術の詳細に依存しない」とは、例えばAPIがまだ開発されていなくてもビジネス部分を先行開発できるし、APIをモックに差し替えることもできるというように、ビジネス以外の各レイヤ、各モジュールがプラガブルであるということを意味しています。

なんだかSOLID原則のL(リスコフの置換原則)を彷彿とさせますね。

例えばよくあるアプリケーションでは、DBがMySQLからOracleDBに変わったら、その変更はビジネスまで波及してしまいます(ORMを使っていると設定変更だけで済むかもしれないけれど、SQLベタ書きの場合)。

ここで抽象・詳細とは、ビジネスのように人間に近いほど抽象、DBのように機械に近いほど詳細と考えるとわかりやすいです(動画1:26:00~付近)。

DBの変更がビジネスまで波及しないようにするためには、依存関係逆転の法則(SOLID原則のD)を用いて、詳細が抽象に依存するようにします。

そのためにクリーンアーキテクチャではインターフェースを使っています。これによってDBがビジネスに依存するようになり、ビジネス(抽象)を中心にロジックを組み立てることができるようになるというわけです。

余談

@nrslib さんもお話されてましたが、クリーンアーキテクチャを難しく感じる理由の一つとして「クラスやファイルが多くどこに何を書けば良いかわからない」というのがあります。

しかし、たくさんのファイルやフォルダも、何がどこに置かれているかを理解していれば「整頓されていてわかりやすい」と感じます。

私がまさにそうでしたが、それまでなんとなくMVCを使っていて、急にクリーンアーキテクチャを使うことになった人にとって、なんとなくでクリーンアーキテクチャを理解するのは至難の業です。

昨今、勉強会がオンラインで開催されるようになり、家から気軽に参加できるようになったのはありがたいことです。

今までなんとなくで使っていた技術について、これを機会にしっかり学んでみるのも良いでしょう。

以上です。

このエントリでは、個人的に勉強になったポイントをまとめました。