ひよっこゲームブログ

なにもかも初心者のひよっこがゆったりと何かする

CleanArchitectureの話

記事を書くのに間が空き過ぎてしまった・・・
最近天則に復帰したりVLORANTが楽しかったりで忙しいです
転職したいならその時間を勉強にあてろ


CleanArchitectureの勉強はぶっちゃけ手間取りました
DDDもかじりながらボブおじのブログを読んだので・・・
あと原文をそのまま理解しようとするのは難易度が高い
そもそもCleanArchitecture自体がちょっと難しい・・・(個人差があります)


正直なところ記事にするけど内容の正確性に自信がない
まさかり募集


blog.cleancoder.com


CleanArchitectureを一言でまとめると
「抽象度でレイヤー分けして、依存性を排除したアーキテクチャ

具体的なモノ(抽象度が低いもの = UI, DB, etc...)は変更されやすいので
そこは一番いじりやすくしようぜ!みたいなニュアンスだと思ってます

ここからは和訳もかねて書いてく


みんな大好きなあの図。ボブおじのブログから引用

f:id:denden_kata:20200607222818j:plain


様々なアーキテクチャがあるが基本的に目的は同じであり
「ソフトウェアを機能ごとにレイヤー分けすることで関心の分離を行う」ことにある

  1. フレームワークに依存しない
    制限された状態でシステムに機能を落とし込む必要性が無くなる

  2. テスト可能
    外部に依存しないのでテストができる

  3. UIに依存しない

  4. DBに依存しない

  5. 外部から独立している。ビジネスルールは外部の状態を知らなくても良い

依存関係のルール

外側から内側に向けて依存する
内側はが外側の状態を知らなくても良い


エンティティ

不変なビジネスルールを記述
サービスの基幹部分(単一のアプリケーションであれば、アプリの仕様になる)
要はこれがなきゃサービスにならないレベルのもの(=ドメインオブジェクト )

ex.) twitterであれば「ユーザー」や「ツイート機能」などに当たる

外部の変更があった場合でも、変更される可能性が最も低い


ユースケース

エンティティに記述しないようなビジネスルールはこっちに記述する
ソフトウェアの仕様変更の影響を受ける

このレイヤーはエンティティへ影響を与えることは想定していない(無関心)
エンティティとのデータフローを調整
ユースケースの目的を達成できるようにエンティティへ指示する


インターフェースアダプター

エンティティやユースケースのデータを、DBなどで使える形に変換する
エンティティとユースケースはDBについては知らなくて良い

ようはぶっちゃけViewMode強化版みたいなとこ


フレームワークとドライバ

DB・UI・Webのフレームワーク
変更の多いところはここ


図について

あくまで例として4つのレイヤーにしただけで、増えることもある
仮に増えても依存性は外側から内側へなのは変わらない
内側へ向かうとソフトウェアはより抽象的になる


レイヤーの境界を超える

右下の図について説明

ユースケースと通信するコントローラーとプレゼンター
コントローラで始まりユースケースを内でデータを操作、プレゼンターで実行

普通は「依存性逆転の法則」を利用するんだとかなんだとか

直にやりとりすると依存性が高いので×


境界を超えるデータ

境界を越えてデータを渡す場合
常に内側の円に最も便利な形式で渡す
内側の円は外側の状態を意識しなくて良い!


個人的な感想

実装の仕方やモノによって、様々なデータの流れがあって複雑になりそう

抽象度が高い部分で、ロジックをどこに書くかというのが曖昧になりそう
別途ルールを作らないと、人によって書き方がバラバラになりそうかなー・・・?

ちょっとまだ理解がふわふわしてる

UIが一番上で、DBが一番下なアーキテクチャに馴染みがあるので理解するのに時間がかかった