laravel-iterating-on-code について
AIが生成したPHPコードを、具体的なフィードバックと段階的な変更で改善するためのスキルです。問題と影響を示し、修正案を提示して各段階で検証する方法を扱います。
主な機能
- 01具体的なフィードバックの型
- 02問題・影響・修正の例
- 03段階的な検証ガイド
- 04正確性とスタイルの例
活用シーン
- 01バリデーションルールの修正
- 02不足しているエラー処理の追加
- 03クエリ性能の改善
- 04コードをスタイル規約に適合
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ noartem/ skills --skill laravel-iterating-on-codeインストール後、Claude Code で/laravel-iterating-on-codeを入力して読み込まれたか確認します。
詳細
コードの反復改善
AI が生成したコードは、最初から完璧であることはほとんどありません。効果的に反復改善することで、「あと少し」を「まさに求めていたもの」に近づけられます。
正しくないコード
曖昧なフィードバック
「動きません」
具体的なフィードバック
「バリデーションが正しくありません。
現在のコード:
'email' => 'required|email|unique:users'
問題: これでは、ユーザーのメールアドレスを、別のユーザーがすでに使用しているメールアドレスに更新できてしまいます。一意性ルールでは、現在のユーザーを除外する必要があります。
修正:
'email' => [
'required',
'email',
Rule::unique('users')->ignore($this->user()->id)
]
これにより、ユーザーは自分のメールアドレスをそのまま使用できますが、ほかのユーザーとの重複は防げます。」
効果がある理由: 問題を具体的に特定し、誤りの理由を説明したうえで、正しい解決策を示しています。
不完全なコード
曖昧
「何かが足りません」
具体的
「OrderService にエラー処理がありません。
現在の実装:
public function createOrder(array $data): Order
{
$order = Order::create($data);
$this->processPayment($order);
return $order;
}
不足しているもの:
- トランザクションによるラップ(決済と注文作成をアトミックにする必要があります)
- 決済失敗時の処理
- 注文作成前の在庫確認
- 作成成功後のイベントディスパッチ
追加内容:
DB::transaction(function () use ($data) {
$this->validateInventory($data['items']);
$order = Order::create($data);
$this->processPayment($order);
event(new OrderCreated($order));
return $order;
});
さらに、決済失敗に対する try/catch を追加してください。」
効果がある理由: 不足しているものを具体的な背景とともに列挙し、追加方法を示しています。
改善が必要なコード
曖昧
「もっと良くしてください」
具体的
「パフォーマンスを改善するためにクエリを最適化してください。
現在のコード:
$products = Product::all()->filter(function ($product) {
return $product->isActive() && $product->inStock();
});
問題点:
- すべての商品をメモリに読み込んでいる(大規模なデータセットでは非効率)
- データベースではなく PHP でフィルタリングしている
- 各商品に対してメソッドを呼び出している(N+1 問題が発生する可能性)
改善後:
$products = Product::query()
->where('active', true)
->where('stock_quantity', '>', 0)
->get();
フィルタリングをデータベースに移し、インデックス付きのカラムを使用して、不要なデータの読み込みを避けてください。」
効果がある理由: 改善が必要な点とその理由を説明し、改善後のコードを示しています。
スタイルの問題
曖昧
「スタイルガイドに従ってください」
具体的
「コーディング規約に合わせて更新してください。
現在のコード:
public function get_user_orders($userId) {
return Order::where('user_id', $userId)->get();
}
スタイルの問題:
- メソッド名は camelCase にする必要があります:
getUserOrders - パラメーターは camelCase にする必要があります:
$userId✓(すでに正しい) - 戻り値の型ヒントがありません
- 複雑なクエリの docblock がありません
修正後:
/**
* Get all orders for a specific user.
*/
public function getUserOrders(int $userId): Collection
{
return Order::where('user_id', $userId)->get();
}
スタイルガイドを参照してください:docs/coding-standards.md」
効果がある理由: 具体的なスタイル違反を指摘し、修正内容を示して、スタイルガイドを参照しています。
段階的な検証
悪いアプローチ
「バリデーションを変更し、エラー処理を追加して、サービスをリファクタリングし、テストを更新して、ログ記録も追加してください」
良いアプローチ
「一つずつ順に進めましょう。
ステップ 1: まずバリデーションの問題を修正します。
'email' => Rule::unique('users')->ignore($this->user()->id)
次に進む前に、これが正しく動作するか確認しましょう。」
[バリデーションが正しく動作することを確認した後]
「ステップ 2: 次に、決済処理のエラー処理を追加します。
try {
$this->processPayment($order);
} catch (PaymentException $e) {
Log::error('Payment failed', ['order' => $order->id]);
throw new OrderProcessingException('Payment failed', previous: $e);
}
続ける前に、これをテストしてください。」
効果がある理由: 変更を一度に一つずつ加え、各ステップを検証することで、段階的に確実性を高められます。
フィードバックのパターン
パターン:指摘 + 説明 + 修正例
"The relationship is incorrect:
**Current:** `return $this->hasMany(Post::class);`
**Problem:** A User has many Posts, but you're defining this in the Post model. This creates a circular relationship.
**Fix:** Move this to the User model, or if you meant Post belongs to User:
```php
// In Post model
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
```"
パターン:不足しているもの + 重要な理由 + 追加方法
"Missing authorization check:
**Why it matters:** Any authenticated user can delete any order, not just their own.
**Add this to OrderController@destroy:**
```php
$this->authorize('delete', $order);
さらに、ポリシーメソッドを作成してください。
// In OrderPolicy
public function delete(User $user, Order $order): bool
{
return $user->id === $order->user_id;
}
```"
パターン:現在のコード + 問題点 + 改善後
"Current implementation has issues:
**Current:**
```php
foreach ($orders as $order) {
$order->load('items', 'customer', 'shipping');
}
問題点:
- N+1 クエリ(ループ内でリレーションを読み込んでいる)
- 大規模なデータセットでは非効率
改善後:
$orders = Order::with(['items', 'customer', 'shipping'])->get();
Eager Loading を使用した単一のクエリです。」
## Quick Reference
Iterate effectively:
- **Be specific** - Point to exact lines, explain exact problems
- **Show, don't just tell** - Provide corrected code
- **Explain why** - Help the AI understand the reasoning
- **One change at a time** - Validate incrementally
- **Reference standards** - Point to style guides, docs, examples
Specific feedback = better iterations = code that fits your needs.