533 lines
15 KiB
Markdown
533 lines
15 KiB
Markdown
|
|
# 🔍 Ponshu Room Lite: 包括的コードレビュー
|
|||
|
|
|
|||
|
|
**作成日**: 2026-01-22
|
|||
|
|
**レビュー対象**: v1.0 リリースビルド
|
|||
|
|
**レビュアー**: Claude (Sonnet 4.5)
|
|||
|
|
**目的**: 批判的視点でのコード品質評価と改善提案
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📊 総合評価
|
|||
|
|
|
|||
|
|
| 項目 | 評価 | コメント |
|
|||
|
|
|------|-----|----------|
|
|||
|
|
| **アーキテクチャ** | ⭐⭐⭐⭐☆ | Clean Architecture的、ただしレイヤー分離が甘い部分あり |
|
|||
|
|
| **コード品質** | ⭐⭐⭐☆☆ | 全体的に良好だが、重複コードと技術的負債が散見 |
|
|||
|
|
| **パフォーマンス** | ⭐⭐⭐⭐☆ | 画像圧縮・キャッシュ実装済み、Hero使用も問題なし |
|
|||
|
|
| **UX** | ⭐⭐⭐⭐☆ | ダークモード、アニメーション実装、細かい調整必要 |
|
|||
|
|
| **セキュリティ** | ⭐⭐⭐⭐☆ | API Proxyで保護、デバイスID使用、良好 |
|
|||
|
|
| **テスト可能性** | ⭐⭐☆☆☆ | **最大の弱点**: テストコードが皆無 |
|
|||
|
|
| **ドキュメント** | ⭐⭐⭐⭐☆ | 詳細なドキュメントあり、コード内コメントは少なめ |
|
|||
|
|
|
|||
|
|
**総合**: 🌟🌟🌟⭐ (3.5/5) - **MVP としては優秀、スケール前に改善必要**
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔴 クリティカルな問題点
|
|||
|
|
|
|||
|
|
### 1. **テストコードが完全に欠如**
|
|||
|
|
|
|||
|
|
**問題**:
|
|||
|
|
```dart
|
|||
|
|
// lib/test/ ディレクトリが存在しない
|
|||
|
|
// Unit Test: 0件
|
|||
|
|
// Widget Test: 0件
|
|||
|
|
// Integration Test: 0件
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**影響**:
|
|||
|
|
- リファクタリングが怖い(破壊的変更の検出不可)
|
|||
|
|
- AIとの共同開発で予期しないバグ混入のリスク
|
|||
|
|
- 将来的なスケール時に品質保証が困難
|
|||
|
|
|
|||
|
|
**推奨対策**:
|
|||
|
|
```dart
|
|||
|
|
// test/services/gemini_service_test.dart (例)
|
|||
|
|
void main() {
|
|||
|
|
group('GeminiService', () {
|
|||
|
|
test('should cache analysis results', () async {
|
|||
|
|
final service = GeminiService();
|
|||
|
|
final result1 = await service.analyzeSakeLabel(['test.jpg']);
|
|||
|
|
final result2 = await service.analyzeSakeLabel(['test.jpg']);
|
|||
|
|
|
|||
|
|
expect(result1, equals(result2)); // Same instance from cache
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**優先度**: 🔴 **最高** (Phase 1.1 で最低限のテスト追加を推奨)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 2. **画面遷移アニメーションの不統一** ✅ 今回発見
|
|||
|
|
|
|||
|
|
**問題**:
|
|||
|
|
- Grid: Heroアニメーション(ふわっと拡大)
|
|||
|
|
- List: Heroアニメーション(小さいサムネイルから拡大)
|
|||
|
|
- Carousel: 標準スライド(Heroなし)
|
|||
|
|
|
|||
|
|
**影響**:
|
|||
|
|
- ユーザーが混乱する可能性
|
|||
|
|
- ブランド一貫性の欠如
|
|||
|
|
|
|||
|
|
**推奨対策**:
|
|||
|
|
```dart
|
|||
|
|
// Option A: すべてにHeroを統一(推奨)
|
|||
|
|
// widgets/sake_3d_carousel.dart に Hero を追加
|
|||
|
|
|
|||
|
|
Widget _buildCarouselItem(SakeItem item) {
|
|||
|
|
return GestureDetector(
|
|||
|
|
onTap: () {
|
|||
|
|
Navigator.push(
|
|||
|
|
context,
|
|||
|
|
MaterialPageRoute(
|
|||
|
|
builder: (_) => SakeDetailScreen(sake: item),
|
|||
|
|
),
|
|||
|
|
);
|
|||
|
|
},
|
|||
|
|
child: Hero( // ← 追加
|
|||
|
|
tag: item.id,
|
|||
|
|
child: Card(
|
|||
|
|
// ... 既存のコード
|
|||
|
|
),
|
|||
|
|
),
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**優先度**: 🟡 **中** (UX改善、Phase 1.1)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 3. **エラーハンドリングが不完全**
|
|||
|
|
|
|||
|
|
**問題例**:
|
|||
|
|
```dart
|
|||
|
|
// camera_screen.dart: 670行目
|
|||
|
|
} catch (e) {
|
|||
|
|
errorMessage = '解析中にエラーが発生しました\n\nエラー内容:\n${e.toString()}';
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**批判**:
|
|||
|
|
- ユーザーに生のエラーメッセージを表示(技術的すぎる)
|
|||
|
|
- ログ収集の仕組みがない(デバッグ困難)
|
|||
|
|
- リトライ戦略が一貫していない
|
|||
|
|
|
|||
|
|
**推奨対策**:
|
|||
|
|
```dart
|
|||
|
|
// services/error_handler.dart (新規作成)
|
|||
|
|
class ErrorHandler {
|
|||
|
|
static String getUserFriendlyMessage(dynamic error) {
|
|||
|
|
if (error is SocketException) {
|
|||
|
|
return 'インターネット接続を確認してください';
|
|||
|
|
} else if (error is TimeoutException) {
|
|||
|
|
return '通信がタイムアウトしました。もう一度お試しください';
|
|||
|
|
} else if (error.toString().contains('Quota')) {
|
|||
|
|
return 'AI利用制限に達しました。明日またお試しください';
|
|||
|
|
}
|
|||
|
|
// Unknown error
|
|||
|
|
_logToAnalytics(error); // Firebase Crashlyticsなど
|
|||
|
|
return 'エラーが発生しました。時間をおいて再度お試しください';
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**優先度**: 🟡 **中** (Phase 2.0 でログ基盤整備)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🟡 重要な改善点
|
|||
|
|
|
|||
|
|
### 4. **画像圧縮ロジックが不完全** ✅ Backlogに記載済み
|
|||
|
|
|
|||
|
|
**問題**:
|
|||
|
|
```dart
|
|||
|
|
// services/image_compression_service.dart
|
|||
|
|
// 実装はただのファイルコピーになっている箇所がある可能性
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**確認コード**:
|
|||
|
|
```dart
|
|||
|
|
static Future<String> compressForGemini(String sourcePath, {String? targetPath}) async {
|
|||
|
|
// TODO: 実際の圧縮処理を確認
|
|||
|
|
// flutter_image_compress が正しく動作しているか
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**推奨対策**:
|
|||
|
|
- `flutter_image_compress` の使用を確認
|
|||
|
|
- 圧縮前後のファイルサイズをログ出力(デバッグ用)
|
|||
|
|
- 最適なパラメータ調整(品質 vs サイズ)
|
|||
|
|
|
|||
|
|
**優先度**: 🟡 **中** (Phase 1.1)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 5. **Riverpod の Provider が過剰に分散**
|
|||
|
|
|
|||
|
|
**問題**:
|
|||
|
|
```dart
|
|||
|
|
// 15個以上のProviderが各所に散在
|
|||
|
|
// - userProfileProvider
|
|||
|
|
// - sakeListProvider
|
|||
|
|
// - displayModeProvider
|
|||
|
|
// - menuModeProvider
|
|||
|
|
// - uiExperimentProvider
|
|||
|
|
// ... etc
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**批判**:
|
|||
|
|
- 依存関係が追いにくい
|
|||
|
|
- グローバル状態管理の明確な設計がない
|
|||
|
|
|
|||
|
|
**推奨対策**:
|
|||
|
|
```dart
|
|||
|
|
// providers/app_state.dart (統合)
|
|||
|
|
@Riverpod(keepAlive: true)
|
|||
|
|
class AppState extends _$AppState {
|
|||
|
|
@override
|
|||
|
|
AppStateData build() {
|
|||
|
|
return AppStateData(
|
|||
|
|
user: ref.watch(userProfileProvider),
|
|||
|
|
sakeList: ref.watch(sakeListProvider),
|
|||
|
|
ui: ref.watch(uiExperimentProvider),
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 各画面は AppState 経由でアクセス
|
|||
|
|
final appState = ref.watch(appStateProvider);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**優先度**: 🟢 **低** (Phase 3.0 リファクタリング時)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 6. **ダークモードの色指定が一貫していない**
|
|||
|
|
|
|||
|
|
**問題**:
|
|||
|
|
```dart
|
|||
|
|
// 一部の画面でハードコードされた色
|
|||
|
|
color: Colors.grey[800] // ← ダークモードを想定
|
|||
|
|
color: Theme.of(context).colorScheme.surface // ← 正しい
|
|||
|
|
|
|||
|
|
// app_theme.dart にガイドラインはあるが、強制力がない
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**推奨対策**:
|
|||
|
|
- `app_theme.dart` で定数定義を徹底
|
|||
|
|
- Lint ルールで `Colors.grey` の直接使用を禁止
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
# analysis_options.yaml
|
|||
|
|
linter:
|
|||
|
|
rules:
|
|||
|
|
- avoid_relative_lib_imports
|
|||
|
|
- prefer_const_constructors
|
|||
|
|
# カスタムルール追加(要プラグイン)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**優先度**: 🟡 **中** (Phase 1.1)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ✅ 優れている点
|
|||
|
|
|
|||
|
|
### 1. **Schema v2.0 の設計**
|
|||
|
|
|
|||
|
|
```dart
|
|||
|
|
// models/sake_item.dart
|
|||
|
|
// レガシーフィールドと新フィールドの共存
|
|||
|
|
// マイグレーション対応が秀逸
|
|||
|
|
@HiveField(20) DisplayData? _displayData;
|
|||
|
|
@HiveField(1) final String? legacyName;
|
|||
|
|
|
|||
|
|
// Getter で自動マイグレーション
|
|||
|
|
DisplayData get displayData {
|
|||
|
|
if (_displayData != null) return _displayData!;
|
|||
|
|
return DisplayData(name: legacyName ?? 'Unknown', ...);
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**評価**: ⭐⭐⭐⭐⭐
|
|||
|
|
- 下位互換性を保ちながら進化
|
|||
|
|
- Hiveの仕様を理解した良い設計
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 2. **AI Proxy による API Key 保護**
|
|||
|
|
|
|||
|
|
```dart
|
|||
|
|
// services/gemini_service.dart
|
|||
|
|
static final String _proxyUrl = Secrets.aiProxyAnalyzeUrl;
|
|||
|
|
|
|||
|
|
// デバイスIDでレート制限
|
|||
|
|
final deviceId = await DeviceService.getDeviceId();
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**評価**: ⭐⭐⭐⭐⭐
|
|||
|
|
- クライアントにAPI Keyを埋め込まない
|
|||
|
|
- Synology上のProxyで一元管理
|
|||
|
|
- セキュリティベストプラクティス
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 3. **Gamification Service の実装**
|
|||
|
|
|
|||
|
|
```dart
|
|||
|
|
// services/gamification_service.dart
|
|||
|
|
// バッジ解除ロジックが明確
|
|||
|
|
static Future<List<Badge>> checkAndUnlockBadges(WidgetRef ref) async {
|
|||
|
|
// 条件チェック → 解除 → 保存
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**評価**: ⭐⭐⭐⭐☆
|
|||
|
|
- ロジックが集約されている
|
|||
|
|
- ただし、バッジ定義がハードコード(将来的にJSONファイル化推奨)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔧 技術的負債
|
|||
|
|
|
|||
|
|
### 1. **Flutter Analyze の 49個の警告** ✅ Backlogに記載済み
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
$ flutter analyze
|
|||
|
|
Analyzing ponshu_room_lite...
|
|||
|
|
49 issues found. (49 infos)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**内容**:
|
|||
|
|
- 未使用import
|
|||
|
|
- 非推奨API使用
|
|||
|
|
- 型アノテーション欠如
|
|||
|
|
|
|||
|
|
**推奨**:
|
|||
|
|
```bash
|
|||
|
|
# 一括修正
|
|||
|
|
$ dart fix --apply
|
|||
|
|
|
|||
|
|
# 段階的修正(警告レベル別)
|
|||
|
|
$ flutter analyze --no-fatal-infos
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 2. **コメントが少ない**
|
|||
|
|
|
|||
|
|
```dart
|
|||
|
|
// camera_screen.dart: 992行 のうち、説明コメントは約5%
|
|||
|
|
// 複雑なロジック(露出調整、ズーム)の説明がない
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**推奨**:
|
|||
|
|
```dart
|
|||
|
|
/// Instagramスタイルの露出調整スライダー
|
|||
|
|
///
|
|||
|
|
/// 上にドラッグ: 明るく (+)
|
|||
|
|
/// 下にドラッグ: 暗く (-)
|
|||
|
|
/// ダブルタップ: リセット (0.0)
|
|||
|
|
///
|
|||
|
|
/// スロットリング: 30ms (カメラAPIの負荷軽減)
|
|||
|
|
void _onVerticalDragUpdate(DragUpdateDetails details) async {
|
|||
|
|
// ...
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📋 統合タスクリスト(優先度順)
|
|||
|
|
|
|||
|
|
以下に、既存のBacklogと今回の発見を統合した**最終的な残タスクリスト**を示します。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 🎯 Ponshu Room Lite: 統合残タスクリスト
|
|||
|
|
|
|||
|
|
**最終更新**: 2026-01-22 (Claude レビュー後)
|
|||
|
|
**ソース**: PROJECT_BACKLOG_MASTER.md + UI_UX_BACKLOG.md + 今回のコードレビュー
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔴 Phase 1.1: 緊急修正 & Quick Wins (今週〜来週)
|
|||
|
|
|
|||
|
|
### 🐛 バグ修正
|
|||
|
|
- [x] ~~Coach Mark Persistence~~ ✅ 解決済み (Tutorial削除)
|
|||
|
|
- [x] ~~Dark Mode プロフィール色~~ ✅ 本セッションで修正
|
|||
|
|
- [x] ~~AI詳細セクション UI~~ ✅ 本セッションで修正
|
|||
|
|
- [x] ~~製造年月カレンダー選択~~ ✅ 本セッションで実装
|
|||
|
|
|
|||
|
|
### 🎨 UX 即座改善
|
|||
|
|
- [ ] **Hero アニメーション統一** (NEW! 🔥)
|
|||
|
|
- Carouselに Hero タグ追加
|
|||
|
|
- 全遷移を「ふわっと浮き上がる」に統一
|
|||
|
|
- 推定: 0.5h
|
|||
|
|
|
|||
|
|
- [x] ~~**カメラUI 明るさ調整の視覚化**~~ ✅ **実装済み** (Antigravity報告は誤り)
|
|||
|
|
- 太陽アイコン・縦スライダー・月アイコン・数値表示すべて完備
|
|||
|
|
- camera_screen.dart: 239-340行目に完全実装
|
|||
|
|
- 推定: 0h (不要)
|
|||
|
|
|
|||
|
|
- [ ] **ソムリエ画面レイアウト修正** (Antigravity報告)
|
|||
|
|
- 分析結果の余白調整
|
|||
|
|
- シェアボタンが隠れる問題
|
|||
|
|
- 推定: 1h
|
|||
|
|
|
|||
|
|
- [ ] **マップ機能強化** (Antigravity報告)
|
|||
|
|
- 県タップ時にボトムシート表示
|
|||
|
|
- その県の日本酒リストへジャンプ
|
|||
|
|
- 推定: 3h
|
|||
|
|
|
|||
|
|
### 🧪 テスト基盤構築 (NEW! 🔥 **最優先**)
|
|||
|
|
- [ ] **最低限のUnit Test追加**
|
|||
|
|
- `test/services/gemini_service_test.dart` (キャッシュ動作)
|
|||
|
|
- `test/services/level_calculator_test.dart` (レベル計算ロジック)
|
|||
|
|
- `test/models/sake_item_test.dart` (マイグレーション)
|
|||
|
|
- 推定: 6h
|
|||
|
|
- **理由**: リファクタリング前の安全網
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🟡 Phase 2.0: ビジネス価値 & エンゲージメント (2〜3週間後)
|
|||
|
|
|
|||
|
|
### 🎮 Gamification拡張
|
|||
|
|
- [ ] **バッジ拡張 (18個追加)**
|
|||
|
|
- 地域バッジ (7): 東北✅、関東、関西、北陸、中部、中国、九州、全国制覇
|
|||
|
|
- 活動バッジ (6): 初心者(1本)、愛好家(10本)、コレクター(50本)、マスター(100本)、伝説(500本)、神(1000本)
|
|||
|
|
- タイプバッジ (3): 純米党、吟醸党、大吟醸党
|
|||
|
|
- ビジネスバッジ (2): お品書き職人、セット名人
|
|||
|
|
- 推定: 8h
|
|||
|
|
|
|||
|
|
- [ ] **バッジ解除モーダル**
|
|||
|
|
- SnackBar → 祝福ダイアログ (紙吹雪アニメーション)
|
|||
|
|
- 推定: 3.5h
|
|||
|
|
|
|||
|
|
- [ ] **経験値システム拡張**
|
|||
|
|
- スキャン: +10 EXP (実装済み)
|
|||
|
|
- レビュー投稿: +3 EXP (新規)
|
|||
|
|
- メモ追加: +1 EXP (新規)
|
|||
|
|
- 推定: 4h
|
|||
|
|
|
|||
|
|
### 🏗️ ビジネス機能
|
|||
|
|
- [ ] **Instagram プロモーション支援**
|
|||
|
|
- AI キャプション生成 (Gemini)
|
|||
|
|
- ハッシュタグ提案 (#日本酒 #sake #純米大吟醸)
|
|||
|
|
- 画像 + テキスト共有
|
|||
|
|
- 推定: 8h
|
|||
|
|
|
|||
|
|
- [ ] **セット商品価格設定UX改善**
|
|||
|
|
- ステップ式入力 (原価 → 売価 → マージン自動計算)
|
|||
|
|
- 推定: 4h
|
|||
|
|
|
|||
|
|
### 🏗️ インフラ (Synology)
|
|||
|
|
- [ ] **Dokploy セットアップ**
|
|||
|
|
- Ubuntu VM に Dokploy インストール
|
|||
|
|
- Tailscale Funnel で安全な公開
|
|||
|
|
- 推定: 2h
|
|||
|
|
|
|||
|
|
- [ ] **Gitea 連携**
|
|||
|
|
- Webhook → 自動デプロイ
|
|||
|
|
- AI用Giteaアカウント作成 (Claude/Gemini/Antigravity)
|
|||
|
|
- 推定: 2h
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🟢 Phase 3.0: スケーラビリティ & 長期改善 (1〜2ヶ月後)
|
|||
|
|
|
|||
|
|
### 🔮 AI店主 (True Recommendations)
|
|||
|
|
- [ ] **Gemini チャット実装**
|
|||
|
|
- 「今の気分」から日本酒提案
|
|||
|
|
- DB外のお酒も推薦可能
|
|||
|
|
- 推定: 12h
|
|||
|
|
|
|||
|
|
### 🏗️ プレースホルダー → 実機能化
|
|||
|
|
- [ ] **蔵元マップ**
|
|||
|
|
- 実データ統合
|
|||
|
|
- Google Maps連携
|
|||
|
|
- 推定: 12h
|
|||
|
|
|
|||
|
|
- [ ] **販売分析**
|
|||
|
|
- チャート表示 (売上トレンド、味覚分布)
|
|||
|
|
- 推定: 10h
|
|||
|
|
|
|||
|
|
- [ ] **位置情報ボーナス**
|
|||
|
|
- GPS で蔵元訪問検知 → ボーナスEXP
|
|||
|
|
- 推定: 6h
|
|||
|
|
|
|||
|
|
### 🎨 マイクロインタラクション
|
|||
|
|
- [ ] **タブ切り替えアニメーション**
|
|||
|
|
- Fade/Slide効果
|
|||
|
|
- 推定: 2h
|
|||
|
|
|
|||
|
|
- [ ] **ダイアログエントランス**
|
|||
|
|
- Scale/Fade In
|
|||
|
|
- 推定: 1.5h
|
|||
|
|
|
|||
|
|
- [ ] **Munyun (いいね) アニメーション**
|
|||
|
|
- Rive/Lottie アニメーション
|
|||
|
|
- 推定: 4h
|
|||
|
|
|
|||
|
|
### 🐛 技術的負債
|
|||
|
|
- [ ] **Flutter Analyze 警告解消 (49件)**
|
|||
|
|
- `dart fix --apply` 実行
|
|||
|
|
- 手動修正が必要な箇所を対処
|
|||
|
|
- 推定: 2h
|
|||
|
|
|
|||
|
|
- [ ] **画像圧縮ロジック検証**
|
|||
|
|
- `flutter_image_compress` の動作確認
|
|||
|
|
- 圧縮前後のサイズログ追加
|
|||
|
|
- 推定: 3h
|
|||
|
|
|
|||
|
|
- [ ] **PDF フォント埋め込み検証**
|
|||
|
|
- Potta One フォントが正しく表示されるか
|
|||
|
|
- 推定: 2h
|
|||
|
|
|
|||
|
|
- [ ] **エラーハンドリング統一**
|
|||
|
|
- `ErrorHandler` サービス作成
|
|||
|
|
- ユーザーフレンドリーなメッセージ変換
|
|||
|
|
- Firebase Crashlytics 連携
|
|||
|
|
- 推定: 6h
|
|||
|
|
|
|||
|
|
- [ ] **Provider の整理**
|
|||
|
|
- `AppState` に統合
|
|||
|
|
- 依存関係の可視化
|
|||
|
|
- 推定: 8h (大規模リファクタリング)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📊 タスク数サマリー
|
|||
|
|
|
|||
|
|
| Phase | 緊急 (🔴) | 重要 (🟡) | 将来 (🟢) | 合計 |
|
|||
|
|
|-------|---------|---------|---------|------|
|
|||
|
|
| **1.1 (今週)** | 7 | - | - | 7 |
|
|||
|
|
| **2.0 (2-3週)** | - | 10 | - | 10 |
|
|||
|
|
| **3.0 (1-2ヶ月)** | - | - | 12 | 12 |
|
|||
|
|
| **合計** | 7 | 10 | 12 | **29** |
|
|||
|
|
|
|||
|
|
*(既存52タスクから、完了済み・重複を除外して統合)*
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🚦 推奨実行順序 (共同開発者テスト前)
|
|||
|
|
|
|||
|
|
1. ✅ **Hero統一** (0.5h) - 即座改善、UX一貫性
|
|||
|
|
2. ✅ **ソムリエ/マップ** (4h) - Antigravity報告対応(カメラUIは実装済み)
|
|||
|
|
3. ✅ **テスト基盤** (6h) - **最優先** (リファクタリング前の保険)
|
|||
|
|
4. ✅ **バッジ拡張** (8h) - エンゲージメント向上
|
|||
|
|
|
|||
|
|
**合計: 18.5h (約2-3日)**
|
|||
|
|
|
|||
|
|
これらを完了させてから共同開発者テストに入ると、フィードバックがより建設的になります。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📝 備考
|
|||
|
|
|
|||
|
|
- **テストコードの重要性**: 現在テストが0件なので、AIとの共同開発でバグが混入しやすい。Phase 1.1でテスト基盤を作ることを**強く推奨**。
|
|||
|
|
- **Hero統一**: 今回のレビューで発見。UXの一貫性向上のため、早めの対応推奨。
|
|||
|
|
- **Antigravity報告**: カメラUI、ソムリエ、マップの3点は実機テストで確認済みの問題。優先度高。
|
|||
|
|
|