イベント:https://rakus.connpass.com/event/233514/
ブログ:https://nainaistar.hatenablog.com/ Twitter:https://twitter.com/nainaistar
私が好きなアーキテクチャ(ポートアンドアダプター)を紹介する設計 モデリング LT会 - vol.3 #modelingltきり丸(水上 皓登)@nainaistar
View Slide
名前:きり丸(水上 皓登)twitter:nainaistarGitHub:hirotoKirimaruブログ:きり丸の技術日記https://nainaistar.hatenablog.com/2アーキテクチャを考えるのは非常に楽しい
エンジニアの仕事は概念に名前を付けること
特化していれば特化しているほど良い
ただし、他システムから得られるモデルは他システムのモデル
他システムモデルは流用せずに自分のモデルに変換しよう
そこから派生して…
システム連携間に限らずアプリの内部と外部と意識すると良い設計になるのでは?
それを意識したアーキテクチャがポートアンドアダプター
今日のゴール
アーキテクチャのポートアンドアダプターを知って「内側」と「外側」の概念を知って実践する
ポートアンドアダプター(ヘキサゴナルアーキテクチャ)
私がアーキテクチャで意識していること● アプリケーションの「内側」と「外側」の区別をつける● 「外側」の知識を「内側」に侵入させない● 「内側」の知識を「外側」に流出させない
アプリケーションの「内側」と「外側」の区別をつける
アプリケーションの「内側」と「外側」の区別をつける● 内側○ アプリケーションのビジネスロジック● 外側○ アプリケーションで完結できない、実行時例外が発生しやすいロジック○ HTTPを受信するController、DBと接続するRepository、他システムとRESTやSOAPで連携、ファイル操作
ちょっと脱線
ガチのFIzzBuzz1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」と、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。
ガチのFIzzBuzz 緑:内部 赤:外部1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」と、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。
「外側」の知識を「内側」に侵入させない
「外側」の知識を「内側」に侵入させない例えば:Aシステムでは運転免許証を「001」と定義していて、Bシステムでは運転免許証を「AAA」と定義している。=> ドメインで001とAAAは運転免許証として扱う?=> 「外側」から「内側」には翻訳してから扱う。・Aシステムの値は001をBに翻訳する・Bシステムの値はAAAをBに翻訳する
「外側」の知識を「内側」に侵入させない腐敗防止層という仕組みでガードしやすくなる
「内側」の知識を「外側」に流出させない
「内側」の知識を「外側」に流出させない:メールシステムメールを送るシステムにデータ連携をする場合、メールのデータ作成ロジックはどこに持つべきでしょうか。● 内側● アダプターのメールシステム
「内側」の知識を「外側」に流出させない:メールシステム● 内側● アダプターのメールシステム「内側」で作成するべきです。メール文面、誰に送るかといった情報は「外側」に流出させるべきではありません。「内側」でデータを作成し、「外側」は「内側」から受け取ったデータをメールシステムに連携できるように加工すると良いでしょう。
「内側」の知識を「外側」に流出させない:クエリパラメータ特定のクエリパラメータが存在しないとき、デフォルト値で検索するシステムがあったとします。その場合、デフォルト値で補完するロジックは次のどこに入れるべきでしょうか。● アダプターのController● 内側● アダプターのRepository
「内側」の知識を「外側」に流出させない:クエリパラメータ● アダプターのController● 内側● アダプターのRepositoryこちらは判断が分かれます。「内側」と言いたいところですが、API仕様書にデフォルト値で補完する旨を書いているのであれば、そのロジックは「外側」の持ち物なのでアダプターのControllerで行っても良いでしょう
終わりにアーキテクチャに正解はありません。しかし、同一の理解をしておくことで、どこにロジックを入れるべきかを話し合うことができます。心理的安全性を確保して、知的コンバットでより良くしていきたいですね。
「内側」と「外側」を意識したポートアンドアダプターを考えるとロジックの存在するべき箇所が見えやすくなってくるのでいかがでしょうか
Appendix
ブログ私が好きなアーキテクチャ(ポートアンドアダプター)を説明する
ブログ腐敗防止層を意識して綺麗なドメインを保ちたい
以降はスキップ設定あり
話すこと / 話さないこと● ●話すこと 話さないこと
対象者 / 非対象者● ●対象者 非対象者
登壇を見た人への期待するアクション●アクション