Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Atomic Architecture

12,773 views

Published on

すえなみチャンス暑気払い 2019夏で話した、設計要素を分解して理解してみようという話です。
Simplicity makes easy to understand.

Published in: Software
  • Be the first to comment

Atomic Architecture

  1. 1. Atomic Architecture kawasima すえなみチャンス2019夏
  2. 2. Atomicity
  3. 3. 設計要素をAtomicに分解し、 よく知られた設計パターンの解説を試みる Value (pure) Function Namespace Time Identity 値そのもの。またはその集合。 副作用のない関数 値の集合の一意性 業務上の時間の概念 名前空間 『Simple Made Easy』Rich Hickey
  4. 4. Type & Values Typeは、Valueの分類を表す。 Valueは、Typeと値の内部表現(Inner Representation)を含む。 Value Type Inner Representation 42 Integer 0x2A TypeやInner Representationを分離すると、プログ ラマにとって意味のある塊ではなくなる。
  5. 5. Mutation of the Type PHPやPerlはValueの中のTypeが書き換え可能 Value LONG 42 PHP5系 Value STRING “42” $v = 42; (String)$v;
  6. 6. Types as Constraints Typeだけを取り出して、Variablesに代入で きるValueの制約として使う。 これをランタイムより前にチェックするの が静的型付けということになる。 Variables Value Time Value Type 同じTypeを持つ Valueしか代入 できない 『Type-Driven Development with Idris』
  7. 7. Disassemble
  8. 8. Atomicな要素を使って、設計パターンを分解する。 【注意】 オブジェクト指向が良い悪いとか、 Rails Wayが良い悪いとか、 そういう話ではなく、構造を理解するための分解で あることに留意してください!
  9. 9. Object State Object Value Class Method Namespace Function Identity Time Field Type (Javaの場合)
  10. 10. Domain Service The world of Eric Evans Value Object Value Entity Identity State Value Time Function オブジェクトに種類があり、持つべき性質が異なる
  11. 11. Entityも2種類存在する コト (Event) システム化対象領域で本業(生業)として繰り返しなされる行為 ● システムはコト(Event)をデータとして逐一『記録』していく モノ (Resource) ある【期間】存在し、コトに直接・間接投入される資源 ● モノは、ある【期間】一定の属性値を持ちながら状態遷移していく。 ● 【時点】を指定することにより、そのときのモノの属性値を得る。 https://speakerdeck.com/rtechkouhou/ye-wu-sisutemugou-zhu-niokerudetamoderingu?slide=20 Resource Entity Identity State Value Time Event Entity Identity Value Value (Valueとしての時刻)
  12. 12. 時間の捉え方 Variables Value Time 変数はStateと同じく、時間の概念が暗黙的に内包されている。 A = {age: 20}; だったものが、いつか A = {age: 21}; と変わってるかもしれない。 Variables Value Time 再代入不可のVariablesを用意す れば、時間による変化から逃れ られるが…
  13. 13. Immutable Data without Variables Immutable Data Value Immutable Data Value 変更操作 http://hypirion.com/musings/understanding-persistent-vector-pt-1
  14. 14. Stream 時間を離散ステップとして測れれば、時間関数は列としてモデル化できる。 Time Stream T1 Value Stream V1 V2 V3 『SICP』3.5 Stream T2 T3 あるときはA=V1, あるときはA=V2, あるときはA=V3ではなく、 A(T) = V T={t|t1, t2, t3,…} V={v|v1, v2, v3,…} と考える。状態変数を持たなくても、ストリームの中に状態をもつことができる。
  15. 15. Stream represents State 『SICP』3.5 Stream Variable version Stream version
  16. 16. Epochal Time Model 『Are we there yet?』Rich Hickey (2009) Identity Process Event (pure) Function (pure) Function State(t1) Value State(t2) Value State(t3) Value
  17. 17. Event Stream FunctionはEventとしてみなせる Event Time Value Stream Value Value Value Function 最初のValueとEvent Streamをもとに、Value Stream を構築する手段がEvent Sourcingである Event Time Function
  18. 18. User Profile Example: Change Profile <<Function>> 住所変更 Name = kawasima Address = 浅草橋 User Profile Name = kawasima Address = 荻窪 <<Function>> 退職 Company = T社Company = T社 User Profile Name = kawasima Address = 荻窪 Company = Nothing
  19. 19. Disassemble Web Application
  20. 20. Functionを分類する Encoder Decoder Validator Error Value Data Value Data Value Data Value Data Value Data Value Data Value 厳密な型から緩い型への変換 緩い型から厳密な型への変換 与えられた定義をValueの集合が満たすか判定する Schema Value 一緒に使われる
  21. 21. Presentation Layer Business Logic Layer Persistence Layer Layered Architecture UI Boundary Value Business Object Value Type Entity Value Identity Renderer Encoder SQL Decoder Decoder ResultSet Value Identity Validator Encoder HTML Value Decoder JSON Value
  22. 22. Rails Way Presentation Layer ActiveRecord UI Boundary Value Entity Value Identity Renderer Encoder SQL Decoder ResultSet Value Identity Validator Encoder HTML Value Decoder JSON Value
  23. 23. Wrap up Atomic要素で、設計を見ると概念と言語・フ レームワークとのギャップが良く理解できるよ うになる。 Simplicity makes easy to understand.
  24. 24. アーキテクチャ大全 執筆中です。よろしくお願いします。 https://scrapbox.io/kawasima/アーキテクチャ大全

×