Skip to content

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
claude
src/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 のキャッシュで setsetsetget が正しく動作すること

課題 7-3: 段階的な設計

src/pipeline.js に Pipeline パターンを実装してください。

使い方のイメージ:
  const result = new Pipeline(data)
    .pipe(filterNulls)
    .pipe(normalize)
    .pipe(validate)
    .execute();

- pipe(fn): 処理ステップを追加(チェーン可能)
- execute(): パイプラインを実行して結果を返す
- async に対応(各ステップが Promise を返してもOK)

達成条件: 同期・非同期両方のステップを含むパイプラインが動作すること


自己チェックリスト


次の型

Lesson 8: コードレビューの依頼 →

Claude Code Dojo