SlideShare a Scribd company logo
1 of 24
Download to read offline
Atomic Architecture
kawasima
すえなみチャンス2019夏
Atomicity
設計要素をAtomicに分解し、
よく知られた設計パターンの解説を試みる
Value
(pure)
Function
Namespace
Time
Identity
値そのもの。またはその集合。
副作用のない関数
値の集合の一意性
業務上の時間の概念
名前空間
『Simple Made Easy』Rich Hickey
Type & Values
Typeは、Valueの分類を表す。
Valueは、Typeと値の内部表現(Inner Representation)を含む。
Value
Type
Inner
Representation
42
Integer 0x2A
TypeやInner Representationを分離すると、プログ
ラマにとって意味のある塊ではなくなる。
Mutation of the Type
PHPやPerlはValueの中のTypeが書き換え可能
Value
LONG 42
PHP5系
Value
STRING “42”
$v = 42; (String)$v;
Types as Constraints
Typeだけを取り出して、Variablesに代入で
きるValueの制約として使う。
これをランタイムより前にチェックするの
が静的型付けということになる。
Variables
Value
Time
Value
Type
同じTypeを持つ
Valueしか代入
できない
『Type-Driven Development with Idris』
Disassemble
Atomicな要素を使って、設計パターンを分解する。
【注意】
オブジェクト指向が良い悪いとか、
Rails Wayが良い悪いとか、
そういう話ではなく、構造を理解するための分解で
あることに留意してください!
Object
State
Object
Value
Class
Method
Namespace
Function
Identity
Time
Field
Type
(Javaの場合)
Domain Service
The world of Eric Evans
Value Object
Value
Entity
Identity
State
Value
Time
Function
オブジェクトに種類があり、持つべき性質が異なる
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としての時刻)
時間の捉え方
Variables
Value
Time
変数はStateと同じく、時間の概念が暗黙的に内包されている。
A = {age: 20};
だったものが、いつか
A = {age: 21};
と変わってるかもしれない。
Variables
Value
Time
再代入不可のVariablesを用意す
れば、時間による変化から逃れ
られるが…
Immutable Data without Variables
Immutable Data
Value
Immutable Data
Value
変更操作
http://hypirion.com/musings/understanding-persistent-vector-pt-1
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,…}
と考える。状態変数を持たなくても、ストリームの中に状態をもつことができる。
Stream represents State
『SICP』3.5 Stream
Variable version
Stream version
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
Event Stream
FunctionはEventとしてみなせる
Event
Time
Value Stream
Value Value Value
Function
最初のValueとEvent Streamをもとに、Value Stream
を構築する手段がEvent Sourcingである
Event
Time
Function
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
Disassemble
Web Application
Functionを分類する
Encoder
Decoder
Validator
Error
Value
Data
Value
Data
Value
Data
Value
Data
Value
Data
Value
Data
Value
厳密な型から緩い型への変換
緩い型から厳密な型への変換
与えられた定義をValueの集合が満たすか判定する
Schema
Value
一緒に使われる
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
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
Wrap up
Atomic要素で、設計を見ると概念と言語・フ
レームワークとのギャップが良く理解できるよ
うになる。
Simplicity makes easy to understand.
アーキテクチャ大全 執筆中です。よろしくお願いします。
https://scrapbox.io/kawasima/アーキテクチャ大全

More Related Content

What's hot

オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
増田 亨
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
Yoji Kanno
 

What's hot (20)

強いて言えば「集約どう実装するのかな、を考える」な話
強いて言えば「集約どう実装するのかな、を考える」な話強いて言えば「集約どう実装するのかな、を考える」な話
強いて言えば「集約どう実装するのかな、を考える」な話
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
 
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかDDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
 
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
 
ソフトウェア設計における 意思決定とそのレビューの秘訣
ソフトウェア設計における 意思決定とそのレビューの秘訣ソフトウェア設計における 意思決定とそのレビューの秘訣
ソフトウェア設計における 意思決定とそのレビューの秘訣
 
システムダウンのひみつ
システムダウンのひみつシステムダウンのひみつ
システムダウンのひみつ
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
 
ハンドノート T字形ERモデル セミナー資料 (Author; S.Toriyabe SYSTEMS DESIGN Co.,Ltd. Japan)
ハンドノート T字形ERモデル セミナー資料 (Author; S.Toriyabe  SYSTEMS DESIGN Co.,Ltd. Japan) ハンドノート T字形ERモデル セミナー資料 (Author; S.Toriyabe  SYSTEMS DESIGN Co.,Ltd. Japan)
ハンドノート T字形ERモデル セミナー資料 (Author; S.Toriyabe SYSTEMS DESIGN Co.,Ltd. Japan)
 
