レシピ#4-1: Cursorを使った効率的な開発ワークフロー

はじめに

Section 3では、AIを使った基本的な開発プロセスを学びました。このセクションでは、より実践的に、Cursor + Claudeを使った効率的な開発方法を学びます。

ここで紹介する「AIに任せやすい設計」は、ビルダーが一人で開発を回し、作ったものを人に届けるまでのスピードを落とさないための秘伝でもあります。

Cursorでの開発フロー

1. プロジェクトを開く

# プロジェクトディレクトリに移動
cd ~/Development/ai-x-flutter/my_app

# Cursorでプロジェクトを開く
cursor .

2. AIモデルを選択

重要: Cursorの設定でメインモデルをClaude Sonnet 4.5に設定します。

理由: - Flutterのツリー構造理解が最も優れている - 大規模コードの一貫性が高い - 破壊的な変更が少ない - エラーが出にくい

避けるべき: Geminiをコード生成に使うのは避ける(書き換えが大きい、依存関係を壊しやすい)

3. 効果的なプロンプトの書き方

❌ 悪い例

TODOアプリを作って

✅ 良い例

StatefulWidgetを使ったシンプルなTODOアプリを作ってください。

要件:
- TODOの追加(TextFieldとボタン)
- TODOリストの表示(ListView)
- 完了/未完了の切り替え(Checkbox)
- TODOの削除(スワイプまたはボタン)

状態管理:
- Riverpodなどの外部パッケージは使わない
- StatefulWidgetで状態を管理
- データ構造はシンプルなListで

ファイル構成:
- lib/main.dart に全て記述
- 後で分割しやすい構造にする

4. コードレビューをAIに依頼

生成されたコードを必ず確認します:

このコードをレビューしてください:

1. Flutter 3.27のベストプラクティスに従っているか
2. 不要な複雑さはないか
3. パフォーマンス上の問題はないか
4. より良い書き方があれば提案してください

5. エラー修正の依頼

エラーが出たら、エラーメッセージをそのまま貼り付けます:

以下のエラーを修正してください:

[エラーメッセージ全文をコピペ]

このエラーが発生した状況:
- ◯◯の機能を追加しようとした
- △△のボタンを押したら発生

Cursorの便利な機能

1. Cmd+K(Ctrl+K): インライン編集

コードの一部を選択してCmd+Kを押すと、その部分だけを編集できます。

使用例:

// この部分を選択して Cmd+K
Widget build(BuildContext context) {
  return Container(
    child: Text('Hello'),
  );
}

// プロンプト: "このWidgetをカード風のデザインにして"

2. Cmd+L(Ctrl+L): チャット

AIとの対話画面を開きます。設計相談や質問に使います。

3. @ファイル名: 特定のファイルを参照

@main.dart のコードと一貫性を保ちながら、
新しい設定画面を作成してください

4. Composer: 複数ファイルの編集

複数のファイルを同時に編集する必要がある場合に使います。

実践的なワークフロー例

Step 1: アプリのアイデアを整理

まずWeb版Claudeなどで設計を相談:

個人開発で、Flutterを使って以下のアプリを作りたいです:
- シンプルな家計簿アプリ
- 収入/支出の記録
- カテゴリ別の集計
- グラフ表示

個人開発なので、できるだけシンプルな構成にしたいです。
アーキテクチャの提案をお願いします。

Step 2: Cursorでプロジェクト作成

flutter create kakeibo_app
cd kakeibo_app
cursor .

Step 3: データ構造を決める

Cursorで以下のようにプロンプト:

家計簿アプリのデータ構造を設計してください。

必要な情報:
- 日付
- 金額
- カテゴリ(食費、交通費など)
- 収入/支出の区別
- メモ(任意)

以下の形式で提案してください:
1. Dartのクラス定義
2. JSONシリアライゼーション(必要なら)
3. サンプルデータ

注意: できるだけシンプルに。freezedなどの複雑なパッケージは避ける。

Step 4: 画面を作る

先ほど定義したデータ構造を使って、
メイン画面を作成してください。

画面構成:
- AppBar: タイトルと追加ボタン
- Body: 取引リスト(新しい順)
- BottomNavigationBar: ホーム/統計/設定

状態管理: StatefulWidget
データ保存: まずはメモリ内のListで(後でSharedPreferences化)

Step 5: 機能を追加

段階的に機能を追加していきます:

取引の追加機能を実装してください。

1. FloatingActionButtonを押すとダイアログ表示
2. ダイアログの内容:
   - 金額入力(数値キーボード)
   - カテゴリ選択(ドロップダウン)
   - 収入/支出の切り替え(Switch)
   - メモ入力(TextField)
3. 保存ボタンでリストに追加
4. リストを更新して表示

Step 6: リファクタリング

現在のコードを以下の方針でリファクタリングしてください:

1. ファイル分割
   - lib/models/transaction.dart
   - lib/screens/home_screen.dart
   - lib/widgets/transaction_list_item.dart

2. コードの整理
   - 不要なコメント削除
   - マジックナンバーを定数化
   - 重複コードの削減

3. 一貫性の確保
   - 命名規則の統一
   - インデントの統一

ベストプラクティス

1. 小さく始める

最初から完璧を目指さず、まず動くものを作ります。

✅ まず: 基本機能だけの動くアプリ
❌ 最初から: 完璧な設計 + 全機能

2. 段階的に改善

Step 1: メモリ内のデータ
Step 2: SharedPreferencesで永続化
Step 3: SQLiteで高度な検索

3. AIにレビューを依頼

このコードの問題点を指摘してください:
1. バグの可能性
2. パフォーマンス問題
3. 保守性の問題
4. Flutter/Dartのベストプラクティス違反

4. バージョンを明示

このプロジェクトは以下の環境を前提にしてください:
- Flutter 3.27
- Dart 3.6
- Material Design 3

よくある問題と解決策

問題1: AIが古い書き方を提案

解決策:

Flutter 3.27 の最新の書き方で書き直してください。
特に以下に注意:
- Material Design 3
- 最新のナビゲーション
- 非推奨APIを使わない

問題2: 不要な複雑さ

解決策:

このコードをシンプルにしてください。
- 不要な抽象化を削除
- 使われていないクラス/メソッドを削除
- より直感的な実装に変更

問題3: 依存関係の問題

解決策:

pubspec.yamlの依存関係を最小限にしてください。
本当に必要なパッケージだけを残し、
不要なものは標準ライブラリで代替してください。

まとめ

Cursor + Claudeでの開発フロー:

  1. アイデア整理 - Web版Claudeで設計相談
  2. プロジェクト作成 - Flutter create + Cursor起動
  3. データ構造設計 - シンプルなクラス定義
  4. 画面作成 - 段階的に機能追加
  5. リファクタリング - コードの整理と分割
  6. レビュー - AIに問題点を指摘してもらう

重要な原則: - 小さく始める - 段階的に改善 - 外部パッケージは最小限 - バージョンを明示 - AIを信頼しすぎない(必ず確認)

次のレシピでは、なぜRiverpodなどの複雑な状態管理ライブラリを避けるべきかを解説します。

➡️ 次のレシピへ: 02_why_avoid_riverpod.md