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 }
EOFPhase 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. 初級クラス修了チェックリスト
おめでとうございる!
初級クラスを修了した。次は中級クラスで、リファクタリング・テスト自動生成・複数ファイルにまたがる修正に挑戦しよう!
中級クラスは近日公開予定だ。
