Movatterモバイル変換


[0]ホーム

URL:


PDF, PPTX3,058 views

Grokking Simplicity探訪

2024/6/5のアーキ部で話したスライドです。Stratified Designの目的を中心に、そのメリットを考えてみます。

Embed presentation

Download as PDF, PPTX
GrokkingSimplicity探訪kawasimaアーキ部
Grokking Simplicity2021年5月 発売日本語未訳他Grokkingシリーズは「なっとく!」シリーズとして続々翻訳されているが…
Data, Action, Calculation計算アクションデータ実行結果が、何回実行するか、いつ実行するかに依存する入力から出力を計算するイベントに関する事実例) メールを送る、データベースから読み込む例) 最大値を探す、メールアドレスの妥当性を検証する例) 最大値を探す、メールアドレスの妥当性を検証するプログラムを以下の3つに分類してみよう
Calcuration『Grokking Simplicity』の定義入力から出力を計算する関数● 外の世界に影響を与えず、外の世界の影響も受けない● 例○ +, *, -, /○ Math.abs()○ 文字列結合○ Eメールアドレスのバリデーション
Action『Grokking Simplicity』の定義外の世界に影響を与える、または外の世界の影響を受ける関数したがって純関数でないもの、または副作用のあるもの● 例:○ Eメールを送信する○ データベースから読み込む○ ファイルに書き込む● Actionは本番環境で安全に実行するのが難しい● Actionはデバッグするのが難しい
Calculation 割合を増やしたいCalculations CalculationsActions Actionsこっちの方が安全でデバッグしやすい
https://speakerdeck.com/masuda220/big-ball-of-mudこのあたりの話は、増田さんのスライドでも書かれているので、ぜひご覧になってください。
Action 波及ルールEric Normand『Stratified design and functional architecture』より←これがActionだと…
Action 波及ルールEric Normand『Stratified design and functional architecture』より←呼んでいる関数全体がActionになり…
Action 波及ルールEric Normand『Stratified design and functional architecture』より←結果全てのコードがActionになる
Action 波及ルールへ 抵抗できる限りコールツリーのリーフにCalculationを持ってくる必要がある←Actionを呼んでいるのでこれもActionになってしまう!
Layered Architectureで どうか?Web層Application層Domain層Data Access層リーフがData AccessかDomainかになるData AccessはActionなので、CalculationなDomainを作らない限り、全てがActionになってしまう。Traditional Layered Architecture
そこまでして純粋性にこだわる必要 ある か?https://www.slideshare.net/slideshow/ss-255489610/255489610ないかもしれない。何を取りに行きたいのか? 要はバラ(略
終と、これだけだとよくある話なのですが、Calculation抽出を追う過程でより深い示唆がえられるというのが今日の話です。
Grokking SimplicityDeep Dive
Calculationを増すのを追い求めるのは、関数の呼び出し階層を作る行為でもある
階層?Web層Application層Domain層Data Access層すでにレイヤ分けはしているのだが…?何のためにレイヤを分けているのか?
そもそもレイヤードアーキテクチャと ?● ソースコードの変更がシステム全体に波及しないようにする。変更は一つのコンポーネントに閉じ込め、他の部分に影響を与えないようにする。● インターフェースは安定しているべきである。● システムの一部は交換可能であるべきである。コンポーネントは、システムの他の部分に影響を与えることなく、代替実装に置き換えられるべきである。● 似た責務を持つ要素をグループ化して理解しやすさと保守性を高めるべきである。各コンポーネントは一貫性を持つべきであり、一つのコンポーネントが異なる問題を実装すると、その整合性が失われる可能性がある。グループ化と一貫性は時に対立する。『Pattern-Oriented Software Architecture』
POSA Layered ArchitectureLayer NLayer N-1Layer N-1抽象度が高い抽象度が低い『Pattern-Oriented Software Architecture』同じ抽象度のコンポーネントをグルーピングする各レイヤのコンポーネントは、自分と同じか1つ下のレイヤの機能のみに依存する。個々のレイヤー内ではすべてのコンポーネントが同じ抽象レベルで動作することが不可欠。
Traditional Layered Architecture レイヤ分割基準 ?抽象度によって分かれている?そもそも抽象とは何か?Web層Application層Domain層Data Access層
A, B, Cの共通項A B C全体部分 部分 部分これも含まれることがある目的手段 手段 手段振る舞いにフォーカスすると…抽象抽象抽象
目的-手段 関係 フラクタル目的A手段 手段 手段手段目的Aの手段かつ目的B目的Bの手段 目的Bの手段 手段手段目的Bの手段
Action, Calculation コールツリーも目的-手段 フラクタルで構成されれ …目的手段 目的手段 目的手段抽象のレイヤーができる
Stratified Designhttps://medium.com/clean-code-development/stratified-design-over-layered-design-125727c7e15さらに、コールツリーを詳細の実装を持つのはリーフのみにする。ブランチノードは、下位層をコールするのみ。詳細の実装は他のものに依存しないので、テストがしやすい(テストダブルの必要がない)。他のものに依存しないので、だいたいCalculationになる。これは別に新しい考え方というわけでもなく…
Composed Methodメソッドを他のメソッドの呼び出しから構成し、それぞれがほぼ同じ抽象度のレベルにあるようにする。※ ただしあまり具体的なことは『実装パターン』には書いてはいないケントベックならそうする
Stratified DesignによってもたらされるもLayered Architectureの本来の目的の1つ● 似た責務を持つ要素をグループ化して理解しやすさと保守性を高めるべき
例題ナントカPayを作ります。● ウォレットにコインをチャージして、利用したり送金したりできます。● 銀行口座を登録しておくと、そこからウォレットにチャージできます。これは必須ではありません。● 銀行口座を登録する場合は、本人確認が必要です。本人確認は免許証またはマイナンバーで行います(外部API利用)● 口座番号が実在するか確認する必要があります。(外部API利用)● メールアドレスがブラックリストに載っていれば登録できません。(ブラックリストはテキストファイルに1行ずつNGメールアドレスが記載されている)● メールアドレスは全ユーザで一意でなくてはなりません。● これまで一度も登録したことのないユーザであれば、ウォレットに500コインを付与します。https://bitbucket.org/kawasima/design-kata/src/main/src/example/06_pay/
StratifiedでないDesginユーザを登録する運転免許証を使った本人確認銀行口座 実在確認マイナンバーを使った本人確認csvから1行読み出すEメールが他ユーザと一致していないかユーザをDBに保存する初回登録かどうかを判定するウォレットをDBに保存するどれがドメインロジック ?https://bitbucket.org/kawasima/design-kata/src/main/src/example/06_pay/register.ts
StratifiedなDesignユーザを登録する運転免許証を使った本人確認銀行口座 実在確認マイナンバーを使った本人確認csvから1行読み出すユーザをDBに保存する初回登録リワード本人確認する銀行口座 妥当性を確認するメールアドレス 妥当性チェックEメールが他ユーザと一致していないかEメールによるユーザ検索ブラックリストにメアドが載っていない初回登録か判定初回登録検索初回登録コイン付与←大まかな業務ルール↓詳細の業務ルールhttps://bitbucket.org/kawasima/design-kata/src/main/src/example/06_pay/register.ts
保守性↑ユーザを登録する運転免許証を使った本人確認マイナンバーを使った本人確認本人確認するユーザを登録する運転免許証を使った本人確認マイナンバーを使った本人確認本人確認する年金手帳を使った本人確認← 変更なし本人確認の手段が増えても、ユーザを登録する部分は変更しなくても良い↑追加
理解しやすさ↑StratifiedNon-Stratified
汎化抽象化することを汎化(Generalization)するということもあるようだが…抽象化すると汎用的になる、コードの再利用性を高めるってこと?
「汎用」 2つ 意味がある広範に使われる広範を扱える異なる概念なので前ページのGPT-4oの回答には異を唱えたい
「広範を扱える」上位は下位の目的になっており、下位は上位の手段になっている。目的手段抽象具象汎化特化柔軟性や理解容易性に関わってくるいわゆる抽象化の概念
「広範に使われる」ある手段が複数の目的で使われる。再利用性に関わってくる
「汎用的なものを作ろう!」と言った場合、どちらを指しているかを認識することが重要
「広範を扱え」で「広範に使われる」構造「広範を扱える」と「広範に使われる」が両立するセミラティス構造それらは両立可能で、両立するとこのような構造になるはず。←リーフがCalculationになっているとモアベター←同じ抽象レベルのコンポーネント
Bad Scenario1. レイヤごとにコンポーネントを分割し、その責務を考える。2. 柔軟性を持たせるために汎化できるものを考える (部分的抽象化)3. 汎化した処理は、よりバリエーションの多いデータを受け付ける。そのため処理に重複するところが出てくる。4. 重複するところを共通関数(下請けメソッド)として切り出す。(部分的再利用性)レイヤごとに責務を割り当てる設計からスタートする術しか持っていない場合…よく見かけるヤツ!
Stratified Design 階層 特徴目的手段抽象具象特定用途汎用
Clean Architecture“ソースコードの依存関係は常に内側を指す。内側に進むにつれて、抽象度と方針のレベルが高まる。最も外側の円は低レベルの具体的な詳細で構成されている。内側に進むにつれて、ソフトウェアはより抽象的になり、高レベルの方針を包含する。最も内側の円が最も一般的で高いレベルである。”
円 中心ほど抽象度が高い?円 中心ほど抽象度が高いと言っているが、これが決定的な誤り。ユースケースが目的で、ビジネスルール そ 手段な で、ユースケース 方がハイレベル、抽象度が高い、と考える が普通で ?
ControllerRepositoryUseCasePresenterBusinessRulesRepositoryBusinessRulesRepositoryImplPresenterImplもしかしたらDIPによる依存 逆転がある で、最下層が一番抽象的と言っている かもしれない ……が、Business Rules UseCase 手段であり、ここに関して POSA レイヤリング 定義にピタッと当て まる で、UseCase 方が抽象度が高いだろう…
そもそも実装分離 ため インタフェース 抽象と言える だろうか?RepositoryRepositoryImpl
抽象化と …?“抽象化とは物事を曖昧にすることではなく、 むしろ人が絶対的な正確さを発揮できる新しい意味の段階をつくりだすこと”Edsger W. Dijkstra
実装を切り離す目的 インタフェースを抽象化と呼 ない方が良いかもRepositoryRepositoryImpl目的と手段の関係にはなっていないし、新しい意味の段階を作ってはいないClient使う側はどちらにインタフェースと実装とどちらにアクセスしても、その意味は変わらない。
クリーンアーキテクチャ DIP 新しい意味 段階を生み出しているわけで ない で取り除いてみると…ControllerRepositoryUseCasePresenterBusinessRules伝統的なレイヤードアーキテクチャとなんら変わらない。RepositoryBusinessRules← 大事なのはこのレイヤのStratified Design
業務ルール 抽象化同じ振る舞いをグルーピングするだけでなく、大まかに言えば同じ振る舞いと見なせる新しい意味の段階を意図的に作るユーザを登録する運転免許証を使った本人確認銀行口座 実在確認マイナンバーを使った本人確認csvから1行読み出すユーザをDBに保存する初回登録リワード本人確認する銀行口座 妥当性を確認するメールアドレス 妥当性チェックEメールが他ユーザと一致していないかEメールによるユーザ検索ブラックリストにメアドが載っていない初回登録か判定初回登録検索初回登録コイン付与←大まかな業務ルール↓詳細の業務ルール
業務ルール 抽象化● 業務ルールを抽象化しておくと、ルールの追加・変更が下位層に閉じ柔軟性が増す。一度に脳にロードしておくべきコンポーネントが減る、認知負荷が減るので、理解容易性が増す。→ 「広範を扱える」ようにするメリット● 業務ルールを抽象化しておくと、下位層のルールの再利用性が増す。→ 「広範に使える」ようにするメリット○ ルール自体をコピペするのではなく、詳細ルールを合成して、新しいルールを作ることもできる。
で Stratified Design当たり前 こと ような に、なぜメジャーじゃない か…?https://ja.wikipedia.org/wiki/凝集度抽象概念 設計が難しく、ミスると凝集度を下げてしまうため
誤って凝集度を下げることなく、StratifiedなDesignをするやり方については、7/13 の大吉祥寺.pmでお話する予定です!お楽しみに!

