最近、Clean Architectureを勉強しようと図書館で借りて読んで見ました。
メモを取りながらだったのですが、blogなどのネットの情報と比較してみると違和感を感じました。
私のClean Architectureの理解は下記の通りです。
Clean Architectureの主眼は依存性の問題の解決だと思っています。大事なロジックやデータを外部のDBやUIの変更から守るのかだと考えています。
あの4重丸はそのベストプラクティスのような位置づけだと思っています。しかし、様々なブログで書かれるClean Architectureはあの4重丸を前提に書かれています。4重丸を前提に書かれるのではなく、実際に記事にするのであれば設計や実装で発生した依存性の問題をどう解決したのかが見たいのですが、あの4重丸をどう実装したのかの話ばかりな気がします。
私の懐具合もあり、正直なところ図書館で借りてメモした内容を前提で書きますが、理解不足についてご指摘頂ければと思います。
要点:
Clean Architectureは作り方の指針である。
主な視点は依存性の問題。何が何に依存するかによって変更や修正によって発生する影響を最低限に留め、変更に強く拡張しやすいシステムを作るのが目的である。(メリットとしては開発の序盤での決定事項を先送りにし、理想の形が具体的に見えたところでの仕様決定しても問題ないようにするなど)
上記の補足として
- 依存性の問題は依存元の変更により依存している側に変更が発生することである。
- 重要なものは変更すべきではない。むしろ、変更依存元になるべき。フレームワークや言語などはバージョンアップなどの変更が常に発生する可能性があるので依存は低いほうが望ましい。それらは依存関係のチェーンの元から遠いところにあるべき(フレームワークなどのバージョンアップなどにより重要なものに変更が入るのを防ぐ)
- ドメイン(そのプログラムが担当する部分)以外からデータをやり取りをするときは依存先が定義したインターフェイス(データの型のみ。実装は何もしない)で行う。これはドメインの依存性を最低限に抑えるため。
以下、上記の補足事項
色んなブログでClean Architectureを実装してみた系の記事ではClean Architectureをあの4重丸を主眼においており、「重厚なものである」と書かれています。
私の理解はClean Architectureは「何が何に依存することで良い設計になるか」なので別に不要なら層を飛ばしてしまえば良いと思っています(そういうパターンはあまり見当たりませんが)。
ついでにいうと、あの4重丸のうちフレームワークを使ってもいいのは外から2番目の丸までだと思っています。Entitiesは会社の重要データのルールなので、フレームワークに依存してはいけないでしょうし、ユースケースもセッションの保持もフレームワークに依存してはいけないでしょう。
一方で、システムによってはEntitiesがないものもあるでしょう(ツール類など(メール送信システムやデータを参照するだけのシステムとか))。
あの4重丸の図を前提に無理矢理作ってしまうと、このシステムのEntitiesってなに?となると思います。
また複数画面ある場合もあの4重丸を通らなければならないのかという疑問にもなると思います。
あの図は
- システムにはUseCase(アプリケーション)があり、それがベースだが、それ以上にそれは会社のデータのルールに従う必要があること(Entities)
- デバイスやUIなどではデータなどがユースケースの実行に達しない場合があり、それはコントローラーで吸収する
- 画面もあるデータはプレゼンターで定義するが、どう表示するかはUIで作成する。そのときはフレームワークを使っても良い
示しているという考えです。ついでに言うと
- DBとUIが離れているので一度中を通らなければいけないと考えてしまうが、自分の中で完結しているならばコントローラー内だけで一時的にデータを貯めるのはOK。事実、MVCもInterfaceに含まれると書いてある)
- UseCaseの中でトランザクションを切るとしても、それはインターフェースを通してであり、UseCase自体は何のフレームワークを使っているかは知るべきではない
- 永続化などを行うときはAbstract Factoryのような依存関係の逆転を使い、制御の流れとは違う構造になるようにしてDBにUseCaseが依存しないようにする
を示している図だと思っています。
まとまっている感じはないかもしれませんが以上が私の理解です。
とにかく、Clean Architectureは依存性の問題であること。
あの図から言えるのは、依存すべき先はUseCase(そしてEntities)である。
が私の考えです。わざわざ、Entitiesにならないようなものにまで無理くりEntitiesにしなくてもよいと思います。そのときはUseCaseが輪の中心にくるのだと思います(UseCaseのないソフトはありえないと思っているので)
そして言語やフレームワーク、DBなどのミドルウェアはできるだけ円の外側(依存する側)にすることだと考えます。
私は原理主義者ではありません。ただ、私の理解と多くのブログに書かれている内容に差異を感じています。
間違いがあればご指摘ください。
PS1a. これを書きながらSIer論の事もふと深まりました。私の述べるClean Architectureならば、ビジネスロジックに従って製品のカスタマイズ中心のSIもClean Architectureなのではないのかなぁと
PS2. タグは適当です。アーキテクチャなどはなかったので・・・
回答2件
あなたの回答
tips
プレビュー