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
Agent on Rails - AIをDDDのレールの上で制御する
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
maku.
June 07, 2025
210
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Agent on Rails - AIをDDDのレールの上で制御する
maku.
June 07, 2025
More Decks by maku.
See All by maku.
Svelteで作るページビルダー
childhooooo
0
300
JavaScriptを使わない(Phoenix LiveViewの紹介)
childhooooo
0
970
DDD by Functional programming with TypeScript
childhooooo
2
2.3k
Featured
See All Featured
Deep Space Network (abreviated)
tonyrice
0
210
Scaling GitHub
holman
464
140k
Statistics for Hackers
jakevdp
799
230k
GitHub's CSS Performance
jonrohan
1033
470k
Git: the NoSQL Database
bkeepers
PRO
432
67k
Claude Code のすすめ
schroneko
67
230k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
170
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.3k
Become a Pro
speakerdeck
PRO
31
6k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
210
How to train your dragon (web standard)
notwaldorf
97
6.7k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Transcript
Gunma.web AIをDDDのレールの上で制御する @tuanemuy Hikaru Otabe Agent on Rails
自己紹介 @tuanemuy Hikaru Otabe 大田部 晃 Freelance Web Developer
6〜7年前の技術トレンド 覚えていますか?
Gunma.web #30 DDD / ドメイン駆動設計 2018.01.20 7年前のGunma.web
最近は誰も設計の話をせず、 バイブコーディングばかり...
Claude Codeで バイブコーディングやってみた
できた!
AIの生成したコード、 読みたいですか?
AIの生成したコード export await if return state pending result result result
function const async => const () TaskForm onTaskCreated : formAction = useActionState ( : : ) { = onTaskCreated } { } ( ) { { } [ ] ( TaskFormProps unknown FormData createTaskAction , , , ; . ; ; , : _prevState formData formData success error ( ) ( ) { } null
AIの生成したコード export as as as try await as async function
const const const const createTaskAction : = get = get = get = ( ) ( | | ( ) { formData formData formData formData db tasks userId id title priority title priority dueDate newTask user priority FormData string string string insert values ( ) . " " ; . " " ; . " " ; . . : . , , : " " " " " " ( ) ( ) ( ) { title priority dueDate { low medium high
DDDの考え方を取り入れて AIをうまく制御する
" 技術的 ドメイン " ビジネス 技術 " ユビキタス言語 " モデルを明示的に表現
な課題ではなく、 において価値のある部分や 複雑な部分にフォーカスしよF 側と 側が協調してモデリングしよF そのために共通の を話そF するソフトウェアを書こう DDDの考え方(ざっくり)
$ 技術的 ドメイン $ ビジネス 技術 $ ユビキタス言語 $ モデルを明示的に表現する
な課題ではなく、 において価値のある部分や 複雑な部分にフォーカスしよG 側と 側が協調してモデリングしよG そのために共通の を話そG ソフトウェアを書こう $ $ $ $ モデルを明示的に表現 するソフトウェアを書こう DDDの考え方(ざっくり)
$ 技術的 ドメイン $ ビジネス 技術 $ ユビキタス言語 $ モデルを明示的に表現する
な課題ではなく、 において価値のある部分や 複雑な部分にフォーカスしよG 側と 側が協調してモデリングしよG そのために共通の を話そG ソフトウェアを書こう $ l $ $ l $ モデルを明示的に表現 → ORM等の具体的な実装よりも、モデルを優先する l するソフトウェアを書こう DDDの考え方(ざっくり)
バイブコーディングでよくあるSupabaseクライアントを UIコンポーネントから直接呼び出すみたいなのはNV インターフェースを最初に定義し、例えばDB操作の具体実 装はSupabaseクライアントにも各種ORMにも切り替えら れるようなイメージ DDDの考え方(ざっくり)
ヘキサゴナルアーキテクチャ (Ports and Adapters) データベース Adapters 外部のAPI Adapters Port Port
Application Service
ヘキサゴナルアーキテクチャ (Ports and Adapters) Port 外部サービスを利用するモジュールのインターフェース Application Service ユースケースの実装 依存
依存 依存 Adapters 外部サービスを利用するモジュールの実装 データベース 外部API etc...
設計を `CLAUDE.md`に書いて 実装させてみる
Entity, Value Object, DTO export export TaskSchema TaskIdSchema UserIdSchema TaskStatusSchema
TaskPrioritySchema TaskSchema const type = object string() min( ) max( ) date() optional() date() date() = typeof z id userId title z status priority dueDate z createdAt z updatedAt z . : , : , : . . . , : , : , : . . , : . , : . , ; . ; ( ) < > { } 1 200 Task z infer
Port export interface TaskRepository CreateTaskParams Promise Result Task RepositoryError TaskId
Promise Result Task null RepositoryError UserId TaskFilter TaskSort Promise Result Task RepositoryError UpdateTaskParams Promise Result Task RepositoryError { create : : < > getById : : < | > getByUserId : ?: ?: : < > update : : < > ( ) < > ( ) < > ( ) < > ( ) < > params id userId filter sort params , ; , ; , , , , ; , ; []
Adapter export await result tasks class implements constructor private readonly
async const this DrizzleSqliteTaskRepository TaskRepository Database CreateTaskParams Promise Result Task RepositoryError { { ( ) {} ( ) < > { db params db userId params userId title params title status : create : : < > = insert values , . . . : . , : . , : " ", ( ) ( pending
Application Service export await if return paramsResult CreateTaskParamsSchema createResult paramsResult
createResult async function const const createTask : : : = parse = create isErr() err( ( ) < > { context params params context taskRepository data Context CreateTaskParams Promise Result Task ApplicationError , , , . ; . . . ; . < > ( ) ( ) ( ) {
生成されたコード / CLAUDE.md https://github.com/tuanemuy/agent-on-rails tuanemuy/agent-on-rails
AIが走るレールを用意して 持続的なバイブコーディングを