突撃!!隣のアーキテクチャに行ってきた #totsugekita

突撃!!隣のアーキテクチャに行ってきました。簡単に所感をまとめます。

totsugeki-architecture.connpass.com

所感

ちょっと予習不足なところもあって若干理解できてないところもありましたが、他のひとがどのようなことを考えてアーキテクチャ設計しているのかを聴けてとても勉強になりました。わりとリアルな現場の話が聴けてよかったです。

ユビキタス言語がブレた場合、どういう過程を経てコードまで落とし込むんだろうか。アジャイル的に細かいサイクルで変更を取り込んでいく感じなのかな。

あと、自分の周りではわりと機能単位でパッケージを切ってるケースが多い印象だけど、レイヤごとにパッケージを切るのがよさそう。たぶん、これが Clean Architecture というものだと思われる。要勉強。

以下、メモから抜粋。

SUGARのアーキテクチャ - SUGAR

  • イメージは Clean Architecture
    • View > Adapter > Application > Domain
    • 内側のものだけ利用できる
    • Infrastructure は他から利用されるもの
  • 同じ存在でもサーバー/クライアントで呼び方が違うことがある☆
  • Application
    • 必要な Domain 層の実装を組み合わせて意味のある単位にまとめる役割
    • DI された Domain 層の実装を組み合わせて何かしら意味のある処理にする実装を置く
  • Adapter
    • Domain 層の実装を置く
    • json の相互変換はここでやる
  • View
    • Entity や VO をそのまま json にして返すことは少ない
    • APIごとに必要なものだけ詰め替える

CQRS+ES(再)入門 - Chatwork

  • Chatwork のバックエンドは CQRS+ES
  • 伝統的なアプローチ
  • データ指向からコマンド指向に
    • クライアントからコマンドを送信する
    • コマンドによって意図が明白なIFを作る
    • 命令の文脈を表したコマンドをモデルとする☆
  • コマンドとクエリの要件は違う☆
  • クエリサイド
    • クライアントが表示するために必要なDTOを返す
    • ドメインオブジェクトが不要 (DTOへの変換が不要)
    • SQLを発行するDAOを使う
  • コマンドサイド
    • ドメインオブジェクトは内部状態を外部に晒す必要がない
    • コマンドの処理以外に必要なクエリメソッドは持たない
  • ドメインイベント (コマンドとクエリの結合)
    • 過去に発生したできごと
    • イベントがわかればコマンドがわかる
  • Event Sourcing
    • イベントはイミュータブルな歴史を表す
    • ドメインイベントの追加はロック不要
    • パーティショニング (集約IDで書き込みを分散できる)
    • イベント列から最新の状態を得る
  • イベント列が大量にある場合は時間がかかる
    • スナップショットを持たせる

AbemaTV iOS Architecture - AbemaTV

  • Presentation Domain Separation
  • MVVM + Flux
    • Flux は Store が大量のロジックを持ちがち
  • ViewModel
    • グローバルで状態を持つ必要がない場合は ViewModel を使う
    • Flux を小さくする方針
    • ライフライクルが明確で管理がラク (View のライフサイクルに依存する)
    • メッセージングがリレーだらけになる
  • Unio☆
    • 自由度が高く実装がバラバラになりがちな ViewModel を矯正する

Mirrativ Androidアプリの取り組み

  • ユビキタス言語がブレる
    • 開発当初から呼び方が変わる
  • Android Architecture Components
  • パッケージ構造
    • 機能単位からレイヤー単位に
    • 将来的には機能ごとにサブモジュール化する

DIライブラリ Airframeを使ってみた

GoでのAPI開発現場のアーキテクチャ実装事例

  • Layeredish Architecture☆
  • パッケージ構成☆
  • Domain に repository のインタフェースを置く
  • Infrastructure に repository インタフェースの実装を置く
    • 技術的実装☆
  • Application は制御の役割を担う
  • 各レイヤのインタフェースを実装したテストダブルを作成して使う

ElmでSPA State設計

  • ドメインごとに Store (状態) を持たないようにした
    • ページごとに (URLごとに) 状態を持たせる
  • 共通ロジックがビジネスロジックを指すなら状態管理とは切り離した方がよい?☆
  • Elm は状態の構造やフローが宣言的に書ける