Lesson 7: 関数・クラスの追加
クラス: 初級
所要時間: 約35分
前提知識: 初級 Lesson 1〜6 完了済み
1. 解説
仕様から実装を生成するパターン
Claude Code に関数・クラスを作らせるとき、仕様の明確さが品質を決める。
レベル1(最低限):
「sort 関数を作ってください」
→ 何をどうソートするか不明
レベル2(ある程度明確):
「ユーザーリストを名前でソートする関数を作ってください」
→ 昇順か降順か、日本語の扱いが不明
レベル3(完全な仕様):
「sortUsers(users, { key='name', order='asc', locale='ja' } = {}) を作成してください。
- key: ソートキー(name / createdAt / age)
- order: 'asc'(昇順)または 'desc'(降順)
- locale: 日本語ソートは 'ja' を指定
- 戻り値: 新しいソート済み配列(元の配列を破壊しない)
- エッジケース: 空配列、要素が1つ、同じ値の場合を考慮」
→ 正確な実装が得られるデザインパターンを指定する
bash
# Singleton
「DB接続を管理する Singleton パターンのクラスを作成してください」
# Observer
「EventEmitter を継承した通知システムを Observer パターンで実装してください」
# Factory
「ユーザーの role によって異なるオブジェクトを返す Factory 関数を作成してください」
# Strategy
「支払い方法(クレジットカード/PayPal/銀行振込)を Strategy パターンで実装してください」2. 実践
Step 1: 仕様から関数を生成
bash
mkdir -p ~/claude-practice/elementary/lesson7/src
cd ~/claude-practice/elementary/lesson7
claudesrc/dateUtils.js を作成してください。以下の関数を含めてください:
formatDate(date, format):
- date: Date オブジェクトまたは ISO文字列
- format: 'YYYY-MM-DD' | 'YYYY/MM/DD' | 'MM/DD/YYYY' | 'DD-MM-YYYY'
- 例: formatDate(new Date('2024-01-15'), 'YYYY/MM/DD') → '2024/01/15'
diffDays(date1, date2):
- 2つの日付の差(日数)を返す
- 絶対値で返す(順序は関係ない)
isWeekend(date):
- 土曜・日曜なら true
addBusinessDays(date, days):
- 営業日(月〜金)を days 日分進めた日付を返す
- 例: 金曜日に addBusinessDays(fri, 1) → 月曜日
getMonthRange(year, month):
- { start: Date, end: Date } を返す(月初〜月末)Step 2: デザインパターンで実装
Observer パターンを使って src/notificationSystem.js を作成してください。
- NotificationSystem クラス
- subscribe(event, handler): イベントを購読
- unsubscribe(event, handler): 購読解除
- publish(event, data): イベントを発行
- subscriptionCount(event): 購読者数を返す
- 使用例(コメントとして記述):
const ns = new NotificationSystem();
ns.subscribe('user.created', (data) => sendWelcomeEmail(data));
ns.publish('user.created', { email: 'user@example.com' });Step 3: 既存クラスを継承して拡張
src/priorityNotificationSystem.js を作成してください。
NotificationSystem を継承して、以下を追加します:
- priority 付きの publish: publishWithPriority(event, data, priority)
- priority: 'high' | 'medium' | 'low'
- high は同期で即時実行
- medium / low はキューに入れて次のイベントループで実行
- processQueue(): キュー内のイベントを手動で処理Step 4: 動作確認
bash
node -e "
const DateUtils = require('./src/dateUtils');
console.log(DateUtils.formatDate(new Date('2024-01-15'), 'YYYY/MM/DD'));
console.log(DateUtils.diffDays(new Date('2024-01-01'), new Date('2024-01-15')));
console.log(DateUtils.isWeekend(new Date('2024-01-13'))); // 土曜日
console.log(DateUtils.addBusinessDays(new Date('2024-01-12'), 1)); // 金曜→月曜
"3. 確認課題(Assignment)
課題 7-1: 仕様作成から実装まで
自分で以下の仕様を考えて、Claude Code に実装させせよ。
実装するもの: src/passwordUtils.js
最低限含めるべき関数:
generatePassword(options): パスワード生成validatePassword(password, rules): パスワードバリデーションhashPassword(password): ハッシュ化(bcrypt不使用でOK)
達成条件: 自分で書いた仕様から正確な実装が生成されること
課題 7-2: デザインパターンの適用
以下の要件を満たす src/cache.js を作成してください:
- LRU(Least Recently Used)キャッシュを実装
- new LRUCache(capacity) でキャパシティを指定
- get(key): 値を返す(なければ null)
- set(key, value): 値をセット(容量超過時は最も古いものを削除)
- has(key): キーの存在確認
- size(): 現在のエントリ数
Map を使って O(1) のアクセスを実現してください。達成条件: capacity=2 のキャッシュで set→set→set→get が正しく動作すること
課題 7-3: 段階的な設計
src/pipeline.js に Pipeline パターンを実装してください。
使い方のイメージ:
const result = new Pipeline(data)
.pipe(filterNulls)
.pipe(normalize)
.pipe(validate)
.execute();
- pipe(fn): 処理ステップを追加(チェーン可能)
- execute(): パイプラインを実行して結果を返す
- async に対応(各ステップが Promise を返してもOK)達成条件: 同期・非同期両方のステップを含むパイプラインが動作すること
