Newer
Older
MiniTias / docs / 01_GUIDE / GUIDE_06_コーディング規約.md

コーディング規約 (Coding Standards)

本ドキュメントでは,MiniTIAS プロジェクトの Dart / Flutter コーディング規約を定義する. 基本方針として Effective Dart に準拠し,プロジェクト固有のルールのみ本書で定める.

フォーマット (Formatting)

  • dart format のデフォルト設定に従う(行幅 80 文字)
  • VS Code の「保存時フォーマット」を有効にする(.vscode/settings.json で設定済み)
  • 手動でのフォーマット調整は行わない

命名規則 (Naming Conventions)

Effective Dart の命名規則に従う.プロジェクト固有の補足は以下の通り.

対象規則
ファイル名snake_casecamera_provider.dart
クラス名UpperCamelCaseCameraProvider
変数・関数lowerCamelCasetakePhoto()
定数lowerCamelCasedefaultImageQuality
プライベート先頭に __controller
Provider〇〇ProviderCameraProvider
Service〇〇ServiceFileService
Screen(画面)〇〇ScreenCaptureScreen
Widget(部品)機能を表す名前ShutterButton

import 順序 (Import Order)

以下の順序で記述し,各グループ間は空行で区切る.

// 1. Dart SDK
import 'dart:async';
import 'dart:io';

// 2. Flutter SDK
import 'package:flutter/material.dart';

// 3. 外部パッケージ(pub.dev)
import 'package:camera/camera.dart';
import 'package:provider/provider.dart';

// 4. プロジェクト内
import 'package:mini_tias/providers/camera_provider.dart';
import 'package:mini_tias/services/file_service.dart';

dart fix --apply および dart format で自動整列されるため,手動調整は不要.

ディレクトリ構造 (Directory Structure)

SPEC_01_画面機能仕様書 のアーキテクチャセクションで定義したディレクトリ構成に従う.

lib/
├── main.dart                  # エントリポイント,Provider 登録
├── app.dart                   # MaterialApp,テーマ
├── providers/                 # 状態管理(ChangeNotifier)
├── screens/                   # 画面(Scaffold 単位)
├── widgets/                   # 再利用可能な UI 部品
└── services/                  # 外部リソースとの橋渡し

配置ルール

  • 1 ファイル 1 クラス を原則とする.ファイル名はクラス名の snake_case 版
  • screens/: 各画面に対応する 1 ファイル.画面固有のロジックは対応する Provider に置く
  • widgets/: 複数画面で再利用する UI 部品,または画面ファイルが大きくなった場合に切り出す部品
  • providers/: 画面または機能ごとに 1 ファイル.ChangeNotifier を継承する
  • services/: プラットフォーム API やファイルシステムへのアクセスを担う

型の使い方 (Type Usage)

  • ローカル変数は型推論(var / final)を活用する
  • 関数の引数・戻り値には明示的に型を記述する
  • dynamic は避け,Object? を使用する
  • final をデフォルトとし,再代入が必要な場合のみ var を使用する

エラーハンドリング (Error Handling)

基本方針

  • Service 層: 例外をキャッチし,呼び出し元に結果を返す.想定外の例外はそのまま上位に伝播させる
  • Provider 層: Service の結果を受け取り,状態(エラーメッセージ等)として保持する
  • Screen 層: Provider の状態を参照し,ユーザーにフィードバックを表示する(スナックバー等)

想定するエラー

エラー発生箇所対処
カメラ初期化失敗CameraProviderエラーメッセージを画面に表示
パーミッション拒否PermissionService設定画面への誘導を表示
ストレージ書き込み失敗FileServiceスナックバーでエラー通知
ファイル削除失敗FileServiceスナックバーでエラー通知

ログ出力

  • 開発中は debugPrint() を使用する(リリースビルドでは自動的に無効化される)
  • print() は使用しない

ドキュメント (Documentation)

コード内コメント

  • DartDoc コメント(///: 公開 API(public なクラス・メソッド)に記述する
  • 実装コメント(//: ロジックが自明でない箇所にのみ記述する
  • 「何をしているか」ではなく「なぜそうしているか」を書く

DartDoc の書き方

/// 撮影画像を PNG 形式で共有ストレージに保存する.
///
/// [imageBytes] は JPEG エンコード済みの画像データ.
/// 保存先は `Pictures/MiniTIAS/` ディレクトリ.
/// 同秒の重複ファイルが存在する場合は連番サフィックスを付与する.
Future<String> saveImage(Uint8List imageBytes) async {
  // ...
}
  • 1 行目は動詞で始める簡潔な要約(句点で終わる)
  • 詳細が必要な場合は空行を挟んで続ける
  • パラメータの説明は [paramName] 記法を使用する