Recommended

PDF
Tackling Complexity
PDF
ソフトウェアにおける 複雑さとは何なのか?
PDF
強いて言えば「集約どう実装するのかな、を考える」な話
PDF
例外設計における大罪
PDF
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
PDF
マイクロサービス 4つの分割アプローチ
PDF
PostgreSQLアンチパターン
PDF
AWSのログ管理ベストプラクティス
PDF
ドメイン駆動設計 ( DDD ) をやってみよう
PDF
MHA for MySQLとDeNAのオープンソースの話
PDF
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
PPTX
冬のLock free祭り safe
PDF
こわくない Git
PDF
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
PPTX
イベント・ソーシングを知る
PDF
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
PDF
イミュータブルデータモデルの極意
PPTX
やってはいけない空振りDelete
PDF
オブジェクト指向エクササイズのススメ
PDF
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
PDF
文字コードに起因する脆弱性とその対策(増補版)
PPTX
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
PDF
思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 Fall
PDF
エスイーが要件定義でやるべきたったひとつのこと
PDF
Linux女子部 systemd徹底入門
PDF
Akkaとは。アクターモデル とは。
PPTX
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PDF
マイクロにしすぎた結果がこれだよ!
PDF
ブルックスのいう銀の弾丸とは何か?
PDF
Are Design Patterns Dead?

