コーディング規約

ClassLabのSalesforce開発におけるコーディング規約、レビュー基準、禁止事項をまとめたガイドラインです。 Apex、LWC、テスト、コミットメッセージの規約を統一し、チーム全体でコード品質を維持します。

Apex規約 LWC規約 テスト規約 コードレビュー 禁止事項 ソリューション選定
7 規約セクション
75%+ 最低カバレッジ
6 レビュー基準
5 ソリューション種別

✎ Apex コーディング規約

Apexコーディングにおける命名規則、バルク処理パターン、CRUD/FLS/Sharing、エラーハンドリング、ドキュメンテーションの規約です。

命名規則 必須

対象 規則
クラス名 PascalCase CreateServiceGuideTriggerHandler
メソッド名 camelCase getAccountById()
変数名 camelCase moveInList
定数 UPPER_SNAKE_CASE MAX_RETRY_COUNT
トリガー名 PascalCase + Trigger AddressCheckTrigger

バルク処理(必須) 重要

Salesforceのガバナ制限を遵守するため、バルク処理は絶対に守るべき最重要ルールです。

❌ NG: SOQLループ
// NG: SOQLループ
for (MoveIn__c mi : Trigger.new) {
    Account acc = [SELECT Id
        FROM Account
        WHERE Id = :mi.IntroductionFor__c];
}
✅ OK: コレクション化
// OK: コレクション化
Set<Id> accountIds = new Set<Id>();
for (MoveIn__c mi : Trigger.new) {
    accountIds.add(mi.IntroductionFor__c);
}
Map<Id, Account> accountMap =
  new Map<Id, Account>(
    [SELECT Id, Name
     FROM Account
     WHERE Id IN :accountIds]
);

CRUD/FLS/Sharing 重要

セキュリティを確保するため、クラスには必ず with sharing を指定してください。

public with sharing class MyService {
    // with sharing で共有ルールを適用
    // without sharing は正当な理由がある場合のみ使用
}

エラーハンドリング 必須

例外は必ずキャッチし、SystemError__c オブジェクトに記録してください。

try {
    // 処理
} catch (Exception e) {
    SystemError__c error = new SystemError__c();
    error.ErrorMessage__c = e.getMessage();
    error.StackTrace__c = e.getStackTraceString();
    insert error;
}

ドキュメンテーション 推奨

publicメソッドには必ずJavadocスタイルのコメントを付与してください。

/**
 * @description サービス案内を自動作成するハンドラ
 * @param moveIns 対象の入居レコードリスト
 * @return 作成されたサービス案内リスト
 */
public static List<ServiceGuide__c> createServiceGuides(
    List<MoveIn__c> moveIns
) {
    // ...
}
📖 Apex命名規則の詳細と補足

