Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
EN
Uploaded by
Yoshitaka Kawashima
PDF, PPTX
3,147 views
Grokking Simplicity探訪
2024/6/5のアーキ部で話したスライドです。 Stratified Designの目的を中心に、そのメリットを考えてみます。
Software
◦
Read more
2
Save
Share
Embed
Embed presentation
Download
Download as PDF, PPTX
1
/ 50
2
/ 50
3
/ 50
4
/ 50
5
/ 50
6
/ 50
7
/ 50
8
/ 50
9
/ 50
10
/ 50
11
/ 50
12
/ 50
13
/ 50
14
/ 50
15
/ 50
16
/ 50
17
/ 50
18
/ 50
19
/ 50
20
/ 50
21
/ 50
22
/ 50
Most read
23
/ 50
24
/ 50
25
/ 50
26
/ 50
27
/ 50
28
/ 50
29
/ 50
30
/ 50
31
/ 50
32
/ 50
33
/ 50
34
/ 50
35
/ 50
36
/ 50
37
/ 50
38
/ 50
39
/ 50
40
/ 50
41
/ 50
42
/ 50
43
/ 50
44
/ 50
45
/ 50
46
/ 50
47
/ 50
48
/ 50
49
/ 50
Most read
50
/ 50
Most read
More Related Content
PDF
テスト文字列に「うんこ」と入れるな
by
Kentaro Matsui
PDF
強いて言えば「集約どう実装するのかな、を考える」な話
by
Yoshitaka Kawashima
PDF
オブジェクト指向プログラミングの現在・過去・未来
by
増田 亨
PDF
正しいものを正しく作る塾-設計コース
by
増田 亨
PDF
プログラミングコンテストでの動的計画法
by
Takuya Akiba
PDF
型安全性入門
by
Akinori Abe
PDF
イミュータブルデータモデルの極意
by
Yoshitaka Kawashima
PDF
イミュータブルデータモデル(世代編)
by
Yoshitaka Kawashima
テスト文字列に「うんこ」と入れるな
by
Kentaro Matsui
強いて言えば「集約どう実装するのかな、を考える」な話
by
Yoshitaka Kawashima
オブジェクト指向プログラミングの現在・過去・未来
by
増田 亨
正しいものを正しく作る塾-設計コース
by
増田 亨
プログラミングコンテストでの動的計画法
by
Takuya Akiba
型安全性入門
by
Akinori Abe
イミュータブルデータモデルの極意
by
Yoshitaka Kawashima
イミュータブルデータモデル(世代編)
by
Yoshitaka Kawashima
What's hot
PDF
それはYAGNIか? それとも思考停止か?
by
Yoshitaka Kawashima
PDF
Tackling Complexity
by
Yoshitaka Kawashima
PDF
Pythonによる黒魔術入門
by
大樹 小倉
PDF
なぜデータモデリングが重要なのか?
by
Yoshitaka Kawashima
PDF
時系列分析による異常検知入門
by
Yohei Sato
PDF
MySQLで論理削除と正しく付き合う方法
by
yoku0825
PDF
ドメイン駆動設計 本格入門
by
増田 亨
PPTX
データモデリング・テクニック
by
Hidekatsu Izuno
PDF
ドメイン駆動設計のための Spring の上手な使い方
by
増田 亨
PDF
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
by
Mikiya Okuno
PPTX
関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門
by
Tadahiro Ishisaka
PDF
勉強か?趣味か?人生か?―プログラミングコンテストとは
by
Takuya Akiba
KEY
やはりお前らのMVCは間違っている
by
Koichi Tanaka
PPTX
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
by
Hiroshi Ito
PDF
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
by
Takahiro Inoue
PDF
Rdraモデリングをしよう
by
Zenji Kanzaki
PDF
PostgreSQLアンチパターン
by
Soudai Sone
PDF
[Dl輪読会]dl hacks輪読
by
Deep Learning JP
PDF
イミュータブルデータモデル(入門編)
by
Yoshitaka Kawashima
PPTX
世界一わかりやすいClean Architecture
by
Atsushi Nakamura
それはYAGNIか? それとも思考停止か?
by
Yoshitaka Kawashima
Tackling Complexity
by
Yoshitaka Kawashima
Pythonによる黒魔術入門
by
大樹 小倉
なぜデータモデリングが重要なのか?
by
Yoshitaka Kawashima
時系列分析による異常検知入門
by
Yohei Sato
MySQLで論理削除と正しく付き合う方法
by
yoku0825
ドメイン駆動設計 本格入門
by
増田 亨
データモデリング・テクニック
by
Hidekatsu Izuno
ドメイン駆動設計のための Spring の上手な使い方
by
増田 亨
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
by
Mikiya Okuno
関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門
by
Tadahiro Ishisaka
勉強か?趣味か?人生か?―プログラミングコンテストとは
by
Takuya Akiba
やはりお前らのMVCは間違っている
by
Koichi Tanaka
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
by
Hiroshi Ito
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
by
Takahiro Inoue
Rdraモデリングをしよう
by
Zenji Kanzaki
PostgreSQLアンチパターン
by
Soudai Sone
[Dl輪読会]dl hacks輪読
by
Deep Learning JP
イミュータブルデータモデル(入門編)
by
Yoshitaka Kawashima
世界一わかりやすいClean Architecture
by
Atsushi Nakamura
More from Yoshitaka Kawashima
PDF
ブルックスのいう銀の弾丸とは何か?
by
Yoshitaka Kawashima
PDF
Are Design Patterns Dead?
by
Yoshitaka Kawashima
PDF
ソフトウェアにおける 複雑さとは何なのか?
by
Yoshitaka Kawashima
PDF
ソフトウェア開発における『知の高速道路』
by
Yoshitaka Kawashima
PDF
ソフトウェア設計における 意思決定とそのレビューの秘訣
by
Yoshitaka Kawashima
PDF
本番障害に至る病
by
Yoshitaka Kawashima
PDF
システムダウンのひみつ
by
Yoshitaka Kawashima
PDF
Mavenの真実とウソ
by
Yoshitaka Kawashima
PDF
アンチフラジャイルの世界
by
Yoshitaka Kawashima
PDF
Atomic Architecture
by
Yoshitaka Kawashima
PDF
思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 Fall
by
Yoshitaka Kawashima
PDF
ウォーターフォールとアジャイルのフェアな比較
by
Yoshitaka Kawashima
PDF
How to find tech books
by
Yoshitaka Kawashima
PDF
Antifragile Java - Java Day Tokyo 2017 D1-E1
by
Yoshitaka Kawashima
PDF
たとえ日本人同士でも必要な異文化理解力
by
Yoshitaka Kawashima
PDF
SIerにとっての越境 @ DevLOVE 199
by
Yoshitaka Kawashima
PDF
Antifragile Clojure
by
Yoshitaka Kawashima
PDF
Boilerplate vs Magic
by
Yoshitaka Kawashima
PDF
既婚プログラマの時間捻出術
by
Yoshitaka Kawashima
PDF
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
by
Yoshitaka Kawashima
ブルックスのいう銀の弾丸とは何か?
by
Yoshitaka Kawashima
Are Design Patterns Dead?
by
Yoshitaka Kawashima
ソフトウェアにおける 複雑さとは何なのか?
by
Yoshitaka Kawashima
ソフトウェア開発における『知の高速道路』
by
Yoshitaka Kawashima
ソフトウェア設計における 意思決定とそのレビューの秘訣
by
Yoshitaka Kawashima
本番障害に至る病
by
Yoshitaka Kawashima
システムダウンのひみつ
by
Yoshitaka Kawashima
Mavenの真実とウソ
by
Yoshitaka Kawashima
アンチフラジャイルの世界
by
Yoshitaka Kawashima
Atomic Architecture
by
Yoshitaka Kawashima
思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 Fall
by
Yoshitaka Kawashima
ウォーターフォールとアジャイルのフェアな比較
by
Yoshitaka Kawashima
How to find tech books
by
Yoshitaka Kawashima
Antifragile Java - Java Day Tokyo 2017 D1-E1
by
Yoshitaka Kawashima
たとえ日本人同士でも必要な異文化理解力
by
Yoshitaka Kawashima
SIerにとっての越境 @ DevLOVE 199
by
Yoshitaka Kawashima
Antifragile Clojure
by
Yoshitaka Kawashima
Boilerplate vs Magic
by
Yoshitaka Kawashima
既婚プログラマの時間捻出術
by
Yoshitaka Kawashima
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
by
Yoshitaka Kawashima
Grokking Simplicity探訪
1.
Grokking Simplicity探訪 kawasima アーキ部
2.
Grokking Simplicity 2021年5月 発売 日本語未訳 他Grokkingシリーズは「なっとく!」シリーズと して続々翻訳されているが…
3.
Data, Action, Calculation 計算 アクション データ 実行結果が、何回実行するか、いつ実行するかに依存する 入力から出力を計算する イベントに関する事実 例)
メールを送る、データベースから読み込む 例) 最大値を探す、メールアドレスの妥当性を検証する 例) 最大値を探す、メールアドレスの妥当性を検証する プログラムを以下の3つに分類してみよう
4.
Calcuration 『Grokking Simplicity』の定義 入力から出力を計算する関数 ● 外の世界に影響を与えず、外の世界の影響も受けない ●
例 ○ +, *, -, / ○ Math.abs() ○ 文字列結合 ○ Eメールアドレスのバリデーション
5.
Action 『Grokking Simplicity』の定義 外の世界に影響を与える、または外の世界の影響を受ける関数 したがって純関数でないもの、または副作用のあるもの ● 例: ○
Eメールを送信する ○ データベースから読み込む ○ ファイルに書き込む ● Actionは本番環境で安全に実行するのが難しい ● Actionはデバッグするのが難しい
6.
Calculation 割合を増やしたい Calculations Calculations Actions
Actions こっちの方が安全でデバッグしやすい
7.
https://speakerdeck.com/masuda220/big-ball-of-mud このあたりの話は、増田さんのスライドでも書かれているので、 ぜひご覧になってください。
8.
Action 波及ルール Eric Normand『Stratified
design and functional architecture』より ←これがActionだと…
9.
Action 波及ルール Eric Normand『Stratified
design and functional architecture』より ←呼んでいる関数全体が Actionになり…
10.
Action 波及ルール Eric Normand『Stratified
design and functional architecture』より ←結果全てのコードがAction になる
11.
Action 波及ルールへ 抵抗 できる限りコールツリーのリーフにCalculationを持ってくる必要がある ←Actionを呼んでいるので これもActionになってしまう!
12.
Layered Architectureで どうか? Web層 Application層 Domain層 Data
Access層 リーフがData AccessかDomainかになる Data AccessはActionなので、 CalculationなDomainを作らない限り、 全てがActionになってしまう。 Traditional Layered Architecture
13.
そこまでして純粋性にこだわる必要 ある か? https://www.slideshare.net/slideshow/ss-255489610/255489610 ないかもしれない。何を取りに行きたいのか?
要はバラ(略
14.
終 と、これだけだとよくある話なのですが、 Calculation抽出を追う過程でより深い示唆がえられる というのが今日の話です。
15.
Grokking Simplicity Deep Dive
16.
Calculationを増すのを追い求めるのは、関数の呼び出し階層を作る行為でもある
17.
階層? Web層 Application層 Domain層 Data Access層 すでにレイヤ分けはしているのだが…? 何のためにレイヤを分けているのか?
18.
そもそもレイヤードアーキテクチャと ? ● ソースコードの変更がシステム全体に波及しないようにする。変更は一つのコンポーネント に閉じ込め、他の部分に影響を与えないようにする。 ●
インターフェースは安定しているべきである。 ● システムの一部は交換可能であるべきである。コンポーネントは、システムの他の部分に影 響を与えることなく、代替実装に置き換えられるべきである。 ● 似た責務を持つ要素をグループ化して理解しやすさと保守性を高めるべきである。各コン ポーネントは一貫性を持つべきであり、一つのコンポーネントが異なる問題を実装すると、 その整合性が失われる可能性がある。グループ化と一貫性は時に対立する。 『Pattern-Oriented Software Architecture』
19.
POSA Layered Architecture Layer
N Layer N-1 Layer N-1 抽象度が高い 抽象度が低い 『Pattern-Oriented Software Architecture』 同じ抽象度のコンポーネントをグルーピングする 各レイヤのコンポーネントは、自分と同じか1つ 下のレイヤの機能のみに依存する。 個々のレイヤー内ではすべてのコンポーネントが 同じ抽象レベルで動作することが不可欠。
20.
Traditional Layered Architecture
レイヤ分割基準 ? 抽象度によって分かれている? そもそも抽象とは何か? Web層 Application層 Domain層 Data Access層
21.
A, B, Cの共通項 A
B C 全体 部分 部分 部分 これも含まれることがある 目的 手段 手段 手段 振る舞いにフォーカスすると… 抽象 抽象 抽象
22.
目的-手段 関係 フラクタル 目的A 手段
手段 手段 手段 目的Aの手段 かつ目的B 目的Bの手段 目的Bの手段 手段 手段 目的Bの手段
23.
Action, Calculation コールツリーも 目的-手段
フラクタルで構成されれ … 目的 手段 目的 手段 目的 手段 抽象のレイヤーができる
24.
Stratified Design https://medium.com/clean-code-development/stratified-design-over-layered-design-125727c7e15 さらに、コールツリーを詳細の実装を持 つのはリーフのみにする。ブランチノー ドは、下位層をコールするのみ。 詳細の実装は他のものに依存しないの で、テストがしやすい(テストダブルの必 要がない)。 他のものに依存しないので、だいたい Calculationになる。 これは別に新しい考え方とい うわけでもなく…
25.
Composed Method メソッドを他のメソッドの呼び出しから構成し、それぞれがほぼ同じ抽象度の レベルにあるようにする。 ※ ただしあまり具体的なことは『実装パターン』には書いてはいない ケントベックならそうする
26.
Stratified Designによってもたらされるも Layered Architectureの本来の目的の1つ ●
似た責務を持つ要素をグループ化して理解しやすさと保守性を高めるべき
27.
例題 ナントカPayを作ります。 ● ウォレットにコインをチャージして、利用したり送金したりできます。 ● 銀行口座を登録しておくと、そこからウォレットにチャージできます。これ は必須ではありません。 ●
銀行口座を登録する場合は、本人確認が必要です。本人確認は免許証または マイナンバーで行います(外部API利用) ● 口座番号が実在するか確認する必要があります。(外部API利用) ● メールアドレスがブラックリストに載っていれば登録できません。(ブラック リストはテキストファイルに1行ずつNGメールアドレスが記載されている) ● メールアドレスは全ユーザで一意でなくてはなりません。 ● これまで一度も登録したことのないユーザであれば、ウォレットに500コイン を付与します。 https://bitbucket.org/kawasima/design-kata/src/main/src/example/06_pay/
28.
StratifiedでないDesgin ユーザを登録する 運転免許証を使っ た本人確認 銀行口座 実在 確認 マイナンバーを 使った本人確認 csvから1行読 み出す Eメールが他 ユーザと一致して いないか ユーザをDBに 保存する 初回登録かどうか を判定する ウォレットをDB に保存する どれがドメインロジック ? https://bitbucket.org/kawasima/design-kata/src/main/src/example/06_pay/register.ts
29.
StratifiedなDesign ユーザを登録する 運転免許証を 使った本人確認 銀行口座 実在 確認 マイナンバーを 使った本人確認 csvから1行読 み出す ユーザをDBに保 存する 初回登録 リワード 本人確認する 銀行口座 妥当 性を確認する メールアドレス
妥 当性チェック Eメールが他 ユーザと一致し ていないか Eメールによる ユーザ検索 ブラックリストにメ アドが載っていな い 初回登録か判定 初回登録検索 初回登録コイン 付与 ←大まかな業務ルール ↓詳細の業務ルール https://bitbucket.org/kawasima/design-kata/src/main/src/example/06_pay/register.ts
30.
保守性↑ ユーザを登録する 運転免許証を 使った本人確認 マイナンバーを 使った本人確認 本人確認する ユーザを登録する 運転免許証を 使った本人確認 マイナンバーを 使った本人確認 本人確認する 年金手帳を使っ た本人確認 ← 変更なし 本人確認の手段が増えても、 ユーザを登録する部分は変更しなくても良い ↑追加
31.
理解しやすさ↑ Stratified Non-Stratified
32.
汎化 抽象化することを汎化(Generalization)するということもあるようだが… 抽象化すると汎用的になる、コードの再利用性を高めるってこと?
33.
「汎用」 2つ 意味がある 広範に使われる 広範を扱える 異なる概念 なので前ページのGPT-4oの回答には異を唱えたい
34.
「広範を扱える」 上位は下位の目的になってお り、下位は上位の手段になっ ている。 目的 手段 抽象 具象 汎化 特化 柔軟性や理解容易性に関わってくる いわゆる抽象化の概念
35.
「広範に使われる」 ある手段が複数の目的で使われる。 再利用性に関わってくる
36.
「汎用的なものを作ろう!」と言った場合、 どちらを指しているかを認識することが重要
37.
「広範を扱え」で「広範に使われる」構造 「広範を扱える」と「広範に使われる」が両立するセミラティス構造 それらは両立可能で、両立するとこのような構造になるはず。 ←リーフがCalculationになっている とモアベター ←同じ抽象レベルのコンポーネント
38.
Bad Scenario 1. レイヤごとにコンポーネントを分割し、その責務を考える。 2.
柔軟性を持たせるために汎化できるものを考える (部分的抽象化) 3. 汎化した処理は、よりバリエーションの多いデータを受け付ける。 そのため処理に重複するところが出てくる。 4. 重複するところを共通関数(下請けメソッド)として切り出す。(部分的再利用性) レイヤごとに責務を割り当てる設計からスタート する術しか持っていない場合… よく見かけるヤツ!
39.
Stratified Design 階層
特徴 目的 手段 抽象 具象 特定用途 汎用
40.
Clean Architecture “ソースコードの依存関係は常に内側を指す。内側に進むに つれて、抽象度と方針のレベルが高まる。最も外側の円は 低レベルの具体的な詳細で構成されている。内側に進むに つれて、ソフトウェアはより抽象的になり、高レベルの方 針を包含する。最も内側の円が最も一般的で高いレベルで ある。”
41.
円 中心ほど抽象度が高い? 円 中心ほど抽象度が高いと言って いるが、これが決定的な誤り。 ユースケースが目的で、ビジネス ルール
そ 手段な で、ユース ケース 方がハイレベル、抽象度が 高い、と考える が普通で ?
42.
Controller Repository UseCase Presenter Business Rules Repository Business Rules Repository Impl Presenter Impl もしかしたらDIPによる依存 逆転が ある で、最下層が一番抽象的と 言っている
かもしれない … …が、Business Rules UseCase 手 段であり、ここに関して POSA レ イヤリング 定義にピタッと当て ま る で、UseCase 方が抽象度が高 いだろう…
43.
そもそも実装分離 ため インタフェース
抽象と言える だろうか? Repository RepositoryImpl
44.
抽象化と …? “抽象化とは物事を曖昧にすることではなく、 むしろ 人が絶対的な正確さを発揮できる新しい意味の段階を つくりだすこと” Edsger
W. Dijkstra
45.
実装を切り離す目的 インタフェースを抽象化と呼 ない方が良いかも Repository RepositoryImpl 目的と手段の関係にはなっていないし、 新しい意味の段階を作ってはいない Client 使う側はどちらにインタフェースと実装とどちらにアクセスしても、 その意味は変わらない。
46.
クリーンアーキテクチャ DIP 新しい意味
段階を生み出しているわけで ない で取り除いてみると… Controller Repository UseCase Presenter Business Rules 伝統的なレイヤードアーキテクチャと なんら変わらない。 Repository Business Rules ← 大事なのはこのレイヤのStratified Design
47.
業務ルール 抽象化 同じ振る舞いをグルーピングするだけで なく、大まかに言えば同じ振る舞いと見 なせる新しい意味の段階を意図的に作る ユーザを登録する 運転免許証を 使った本人確認 銀行口座 実在 確認 マイナンバーを 使った本人確認 csvから1行読 み出す ユーザをDBに保 存する 初回登録 リワード 本人確認する 銀行口座
妥当 性を確認する メールアドレス 妥 当性チェック Eメールが他 ユーザと一致し ていないか Eメールによる ユーザ検索 ブラックリストにメ アドが載っていな い 初回登録か判定 初回登録検索 初回登録コイン 付与 ←大まかな業務ルール ↓詳細の業務ルール
48.
業務ルール 抽象化 ● 業務ルールを抽象化しておくと、ルールの追加・変更が下位層に閉じ 柔軟性が増す。一度に脳にロードしておくべきコンポーネントが減 る、認知負荷が減るので、理解容易性が増す。 →
「広範を扱える」ようにするメリット ● 業務ルールを抽象化しておくと、下位層のルールの再利用性が増す。 → 「広範に使える」ようにするメリット ○ ルール自体をコピペするのではなく、詳細ルールを合成して、 新しいルールを作ることもできる。
49.
で Stratified Design当たり前
こと ような に、なぜメジャーじゃない か…? https://ja.wikipedia.org/wiki/凝集度 抽象概念 設計が難しく、ミスると凝集度を下げてしまうため
50.
誤って凝集度を下げることなく、Stratified なDesignをするやり方については、 7/13 の大吉祥寺.pmでお話する予定です! お楽しみに!
Download