Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
さいきょうのレイヤードアーキテクチャについて考えてみた
Search
y_ahiru
January 31, 2025
Programming
3
990
さいきょうのレイヤードアーキテクチャについて考えてみた
吉祥寺pm 37 での登壇資料です
https://kichijojipm.connpass.com/event/339040/
y_ahiru
January 31, 2025
Tweet
Share
More Decks by y_ahiru
See All by y_ahiru
恣意性から考える、変更に強いモデルの作り方
yahiru
1
950
責務と認知負荷を整える! 抽象レベルを意識した関心の分離
yahiru
11
2.3k
フロントエンドエンジニアも知っておきたい HTTP/3 で変わること
yahiru
16
13k
ゆるふわCQRS入門
yahiru
2
680
設計におけるソリューションドメイン
yahiru
3
1.7k
PHPで始めるGitHub Actions
yahiru
1
780
5ヶ月でカバレッジを20%から90%にあげた話
yahiru
2
6.7k
入門ミューテーションテスト/ A bigginer's guide to Mutation testing
yahiru
0
1.5k
Eloquentに別れを告げるタイミングについて考えた
yahiru
2
2k
Other Decks in Programming
See All in Programming
React 使いじゃなくても知っておきたい教養としての React
oukayuka
18
5.7k
20250808_AIAgent勉強会_ClaudeCodeデータ分析の実運用〜競馬を題材に回収率100%の先を目指すメソッドとは〜
kkakeru
0
180
『リコリス・リコイル』に学ぶ!! 〜キャリア戦略における計画的偶発性理論と変わる勇気の重要性〜
wanko_it
1
540
Introduction to Git & GitHub
latte72
0
110
生成AI、実際どう? - ニーリーの場合
nealle
0
110
Constant integer division faster than compiler-generated code
herumi
2
670
AI時代のドメイン駆動設計-DDD実践におけるAI活用のあり方 / ddd-in-ai-era
minodriven
21
7.9k
Infer入門
riru
4
1.5k
バイブコーディングの正体——AIエージェントはソフトウェア開発を変えるか?
stakaya
5
940
あまり知られていない MCP 仕様たち / MCP specifications that aren’t widely known
ktr_0731
0
270
AIに安心して任せるためにTypeScriptで一意な型を作ろう
arfes0e2b3c
0
370
Terraform やるなら公式スタイルガイドを読もう 〜重要項目 10選〜
hiyanger
13
3.1k
Featured
See All Featured
Building Applications with DynamoDB
mza
96
6.6k
Writing Fast Ruby
sferik
628
62k
How to train your dragon (web standard)
notwaldorf
96
6.2k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
RailsConf 2023
tenderlove
30
1.2k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
How GitHub (no longer) Works
holman
314
140k
Done Done
chrislema
185
16k
Thoughts on Productivity
jonyablonski
69
4.8k
Intergalactic Javascript Robots from Outer Space
tanoku
272
27k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
1.8k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
36
2.5k
Transcript
さいきょうのレイヤードアーキテクチャ について考えてみた 吉田あひる @吉祥寺.pm37
名前: 吉田あひる (@strtyuu) 仕事: エンジニア 所属: スターフェスティバル株式会社 自己紹介
なぜこんな話をしようと思ったのか
ビジネスロジックをドメイン層に実装 するって正しいんだっけ?
なぜそんな疑問を持ったのか • ドメイン層は大体一番下の層として配置されている • ドメイン層にビジネスロジックを実装するという話はよくきく • でも、ビジネスロジックって普通変わっていくもの ◦ 少なくとも、ビジネスロジックと言われるものの中には安定度の低いものがあるはず •
安定度の低いビジネスロジックがドメイン層に入っているのは影響範囲が広くなりがちであまり嬉しくない んじゃないか?
ぼくのかんがえた さいきょうの解決策
変更要求がきたら
ドメイン層の手前で吸 収できると理想なの では?
どうすればドメイン層の手前で 変更要求を吸収できるか?
ノーコードツールが参考になるのでは? • コードを書かなくとも簡易的なアプリケーションを作成できるすごいやつ
ノーコードツールはドメインモデルをいじらない • ノーコードツールを使ってビジネスや業務を回している企業がある • ノーコードツール自身はそれらの企業のビジネスはよく知らない • これはノーコードツールを使ってユーザー自身がビジネスロジックを記述しているような状態 • こうなると、ビジネスロジックに変更があってもドメイン層をいじる必要が全くない
なぜノーコードツールは安定しているのか? • 個別のビジネス的な要件が削ぎ落とされることからドメインモデルの安定性は生まれているのではない か? • ユーザー自身のドメインモデルの使い方で振る舞いを調整できるからじゃないか?
とはいえノーコードツールを目指せばいいわけではない • ノーコードツールは1企業からみると包含する範囲が広すぎる ◦ 抽象度が高すぎて必要な情報の欠落や必要以上の認知負荷上昇につながってしまう • 対象のドメインをちょうど包含できる抽象が良い抽象 ◦ 自社の要求の範囲で抽象化されたドメインモデルを目指していく必要がある
ノーコードツールの話をまとめると ... • 個別のビジネス要件をドメインモデルから追い出し抽象化することで安定性が高まる • しかし、何でも抽象化してしまうと抽象度が高くなりすぎて辛い
安定度の低いビジネスロジックだけド メインモデルから追い出せばいいので は?
どうやって追い出すのか?
共通性・可変性 • 対象となる物事の中で共通する部分としない部分 • 共通性は静的な構造 ◦ 可変性を受け入れる枠組み • 可変性は動的 •
詳しくはマルチパラダイムデザインという書籍で
お弁当で考えてみる • 共通性 ◦ 商品名と価格からなる データ構造 • 可変性 ◦ 具体的な商品名や価格と
いった状態
PHP で表現してみる • 共通性はクラスという静的な形 で表現 • 可変性は変数として表現
PHP で表現できる共通性・可変性(一部) デザインパターンなどは更に様々な共通性・可変性を表現できる ※実際には共通性・可変性の他にバインディング時期など他にも考慮するポイントがある 共通性 可変性 機能 振る舞い・データ構造 状態 Class
名前(意味) or 振る舞い 振る舞い or 実装 Interface 振る舞い 型 Trait データ構造 小さい値の組 Enum
要件を可変性で捉えて ビジネスロジックを抽象化してみる
申請アプリケーションの例 • スターフェスティバルはお弁当を販売する ECサイトを運営している • ECサイトに並ぶお弁当は外部の飲食店のものも含まれる • クオリティ担保のため、社内の審査を通過したお弁当だけを ECサイト上に並べている •
商品情報を審査をするためのアプリケーションを構築したい • 「3次審査までできるようにしてほしいです!」
3次審査という要件を 共通性で実装する例 3次審査以外のバリエーションを考慮し ないため、三次承認までのステータス を静的に表現する
3次審査という要件を 可変性で実装する例 2次審査までの申請など承認ステップ のバリエーションを仮定し、動的に表現 したバージョン
ドメインモデルに可変性を組み込む • 要件を可変性として捉えることで、ドメインモデルの抽象度が一段上がる • 可変性のスコープ内の変更要求であればドメインモデル自体の変更が不要になる • ドメイン層に変更を加えなくても変更要求に対応できる状態に少し近づいた?
YAGNI との付き合い方 • kawashima さんの素晴らしい資料に沿ってやっていくと良さそう ◦ 「それはYAGNIか? それとも思考停止か ?」 https://www.slideshare.net/kawasima/yagni
◦ 変更要求が発生したタイミングなどで変更の発生した部分を可変性に切り出していくといいのではないか • 何でも可変性にしていくと抽象度が高くなりすぎる可能性 • ユースケースの幅が広がりそうなところを可変性にすると面白いことになるかもしれない
可変性についてもっと知りたい人は • マルチパラダイムデザイン • データモデリングでドメインを駆動するという書籍で紹介されている ◦ テーブル駆動方式 ◦ DSL ◦
定義体方式
まとめ • 安定度の低いビジネスロジックをドメイン層に入れると、影響範囲が広くなりがちで辛いのではないか • 安定度を高めるためにはビジネスロジック自体の抽象度を上げていく必要があるのではないか • 要件を可変性で捉えることでドメインモデルの抽象度が上がっていくのではないか • ドメインモデルに可変性を組み込んでいくことで、変更要求をドメイン層の手前で吸収できることが増える のではないか
• そうなるとさいきょうのレイヤードアーキテクチャ感があるのではないか
We are hiring !!