テストクラス名: 対象クラス名 + Test(例: MyServiceTest

インターフェース名: I プレフィックス + PascalCase(例: INotificationService

バッチクラス名: 処理内容 + Batch(例: MoveInStatusUpdateBatch

スケジューラ名: 処理内容 + Scheduler(例: DailyCleanupScheduler

⚠ よくあるバルク処理の間違いパターン

DMLループ: ループ内での insert/update は禁止。リストに追加してループ外で一括DMLを実行してください。

ネストSOQL: SOQLの結果をループで回しながら別のSOQLを発行するパターンも禁止です。

対策: 常にMapを活用し、SOQLは最小限に抑えてください。

Quick Checklist

  • Apex命名規則(PascalCase/camelCase/UPPER_SNAKE_CASE)を把握した
  • バルク処理パターン(コレクション化)を理解した
  • with sharing の必須性を認識した
  • エラーハンドリングパターンを確認した

⚡ LWC コーディング規約

Lightning Web Components(LWC)のファイル構成、命名規則、データ取得パターンの規約です。

ファイル構成 必須

myComponent/
├── myComponent.html        // テンプレート
├── myComponent.js          // ロジック
├── myComponent.css         // スタイル
├── myComponent.js-meta.xml // メタデータ
└── __tests__/
    └── myComponent.test.js // テスト

命名規則 必須

対象 規則
フォルダ名 kebab-case move-in-detail
ファイル名 camelCase moveInDetail.js
クラス名 PascalCase MoveInDetail
プロパティ名 camelCase moveInDate

@wire と imperative 注意

データ取得には @wire と imperative の2つのパターンがあります。リアクティブなデータには @wire、ユーザーアクション起点には imperative を使用してください。

// @wire: リアクティブなデータ取得
@wire(getRecord, { recordId: '$recordId', fields: [NAME_FIELD] })
record;

// Imperative: ユーザーアクション起点のデータ取得
async handleClick() {
    const result = await getAccounts();
    this.accounts = result;
}
💡 @wire vs imperative の使い分け
  • @wire: コンポーネントのライフサイクルに連動してデータを自動取得・更新したい場合
  • imperative: ボタンクリック等のユーザー操作を起点にデータを取得したい場合
  • パフォーマンスの観点から、不必要なimperative呼び出しは避けてください

Quick Checklist

  • LWCのファイル構成ルールを確認した
  • フォルダ名(kebab-case)とファイル名(camelCase)の違いを把握した
  • @wireとimperativeの使い分けを理解した

🔬 テスト規約

Apex/LWCのテスト規約、テスト命名規則、カバレッジ基準をまとめています。テストなしデプロイは禁止です。

Apex テスト 必須

@isTest
private class MyServiceTest {

    @TestSetup
    static void setup() {
        /* テストデータ作成 */
    }

    @isTest
    static void 正常系_サービス案内が自動作成されること() {
        /* テスト */
    }

    @isTest
    static void 異常系_必須項目が空の場合エラーになること() {
        /* テスト */
    }
}

LWC テスト 必須

describe('c-my-component', () => {
    afterEach(() => {
        while (document.body.firstChild) {
            document.body.removeChild(document.body.firstChild);
        }
    });

    it('正常系: 初期表示でタイトルが表示されること', () => {
        const element = createElement(
            'c-my-component',
            { is: MyComponent }
        );
        document.body.appendChild(element);
        const title = element.shadowRoot
            .querySelector('h1');
        expect(title.textContent).toBe(
            'Expected Title'
        );
    });
});

テスト命名規則 重要

種別 命名パターン
正常系 正常系_〇〇の場合△△されること 正常系_サービス案内が自動作成されること
異常系 異常系_〇〇の場合エラーになること 異常系_必須項目が空の場合エラーになること

カバレッジ基準 重要

最低 75%以上
目標 80%以上
理想 90%以上
📖 テストデータ作成のベストプラクティス

@TestSetup: テストクラス内で共通のテストデータは @TestSetup メソッドで作成し、各テストメソッドで再利用します。

Test.startTest()/stopTest(): ガバナ制限のリセットが必要な場合に使用します。トリガーやバッチのテストでは必須です。

SeeAllData=false: テストでは本番データを参照しないでください。@isTest(SeeAllData=true) は原則禁止です。

Quick Checklist

  • Apexテストの基本構造(@isTest, @TestSetup)を把握した
  • LWCテストのafterEachパターンを確認した
  • テスト命名規則(正常系/異常系)を理解した
  • カバレッジ最低75%、目標80%を認識した

📝 コミットメッセージ規約

統一されたコミットメッセージにより、変更履歴の追跡とリリースノートの自動生成が容易になります。

typeの種類 必須

type 用途
feat 新機能の追加 feat: サービス案内自動作成機能を追加
fix バグ修正 fix: 入居トリガーのNull参照エラーを修正
refactor リファクタリング refactor: AccountServiceのメソッド分割
test テストの追加・修正 test: MoveInTriggerHandlerのテスト追加
docs ドキュメントの変更 docs: API仕様書を更新
chore ビルドや設定の変更 chore: デプロイスクリプトを更新
# コミットメッセージの形式
type: 変更内容の要約

# 例
feat: サービス案内自動作成機能を追加
fix: 入居トリガーのNull参照エラーを修正
refactor: AccountServiceのメソッド分割
test: MoveInTriggerHandlerのテスト追加
docs: API仕様書を更新
chore: デプロイスクリプトを更新

Quick Checklist

  • コミットメッセージのtype種類を把握した
  • 日本語でメッセージを書くことを確認した

🔎 コードレビュー基準

コードレビューは以下の6つのカテゴリに基づいて行われます。全項目をクリアすることがマージの条件です。

カテゴリ チェック項目 重要度
セキュリティ SOQLインジェクション、XSS、CRUD/FLS 重要
パフォーマンス バルク処理、SOQLループ禁止、Map活用 重要
ガバナ制限 SOQL数、DML数、CPU時間 重要
テスト カバレッジ75%+、正常系/異常系/境界値 注意
可読性 命名規則、コメント、500行以下 情報
設計 設計書との整合性、DRY 情報

レビューフロー 必須

セルフレビュー 開発者
PR作成前に自分でチェックリストを確認する。差分を見て意図しない変更がないか確認。
PR作成 情報
変更内容の要約、テスト方法、影響範囲をPR descriptionに記載する。
コードレビュー 注意
レビュアーが6つのカテゴリに基づいてチェック。指摘事項はコメントで伝達。
修正・承認 完了
指摘事項を修正し、レビュアーの承認を得たらマージ可能。
🛠 レビューコメントの書き方

must: 必ず修正が必要な指摘(セキュリティ、バグ)

should: 修正を推奨する指摘(パフォーマンス改善、可読性向上)

nit: 細かい指摘(命名、フォーマット)

question: 質問(設計意図の確認、仕様確認)

Quick Checklist

  • 6つのレビューカテゴリを把握した
  • セルフレビューの重要性を認識した
  • レビューフローの4ステップを確認した

🚫 禁止事項

以下の項目は絶対に守る必要がある禁止事項です。違反した場合、コードレビューで即リジェクトされます。

CXFields__c の作成禁止 重要

その他の禁止事項 重要

禁止事項 理由 対策
SOQLループ ガバナ制限超過 コレクション化してループ外でSOQL実行
ハードコードID 環境依存、デプロイ時のエラー Custom MetadataまたはCustom Settingを使用
without sharing の無条件使用 セキュリティリスク 正当な理由がある場合のみ使用、コメントで理由を明記
テストなしデプロイ 品質担保不可 最低75%カバレッジを確保してからデプロイ
// NG: ハードコードID
String recordTypeId = '012000000000ABC';

// OK: 動的に取得
Id recordTypeId = Schema.SObjectType.Account
    .getRecordTypeInfosByDeveloperName()
    .get('RealEstate').getRecordTypeId();

Quick Checklist

  • CXFields__c の直接insert禁止を認識した
  • SOQLループ禁止を認識した
  • ハードコードID禁止を認識した
  • without sharing無条件使用禁止を認識した

🛠 ソリューション選定基準

実装する機能に応じて、適切なソリューションを選定する基準です。

ソリューション 用途 処理速度 ステータス
Apexトリガー 複雑なロジック、外部連携 速い 推奨
フロー ノーコードで可能な範囲 やや遅い 条件付き
バッチ処理 大量データ、スケジュール - 推奨
LWC カスタムUI - 推奨
VisualForce レガシーUI(新規非推奨) - 非推奨

選定フロー 必須

要件定義
複雑度判定
ソリューション選定
レビュー承認
📖 フローとApexの使い分け詳細

フローを選ぶ場合:

  • ロジックがシンプル(分岐が少ない)
  • 外部連携が不要
  • 管理者がメンテナンスする可能性がある

Apexを選ぶ場合:

  • 複雑なビジネスロジック
  • 外部システム連携(Callout)
  • パフォーマンスが重要
  • 大量データの処理
  • テストコードによる品質担保が必要
⚠ VisualForceを使わない理由

VisualForceはSalesforceのレガシーUIフレームワークです。以下の理由から新規開発では使用しません:

  • Salesforceが公式にLWCへの移行を推奨している
  • パフォーマンスがLWCに劣る
  • モダンなWeb標準に準拠していない
  • 今後のサポートが縮小される可能性がある

既存のVisualForceページの保守は引き続き行いますが、新規開発はLWCで行ってください。

Quick Checklist

  • 5つのソリューション種別を把握した
  • フローとApexの使い分けを理解した
  • VisualForceが新規非推奨であることを認識した

✅ 総合チェックリスト

このページの内容を全て確認したら、以下のチェックリストで振り返りましょう。

  • Apex命名規則(PascalCase/camelCase/UPPER_SNAKE_CASE)を把握した
  • バルク処理パターンを理解し、SOQLループ禁止を認識した
  • with sharing の必須性を理解した
  • エラーハンドリングで SystemError__c に記録するパターンを確認した
  • LWCのファイル構成と命名規則を確認した
  • @wire と imperative の使い分けを理解した
  • テスト命名規則(正常系/異常系)を確認した
  • カバレッジ最低75%、目標80%を認識した
  • コミットメッセージのtype規約を把握した
  • 6つのコードレビュー基準を確認した
  • CXFields__c の直接insert禁止を認識した
  • ソリューション選定基準を把握した