Qiita リンク
あとがき
つい先日 Qiita に記事を試しに書いてみようと思って、以前書いた実践クリーンアーキテクチャ(https://nrslib.com/clean-architecture)と似たようなイメージで実装クリーンアーキテクチャという記事を書きました。
試しに書いたところ、Qiita が結構記事を書きやすくて、結果としてこのブログの存在意義が危ぶまれることになったのですが、実装方法とか技術共有に傾いている内容は Qiita に書いて、それ以外をブログに書くというよくある(?)使い分けを試験運用してみることにしようと思った次第です。
気が変わったらまた運用方法がしれっと変わっているかもしれません。
記事を書いたら、その後書きめいたものを書きたくなるのが世の常ですが、Qiita にあとがきを長々と書くのも何か違うかなと思い、あとがきをブログに投稿するようにしてみようと思います。
一つのネタで二度おいしい、一石二鳥な運用ですね。必然として書く量は増えますが。
さて、実装クリーンアーキテクチャを書くに至った理由としては実践クリーンアーキテクチャのソースコードがボブおじさんの目指している CleanArchitecture の形になっていないというのが大きな要因でした。
実践クリーンアーキテクチャはその名の通り、クリーンアーキテクチャを Web で「実践」するというのが趣旨でした。
そのため、Uncle Bob の描いたクラス図とは異なる箇所があります(主に Presenter です)。
つまり言ってしまえば独自実装なわけです。
Web フレームワークにクリーンアーキテクチャの発想を取り入れるために現実的な妥協案として用意したのが実践クリーンアーキテクチャでした。
プロダクトに採用してみて思惑通りになっているのでよいプラクティスであるということで発表まで行いましたが、一部実装を崩しているという事実はずっと頭の隅にありました。
そんな折にふと Qiita のクリーンアーキテクチャの記事が目に触れました。
そして思いました。
「Qiita にボブおじさんのクラス構成図を再現したサンプルを投稿してみるか」
大急ぎでソースを組み上げ、一気に書くこと約8時間。
出来上がったのが「実装クリーンアーキテクチャ」です。
MVC フレームワーク用が「実践」に対して、ボブおじさんのクラス図を「実装」したものだからです。
実装クリーンアーキテクチャは以下の図を再現することをコンセプトにしています。
記事中でも言及していますが、この図は完璧なクラス構成図です。
ちなみに再現した図はこちらです。
なかなか(図の)再現度が高いのではないでしょうか。
クリーンアーキテクチャの書籍を読むといわゆる原則の類に終始する書籍のように思えますが、後半はこの図を元に説明しています。
この図をよく見てみると UML の汎化の矢印や interface を示す <I> が記述されており、クラスの関係性が読み取れます。
であればそれに沿った実装も可能であり、実装を見ることでクリーンアーキテクチャで達成したい事柄が見えてくるのではないでしょうか。
クリーンアーキテクチャはそのままでは上手くあなたのプロダクトに採用することはできないかもしれません。
でもそのコンセプトを理解し、正しい実装を知っていれば、プロダクトと共存させる方法を考えることができるのです。
クリーンアーキテクチャは残念ながら銀の弾丸ではありません。
少なくとも私にとっては違いました。
クリーンアーキテクチャを採用して威力を発揮するのはビジネスロジックとプレゼンテーション層やインフラストラクチャ層が存在するような場合です。
例えばゲームを例にしてみて、その全てにクリーンアーキテクチャを採用してみるのをイメージしてみましょう。
「ゲームのキャラクターが攻撃を行うときに IAttackUseCase 経由で AttackInteractor を呼び出して」……まどろっこしくオーバーヘッドも馬鹿になりません。
ゲームで採用するのならば、「戦闘の結果を保存する」といったときに利用するとよいでしょう。
保存というインフラストラクチャ層が関わる処理はとても相性がいいです。
中々発生しない状況だと思いますが、最初はコンシューマ向けに作っていたけど、やっぱりソシャゲになりました、といった変更(ハード保存からサーバ保存へ変更)にも対応しやすいです。
抽象化のテクニックをひとしきり利用するアーキテクチャなので理解するのが最初は難しいと思います。
それの助けをすべく、ひたすら「実装」をベースに解説しようとしたのがこの記事でした。
あとがきなのかよくわからない内容になってきましたが、少しでも何かの役に立てばよいなぁと思った次第です。