リレーショナルな正しいデータベース設計
リレーショナルな正しいデータベース設計リレーショナルな正しいデータベース設計
リレーショナルな正しいデータベース設計
 
Are Design Patterns Dead?
Are Design Patterns Dead?Are Design Patterns Dead?
Are Design Patterns Dead?
 
イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
 
Java8でRDBMS作ったよ
Java8でRDBMS作ったよJava8でRDBMS作ったよ
Java8でRDBMS作ったよ
 
ソフトウェア設計の学び方を考える
ソフトウェア設計の学び方を考えるソフトウェア設計の学び方を考える
ソフトウェア設計の学び方を考える
 
LDA入門
LDA入門LDA入門
LDA入門
 
CVPR2018のPointCloudのCNN論文とSPLATNet
CVPR2018のPointCloudのCNN論文とSPLATNetCVPR2018のPointCloudのCNN論文とSPLATNet
CVPR2018のPointCloudのCNN論文とSPLATNet
 
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
 
ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門
 
「速」を落とさないコードレビュー
「速」を落とさないコードレビュー「速」を落とさないコードレビュー
「速」を落とさないコードレビュー
 
機械学習のためのベイズ最適化入門
機械学習のためのベイズ最適化入門機械学習のためのベイズ最適化入門
機械学習のためのベイズ最適化入門
 

More from Yoshitaka Kawashima

More from Yoshitaka Kawashima (20)

ブルックスのいう銀の弾丸とは何か?
ブルックスのいう銀の弾丸とは何か?ブルックスのいう銀の弾丸とは何か?
ブルックスのいう銀の弾丸とは何か?
 
ソフトウェアにおける 複雑さとは何なのか?
ソフトウェアにおける 複雑さとは何なのか?ソフトウェアにおける 複雑さとは何なのか?
ソフトウェアにおける 複雑さとは何なのか?
 
ソフトウェア開発における『知の高速道路』
ソフトウェア開発における『知の高速道路』ソフトウェア開発における『知の高速道路』
ソフトウェア開発における『知の高速道路』
 
本番障害に至る病
本番障害に至る病本番障害に至る病
本番障害に至る病
 
Mavenの真実とウソ
Mavenの真実とウソMavenの真実とウソ
Mavenの真実とウソ
 
アンチフラジャイルの世界
アンチフラジャイルの世界アンチフラジャイルの世界
アンチフラジャイルの世界
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
 
ウォーターフォールとアジャイルのフェアな比較
ウォーターフォールとアジャイルのフェアな比較ウォーターフォールとアジャイルのフェアな比較
ウォーターフォールとアジャイルのフェアな比較
 
How to find tech books
How to find tech booksHow to find tech books
How to find tech books
 
Antifragile Java - Java Day Tokyo 2017 D1-E1
Antifragile Java - Java Day Tokyo 2017 D1-E1Antifragile Java - Java Day Tokyo 2017 D1-E1
Antifragile Java - Java Day Tokyo 2017 D1-E1
 
たとえ日本人同士でも必要な異文化理解力
たとえ日本人同士でも必要な異文化理解力たとえ日本人同士でも必要な異文化理解力
たとえ日本人同士でも必要な異文化理解力
 
SIerにとっての越境 @ DevLOVE 199
SIerにとっての越境 @ DevLOVE 199SIerにとっての越境 @ DevLOVE 199
SIerにとっての越境 @ DevLOVE 199
 
Antifragile Clojure
Antifragile ClojureAntifragile Clojure
Antifragile Clojure
 
Boilerplate vs Magic
Boilerplate vs MagicBoilerplate vs Magic
Boilerplate vs Magic
 
既婚プログラマの時間捻出術
既婚プログラマの時間捻出術既婚プログラマの時間捻出術
既婚プログラマの時間捻出術
 
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのかJavaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
 
マイクロフレームワークEnkan(とKotowari)ではじめるREPL駆動開発
マイクロフレームワークEnkan(とKotowari)ではじめるREPL駆動開発マイクロフレームワークEnkan(とKotowari)ではじめるREPL駆動開発
マイクロフレームワークEnkan(とKotowari)ではじめるREPL駆動開発
 
週刊Webサイトのアーキテクチャ
週刊Webサイトのアーキテクチャ週刊Webサイトのアーキテクチャ
週刊Webサイトのアーキテクチャ
 
キメるClojure
キメるClojureキメるClojure
キメるClojure
 
Seasar conference 2015 sa-compojure
Seasar conference 2015 sa-compojureSeasar conference 2015 sa-compojure
Seasar conference 2015 sa-compojure
 

Atomic Architecture