More Related Content

PDF
Tackling Complexity
PDF
ソフトウェアにおける 複雑さとは何なのか?
PDF
強いて言えば「集約どう実装するのかな、を考える」な話
PDF
例外設計における大罪
PDF
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
PDF
マイクロサービス 4つの分割アプローチ
PDF
PostgreSQLアンチパターン
PDF
AWSのログ管理ベストプラクティス
Tackling Complexity
ソフトウェアにおける 複雑さとは何なのか?
強いて言えば「集約どう実装するのかな、を考える」な話
例外設計における大罪
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
マイクロサービス 4つの分割アプローチ
PostgreSQLアンチパターン
AWSのログ管理ベストプラクティス

What's hot

PDF
ドメイン駆動設計 ( DDD ) をやってみよう
PDF
MHA for MySQLとDeNAのオープンソースの話
PDF
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
PPTX
冬のLock free祭り safe
PDF
こわくない Git
PDF
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
PPTX
イベント・ソーシングを知る
PDF
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
PDF
イミュータブルデータモデルの極意
PPTX
やってはいけない空振りDelete
PDF
オブジェクト指向エクササイズのススメ
PDF
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
PDF
文字コードに起因する脆弱性とその対策(増補版)
PPTX
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
PDF
思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 Fall
PDF
エスイーが要件定義でやるべきたったひとつのこと
PDF
Linux女子部 systemd徹底入門
PDF
Akkaとは。アクターモデル とは。
PPTX
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PDF
マイクロにしすぎた結果がこれだよ!
ドメイン駆動設計 ( DDD ) をやってみよう
MHA for MySQLとDeNAのオープンソースの話
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
冬のLock free祭り safe
こわくない Git
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
イベント・ソーシングを知る
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
イミュータブルデータモデルの極意
やってはいけない空振りDelete
オブジェクト指向エクササイズのススメ
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
文字コードに起因する脆弱性とその対策(増補版)
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 Fall
エスイーが要件定義でやるべきたったひとつのこと
Linux女子部 systemd徹底入門
Akkaとは。アクターモデル とは。
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
マイクロにしすぎた結果がこれだよ!

