Home
Get Started
実践ガイド
外部仕様設計
バッチ処理仕様設計
UAC 仕様設計
データ仕様設計
インフラ設計
移行計画
テスト方針・計画
開発プロセス・規約
コーディング規約・命名規則
開発チーム全体で統一されたコーディングスタイルを維持し、コードの可読性・保守性を向上させるセクションです。言語別の規約、命名規則、ファイル構成、コメント規約、AWSリソース命名規則を包括的に定義しています。
🎯 概要
- 目的: 開発チーム全体で統一されたコーディングスタイルを維持し、コードの可読性・保守性を向上させることで、バグの混入を防ぎ、レビュー効率を高める
- スコープ: プロジェクトで使用する全てのプログラミング言語のコーディング規約、命名規則、ファイル構成規則、コメント規約、AWSリソース命名規則をカバーする
- 推奨する実施タイミング: プロジェクト開始時に規約を策定し、実装開始前に開発メンバー全員で合意する
- 関連するステークホルダー: 開発リーダー、開発メンバー全員、コードレビュアー
📥 重要な前提知識・インプット
- 前提知識: 採用するプログラミング言語の基本文法、一般的なコーディング規約(PascalCase、camelCase、snake_caseなど)、静的解析ツールの使い方
- インプット: 採用技術スタック一覧、システムアーキテクチャ設計書、既存プロジェクトのコーディング規約(ある場合)
📄 成果物の定義
- ドキュメントテンプレート: 📄
[テンプレ]コーディング規約・命名規則
- 必須要素: 言語別コーディング規約、命名規則一覧、ファイル・ディレクトリ構成規則、コメント規約、静的解析ツール設定ファイル、コードレビューチェックリスト
✅ 品質基準・レビュー観点
✅ 品質チェックリスト:
| チェック項目 | チェック内容 |
|---|---|
| 網羅性 | プロジェクトで使用する全ての言語の規約が定義されている |
| 実用性 | 既存の標準的な規約(Google Style Guide等)を参照している |
| 自動化 | 静的解析ツール(ESLint、Checkstyle等)の設定ファイルが用意されている |
| 一貫性 | 命名規則やファイル構成規則がプロジェクト全体で統一されている |
👁️🗨️ レビュー観点:
- 実効性: チーム全員が理解し、実践できる現実的な規約か
- ツール対応: 静的解析ツールやフォーマッターで自動チェック可能か
- 例外処理: 規約の例外ケースと適用方法が明確に定義されているか
- 保守性: 規約の更新・改訂プロセスが定義されているか
🧪成果物のサンプル
# コーディング規約・命名規則
## 規約の目的
- コードの可読性・保守性の向上
- チーム内での一貫したコーディングスタイルの維持
- バグの混入リスクの低減
- レビュー効率の向上
---
## 言語別コーディング規約
本プロジェクトでは、以下の公式または広く採用されているコーディング規約に準拠する。
### Java
- [Google Java Style Guide](https://google.github.io/styleguide/javaguide.html)
- または [Oracle Code Conventions for Java](https://www.oracle.com/java/technologies/javase/codeconventions-contents.html)
### TypeScript/JavaScript
- [Google TypeScript Style Guide](https://google.github.io/styleguide/tsguide.html)
- [Airbnb JavaScript Style Guide](https://github.com/airbnb/javascript)
### Python
- [PEP 8 -- Style Guide for Python Code](https://peps.python.org/pep-0008/)
### C#
- [Microsoft C# Coding Conventions](https://learn.microsoft.com/en-us/dotnet/csharp/fundamentals/coding-style/coding-conventions)
### その他の言語
- [使用言語]: [採用する規約のURL]
---
## 命名規則
### 基本原則
- 意味のある名前を使用する(略語は避ける)
- 英語を使用する(ローマ字表記は避ける)
- 予約語との衝突を避ける
- プロジェクト全体で一貫性を保つ
### 言語共通の命名規則
| 対象 | 命名規則 | 例 |
|------|---------|-----|
| クラス名 | PascalCase | `UserService`, `OrderRepository` |
| インターフェース名 | PascalCase (Iプレフィックス) | `IUserRepository`, `IPaymentGateway` |
| メソッド名 | camelCase | `getUserById`, `calculateTotal` |
| 変数名 | camelCase | `userName`, `totalAmount` |
| 定数 | UPPER_SNAKE_CASE | `MAX_RETRY_COUNT`, `DEFAULT_TIMEOUT` |
| プライベート変数 | _camelCase | `_userId`, `_connectionPool` |
| Boolean変数 | is/has/canで始める | `isActive`, `hasPermission`, `canEdit` |
### 言語別の命名規則補足
#### Java
```java
// パッケージ名: 小文字のみ、ドット区切り
package com.example.project.service;
// クラス名: PascalCase
public class UserService {
// 定数: UPPER_SNAKE_CASE
private static final int MAX_RETRY_COUNT = 3;
// プライベート変数: camelCase
private String userName;
// メソッド名: camelCase
public User getUserById(String userId) {
// ローカル変数: camelCase
String fullName = user.getFirstName() + " " + user.getLastName();
return user;
}
}
```
#### TypeScript/JavaScript
```typescript
// ファイル名: kebab-case
// user-service.ts
// クラス名: PascalCase
export class UserService {
// プライベート変数: _camelCase
private _userRepository: IUserRepository;
// メソッド名: camelCase
public async getUserById(userId: string): Promise<User> {
const user = await this._userRepository.findById(userId);
return user;
}
}
// 定数: UPPER_SNAKE_CASE
export const MAX_RETRY_COUNT = 3;
// 型名: PascalCase
export type UserRole = 'admin' | 'user' | 'guest';
```
#### Python
```python
# ファイル名: snake_case
# user_service.py
# クラス名: PascalCase
class UserService:
# クラス変数(定数): UPPER_SNAKE_CASE
MAX_RETRY_COUNT = 3
def __init__(self):
# プライベート変数: _snake_case
self._user_repository = UserRepository()
# メソッド名: snake_case
def get_user_by_id(self, user_id: str) -> User:
user = self._user_repository.find_by_id(user_id)
return user
# 関数名: snake_case
def calculate_total_amount(items: list) -> float:
return sum(item.price for item in items)
```
### AWSリソースの命名規則
```mermaid
graph TD
A[AWSリソース命名規則] --> B[基本フォーマット]
A --> C[環境識別子]
A --> D[リソース種別]
B --> B1["<プロジェクト>-<環境>-<リソース種別>-<用途>"]
C --> C1[dev: 開発環境]
C --> C2[stg: ステージング環境]
C --> C3[prd: 本番環境]
D --> D1[EC2: ec2]
D --> D2[S3: s3]
D --> D3[RDS: rds]
D --> D4[Lambda: lambda]
```
#### 命名規則の詳細
**基本フォーマット:**
```
<プロジェクト名>-<環境>-<リソース種別>-<用途>-<連番>
```
**例:**
| リソース | 命名例 | 説明 |
|---------|--------|------|
| S3バケット | `myapp-prd-s3-assets` | 本番環境の静的アセット用S3 |
| EC2インスタンス | `myapp-dev-ec2-web-01` | 開発環境のWebサーバー1号機 |
| RDS | `myapp-stg-rds-main` | ステージング環境のメインDB |
| Lambda | `myapp-prd-lambda-order-processor` | 本番環境の注文処理Lambda |
| IAMロール | `myapp-prd-role-lambda-execution` | Lambda実行用IAMロール |
| Security Group | `myapp-dev-sg-web` | 開発環境Web層のSG |
| VPC | `myapp-prd-vpc` | 本番環境のVPC |
| Subnet | `myapp-prd-subnet-public-1a` | 本番環境パブリックサブネット(AZ-1a) |
#### タグ付け規則
すべてのAWSリソースには以下のタグを必須とする:
| タグキー | 説明 | 例 |
|---------|------|-----|
| Project | プロジェクト名 | myapp |
| Environment | 環境 | production, staging, development |
| Owner | 管理者 | team-backend |
| CostCenter | コストセンター | engineering |
| ManagedBy | 管理方法 | terraform, cloudformation, manual |
---
## ファイル・ディレクトリ構成
### ディレクトリ構造の基本方針
```
project-root/
├── src/ # ソースコード
│ ├── domain/ # ドメイン層(ビジネスロジック)
│ ├── application/ # アプリケーション層
│ ├── infrastructure/ # インフラ層(DB、外部API等)
│ └── presentation/ # プレゼンテーション層(UI、API)
├── tests/ # テストコード
│ ├── unit/ # 単体テスト
│ ├── integration/ # 結合テスト
│ └── e2e/ # E2Eテスト
├── docs/ # ドキュメント
├── scripts/ # ビルド・デプロイスクリプト
└── config/ # 設定ファイル
```
### ファイル命名規則
| ファイル種別 | 命名規則 | 例 |
|------------|---------|-----|
| ソースファイル | クラス名と一致 | `UserService.ts` |
| テストファイル | `*.test.*` または `*.spec.*` | `user-service.test.ts` |
| 設定ファイル | kebab-case | `database-config.yaml` |
| スクリプトファイル | kebab-case | `deploy-production.sh` |
---
## コメント規約
### 基本方針
- コードで表現できることはコードで表現する
- 「何をするか」ではなく「なぜそうするか」を書く
- 不要なコメントアウトコードは削除する
- TODOコメントには担当者と期限を記載する
### ドキュメントコメント
公開API、複雑なビジネスロジックには必ずドキュメントコメントを記載する。
#### Java (Javadoc)
```java
/**
* ユーザー情報を取得する
*
* @param userId ユーザーID
* @return ユーザー情報。存在しない場合はnull
* @throws DatabaseException DB接続エラー時
*/
public User getUserById(String userId) throws DatabaseException {
// 実装
}
```
#### TypeScript (JSDoc)
```typescript
/**
* ユーザー情報を取得する
* @param userId - ユーザーID
* @returns ユーザー情報のPromise
* @throws {DatabaseError} DB接続エラー時
*/
async getUserById(userId: string): Promise<User> {
// 実装
}
```
#### Python (Docstring)
```python
def get_user_by_id(user_id: str) -> User:
"""
ユーザー情報を取得する
Args:
user_id: ユーザーID
Returns:
User: ユーザー情報
Raises:
DatabaseError: DB接続エラー時
"""
# 実装
```
### インラインコメント
```typescript
// 良い例: 「なぜ」を説明
// タイムアウトを長めに設定(外部APIのレスポンスが遅いため)
const TIMEOUT = 30000;
// 悪い例: コードを繰り返しているだけ
// タイムアウトを30000に設定
const TIMEOUT = 30000;
```
### TODOコメント
```typescript
// TODO(yamada 2025-12-15): エラーハンドリングを改善
// FIXME: メモリリークの可能性あり
// HACK: 一時的な対応。APIの仕様確定後に修正予定
```
---
## 静的解析ツールの活用
### 導入ツール
| 言語 | ツール | 用途 | 設定ファイル |
|------|--------|------|-------------|
| Java | Checkstyle | スタイルチェック | `checkstyle.xml` |
| Java | SpotBugs | バグ検出 | `spotbugs.xml` |
| TypeScript | ESLint | リント | `.eslintrc.json` |
| TypeScript | Prettier | フォーマット | `.prettierrc` |
| Python | pylint | リント | `.pylintrc` |
| Python | black | フォーマット | `pyproject.toml` |
| C# | StyleCop | スタイルチェック | `.editorconfig` |
### CI/CDでの実行
すべての静的解析ツールはCI/CDパイプラインで自動実行し、違反があればビルドを失敗させる。
```yaml
# GitHub Actions の例
- name: Run ESLint
run: npm run lint
- name: Run Prettier Check
run: npm run format:check
```
---
## レビュー観点
### チェックリスト
- [ ] 命名規則に準拠しているか
- [ ] 適切なコメントが記載されているか
- [ ] 重複コードはないか
- [ ] エラーハンドリングは適切か
- [ ] セキュリティ上の問題はないか
- [ ] パフォーマンス上の問題はないか
- [ ] テストコードは十分か
- [ ] ドキュメントは更新されているか
### レビュー時の注意事項
- 建設的なフィードバックを心がける
- 重要度に応じて「Must」「Should」「Nice to have」を明示する
- コードスタイルは静的解析ツールに任せ、ロジックに集中する
---
## 例外規約
以下の場合は、規約の適用を緩和または除外することができる:
- 外部ライブラリのインターフェースに合わせる必要がある場合
- レガシーコードとの整合性を保つ必要がある場合
- パフォーマンス上の理由がある場合
例外を適用する場合は、コメントで理由を明記すること。
```typescript
// 外部ライブラリの仕様に合わせてスネークケースを使用
const api_key = process.env.EXTERNAL_API_KEY;
```
--- 🔄 設計の進め方・プロセス
🏗️ プロセス1: 言語別コーディング規約の選定
策定対象:
プロジェクトで使用する各プログラミング言語のコーディング規約を選定する。
具体例:
- Java: Google Java Style Guide または Oracle Code Conventions
- TypeScript/JavaScript: Airbnb JavaScript Style Guide または Google TypeScript Style Guide
- Python: PEP 8
- C#: Microsoft C# Coding Conventions
策定原則:
- 標準規約の採用: 独自規約を作るのではなく、業界で広く採用されている標準規約を選定する
- チーム合意の形成: 開発メンバー全員で規約を確認し、合意を得る
- 実績重視: 豊富な実績があり、ツールサポートが充実している規約を選ぶ
文書化の推奨表現:
- 規約の明記: 採用する規約の名称とURLを明記する
- カスタマイズ事項の記載: 標準規約から変更・追加する項目がある場合は理由とともに記載する
🏗️ プロセス2: 命名規則の定義
策定対象:
クラス、メソッド、変数、定数、ファイル、AWSリソースなどの命名規則を定義する。
具体例:
- クラス名: PascalCase
- メソッド名: camelCase (Java/TypeScript) / snake_case (Python)
- 定数: UPPER_SNAKE_CASE
- Boolean変数: is/has/canで始める
- AWSリソース:
<プロジェクト>-<環境>-<リソース種別>-<用途>
策定原則:
- 一貫性の確保: プロジェクト全体で統一された命名規則を適用する
- 可読性の重視: 略語を避け、意味が明確な名前を使用する
- 言語慣習の尊重: 各言語のコミュニティで標準的な命名規則に従う
文書化の推奨表現:
- 命名規則一覧: 対象、命名規則、具体例を表形式で整理する
- 言語別の補足: 言語固有の命名規則や注意事項をコード例で示す
🏗️ プロセス3: 静的解析ツールの導入
策定対象:
コーディング規約を自動チェックする静的解析ツールを選定し、設定ファイルを作成する。
具体例:
- Java: Checkstyle、SpotBugs
- TypeScript/JavaScript: ESLint、Prettier
- Python: pylint、black
- C#: StyleCop
策定原則:
- 自動化の徹底: 手動チェックに頼らず、ツールで自動的に検出できる体制を整える
- CI/CD統合: すべてのプルリクエストで自動実行し、違反があればビルドを失敗させる
- 段階的導入: 既存コードベースがある場合は、警告レベルから開始し、段階的にエラーレベルに引き上げる
文書化の推奨表現:
- ツール一覧: 言語ごとに導入するツールと設定ファイル名を一覧化する
- CI/CD設定例: GitHub ActionsやGitLab CIでの実行例を記載する
🏗️ プロセス4: コードレビュー観点の整備
策定対象:
コードレビュー時にチェックすべき観点とチェックリストを整備する。
具体例:
- 命名規則に準拠しているか
- 適切なコメントが記載されているか
- エラーハンドリングは適切か
- セキュリティ上の問題はないか
- テストコードは十分か
策定原則:
- スタイルはツールに任せる: 静的解析ツールでチェックできる項目はレビュー対象から外し、ロジックやアーキテクチャに集中する
- 建設的なフィードバック: 指摘時は「Must」「Should」「Nice to have」を明示する
- 継続的改善: レビューで繰り返し指摘される項目は規約に追加する
文書化の推奨表現:
- チェックリスト: レビュー時に確認すべき項目を箇条書きで整理する
- レビュー時の注意事項: 建設的なフィードバックの方法を明記する
🚨 よくある失敗と予防策
🚧 実例収集後、追記予定
📚 参考資料・関連リンク
- 参考文献: 『リーダブルコード』、『Clean Code』
- 関連する他のガイド: システムアーキテクチャ設計ガイド、API設計ガイド、テスト設計ガイド
- 外部規約・ガイドライン:
- 静的解析ツール:
- ESLint (TypeScript/JavaScript)
- Prettier (フォーマッター)
- Checkstyle (Java)
- pylint (Python)
テンプレートサイト: 📄テンプレート集