Skip to content

Instantly share code, notes, and snippets.

@haru01
haru01 / Claude.md
Created July 21, 2025 22:26
履修管理システム - Effect-TS CQRS/イベントソーシング実装ガイド(一括操作版)

履修管理システム - Effect-TS CQRS/イベントソーシング実装ガイド(一括操作版)

概要

このドキュメントでは、Effect-TSを用いた関数型DDD、CQRS、イベントソーシングによる履修管理システムの実装方法を説明します。科目の追加・削除は一括操作として実装されています。

アーキテクチャの特徴

  • CQRS (Command Query Responsibility Segregation): コマンド(書き込み)とクエリ(読み込み)を分離
  • イベントソーシング: 状態変更をイベントとして記録(Update禁止、Insertのみ)

ドメインイベント導入ガイド - Effect-TS実装

要約

このドキュメントでは、ドメイン駆動設計におけるドメインイベントの導入と、Effect-TSを用いた実装方法について説明します。

Effect-TSを使うポイント

  • 型安全なエラーハンドリング: Effect.Effect<成功型, エラー型, 依存型>により、発生しうるエラーが型レベルで明示され、コンパイル時にエラー処理の漏れを防げます
  • 依存性注入: Context.Tagを使ったDIにより、テスト時にモックへの差し替えが容易
@haru01
haru01 / Claude.md
Last active June 12, 2025 09:59
関数型DDD学習用のClaudeファイル

TypeScript関数型DDD実践ガイド(AI最適化版)

プロジェクト概要

プロジェクト説明

関数型プログラミングとDomain-Driven Designの原則を組み合わせたTypeScript実装ガイド。fp-tsライブラリを使用し、純粋関数、不変性、型安全性を重視したアーキテクチャを提供します。

let result = 0;
[1,2,3,4,5,6].forEach((n) => {
if (n % 2 === 0) {
result += n * n;
}
});
console.log(result);
const result = [1,2,3,4,5,6]
.filter(n => n % 2 === 0)
.map(n => n * n)
.reduce((a, b) => a + b, 0);
console.log(result); // (2*2) + (4*4) + (6*6)
// https://github.com/j5ik2o/ticket-price-modeling
// 解き方方針: 型で問題を解くよりも、料金表のように日本人の非エンジニアの人も読めて突っ込めるコード記述を目指す.
// 解き方方針: 配列でmap&sortの世界に引き込んで安い料金を選ぶようにする.
// 解いたのは "シネマシティズン" の場合だけ。
// TODO 引数を型にして呼び出しに制約を設けるかはあとで考える。
const movePayment = (ticketType, timeTypes) => {
var payments =
{"シネマシティズン":
{"平日〜20:00": 1000,
interface Expression {
times(muptiplier: number): Expression;
plus(addend: Expression): Expression;
reduce(bank: Bank, to: string): Money
}
class Money implements Expression {
private _amount: number
private _currency: string
function createReportData(readList, recommendList) {
const reportData = {};
reportData.userName = readList.name;
reportData.readBooks = readList.books
.map(book => {
return {...book, point: point(book)};
});
reportData.total = total(reportData);
return reportData;
const createReportData = require('./createReportData');
function generateReadReport(readList, recommendList) {
const reportData = createReportData(readList, recommendList);
return renderPlainText(reportData);
}
function renderPlainText(reportData) {
let report = `name: ${reportData.userName}\n`;
report += '-----\n';