More from Yoshitaka Kawashima

PDF
ブルックスのいう銀の弾丸とは何か?
PDF
Are Design Patterns Dead?
PDF
それはYAGNIか? それとも思考停止か?
PDF
ソフトウェア設計における 意思決定とそのレビューの秘訣
PDF
なぜデータモデリングが重要なのか?
PDF
アンチフラジャイルの世界
PDF
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
PDF
システムダウンのひみつ
PDF
ウォーターフォールとアジャイルのフェアな比較
PDF
Mavenの真実とウソ
PDF
ソフトウェア開発における『知の高速道路』
PDF
Atomic Architecture
PDF
たとえ日本人同士でも必要な異文化理解力
PDF
Boilerplate vs Magic
PDF
Antifragile Java - Java Day Tokyo 2017 D1-E1
PDF
Antifragile Clojure
PDF
本番障害に至る病
PDF
既婚プログラマの時間捻出術
PDF
SIerにとっての越境 @ DevLOVE 199
PDF
How to find tech books
ブルックスのいう銀の弾丸とは何か?
Are Design Patterns Dead?
それはYAGNIか? それとも思考停止か?
ソフトウェア設計における 意思決定とそのレビューの秘訣
なぜデータモデリングが重要なのか?
アンチフラジャイルの世界
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
システムダウンのひみつ
ウォーターフォールとアジャイルのフェアな比較
Mavenの真実とウソ
ソフトウェア開発における『知の高速道路』
Atomic Architecture
たとえ日本人同士でも必要な異文化理解力
Boilerplate vs Magic
Antifragile Java - Java Day Tokyo 2017 D1-E1
Antifragile Clojure
本番障害に至る病
既婚プログラマの時間捻出術
SIerにとっての越境 @ DevLOVE 199
How to find tech books

Grokking Simplicity探訪


[8]ページ先頭

©2009-2025 Movatter.jp