Skip to content

Lesson 12: 初級クラス総合演習

クラス: 初級
所要時間: 約90分
前提知識: 初級 Lesson 1〜11 完了済み


1. 概要

この型は初級クラスの集大成だ。 実際の開発現場に近い「バグだらけのレガシープロジェクト」を引き継いで、 コードリーディング → デバッグ → リファクタリング → 機能追加 → Git管理 を一通り体験する。

今回の演習テーマ

「壊れた在庫管理システムを修復・改善せよ」


2. 演習手順

Phase 1: プロジェクトのセットアップ

bash
mkdir -p ~/claude-practice/elementary/lesson12/{src,tests,logs}
cd ~/claude-practice/elementary/lesson12
git init
git config user.email "student@example.com"
git config user.name "Claude Student"
bash
cat > src/inventory.js << 'EOF'
var db = []
var idCounter = 1

function addItem(nm, qty, prc, cat) {
  if(qty < 0) throw "invalid"
  var item = {id: idCounter++, name: nm, qty: qty, price: prc, cat: cat, updatedAt: Date.now()}
  db.push(item)
  return item
}

function removeItem(id) {
  for(var i=0;i<db.length;i++) {
    if(db[i].id == id) { db.splice(i, 1); return true }
  }
  return false
}

function updateQty(id, delta) {
  for(var i=0;i<db.length;i++) {
    if(db[i].id == id) {
      db[i].qty += delta  // マイナスになる可能性
      db[i].updatedAt = Date.now()
      return db[i]
    }
  }
}

function getItems(cat) {
  if(cat) return db.filter(function(i){ return i.cat == cat })
  return db
}

function calcValue() {
  var total = 0
  for(var i=0;i<db.length;i++) {
    total += db[i].price * db[i].qty
  }
  return total
}

function findLowStock(threshold) {
  return db.filter(function(i) { return i.qty < threshold })
}

module.exports = { addItem, removeItem, updateQty, getItems, calcValue, findLowStock }
EOF

cat > src/report.js << 'EOF'
const inv = require('./inventory')

function generateReport() {
  var items = inv.getItems()
  var report = '=== 在庫レポート ===\n'
  for(var i=0;i<items.length;i++) {
    report += items[i].name + ': ' + items[i].qty + '個 (@' + items[i].price + '円)\n'
  }
  report += '合計在庫金額: ' + inv.calcValue() + '円\n'
  report += '低在庫アイテム: ' + inv.findLowStock(5).length + '件\n'
  return report
}

function exportCSV() {
  var items = inv.getItems()
  var csv = 'id,name,qty,price,category\n'
  for(var i=0;i<items.length;i++) {
    csv += items[i].id + ',' + items[i].name + ',' + items[i].qty + ',' + items[i].price + ',' + items[i].cat + '\n'
  }
  return csv
}

module.exports = { generateReport, exportCSV }
EOF

Phase 2: コードリーディングと問題発見(Lesson 2・3 の応用)

bash
claude
このプロジェクトを初めて引き継ぎました。
src/ の全ファイルを読んで、以下を教えてください:

1. このシステムの目的と機能一覧
2. コードの問題点(バグ・設計・スタイル)をすべてリストアップ
3. 緊急度別(High/Medium/Low)の分類
4. 修正の推奨順序

Phase 3: Git のセットアップ(Lesson 4 の応用)

このプロジェクトを Git で管理します。
1. Node.js 用の .gitignore を作成してください
2. 現在の状態を "initial: legacy inventory system" としてコミットしてください
3. 修正作業用のブランチ fix/legacy-code を作成して切り替えてください

Phase 4: バグ修正(Lesson 3・5 の応用)

High 評価の問題をすべて修正してください。
各修正後に動作確認コマンドを提示してください。

修正完了後:

fix/legacy-code ブランチの変更を適切なコミットメッセージでコミットしてください。
Conventional Commits 形式を使ってください。

Phase 5: リファクタリング(Lesson 1・9 の応用)

別ブランチ refactor/modernize を作成して、
Medium 評価の問題(コードスタイル・可読性)を修正してください:
- ES6+ 構文への変換
- 変数名の改善
- 関数の分割
- エラーハンドリングの統一

Phase 6: 機能追加(Lesson 5・6・7 の応用)

feature/category-stats ブランチで以下を追加してください:

src/inventory.js に:
- getCategoryStats(): カテゴリ別の商品数・在庫数・在庫金額を集計

src/report.js に:
- generateCategoryReport(): カテゴリ別集計レポートを生成
- exportJSON(): JSON形式でのエクスポート

既存の関数は変更しないこと。

Phase 7: テストコード(Lesson 8 の応用)

tests/inventory.test.js を作成してください。
以下のケースをテストしてください:
- addItem が正しいオブジェクトを返すこと
- updateQty でマイナスになる場合にエラーをスローすること(修正済みの場合)
- findLowStock が正しく絞り込むこと
- removeItem が存在しないIDでfalseを返すこと

Phase 8: 最終コミットとまとめ

すべての変更を main ブランチにマージして、
最終的なコミットログを確認してください。
このプロジェクトで行った改善のサマリーを教えてください。

3. 確認課題(Assignment)

課題 12-1: ログ機能の追加

src/logger.js を作成して、inventory.js のすべての操作をログに記録してください:
- logs/inventory.log にJSON形式で追記
- 操作の種類(add/remove/update)、対象ID、タイムスタンプ
- エラーが起きた場合はエラー内容も記録

達成条件: addItem/removeItem/updateQty の操作がすべてログに記録されること

課題 12-2: インポート機能

src/inventory.js に importFromCSV(csvContent) を追加してください。
report.js の exportCSV() で出力したCSVを読み込んで、
在庫データを復元できること。

インポート時のバリデーション:
- price と qty が数値であること
- name が空でないこと
- 重複するIDがある場合はスキップしてwarningを返す

達成条件: exportCSV → importFromCSV のラウンドトリップが正確に機能すること

課題 12-3: 総合コードレビュー

最終的なプロジェクトに対して:

最終版の src/ 以下のすべてのファイルを総合的にレビューしてください。
初級レベルの開発者として、この演習で学んだ観点:
- バグの有無
- リファクタリングの品質
- 機能追加の整合性
- テストの網羅性
- ログの適切さ

をすべて評価して、10点満点でスコアをつけてください。
改善点があれば指摘してください。

達成条件: レビューで7点以上を獲得すること


4. 初級クラス修了チェックリスト


おめでとうございる!

初級クラスを修了した。次は中級クラスで、リファクタリング・テスト自動生成・複数ファイルにまたがる修正に挑戦しよう!

中級クラスは近日公開予定だ。

Claude Code Dojo