コーディング規約
ClassLabのSalesforce開発におけるコーディング規約、レビュー基準、禁止事項をまとめたガイドラインです。 Apex、LWC、テスト、コミットメッセージの規約を統一し、チーム全体でコード品質を維持します。
CXFields__c のinsertは入居トリガーからのみ許可されています。それ以外のコンテキストからの作成はシステム不整合の原因となります。
CLAUDE.mdに規約を記載しておきましょう。
✎ Apex コーディング規約
Apexコーディングにおける命名規則、バルク処理パターン、CRUD/FLS/Sharing、エラーハンドリング、ドキュメンテーションの規約です。
命名規則 必須
| 対象 | 規則 | 例 |
|---|---|---|
| クラス名 | PascalCase | CreateServiceGuideTriggerHandler |
| メソッド名 | camelCase | getAccountById() |
| 変数名 | camelCase | moveInList |
| 定数 | UPPER_SNAKE_CASE | MAX_RETRY_COUNT |
| トリガー名 | PascalCase + Trigger | AddressCheckTrigger |
バルク処理(必須) 重要
Salesforceのガバナ制限を遵守するため、バルク処理は絶対に守るべき最重要ルールです。
// NG: SOQLループ
for (MoveIn__c mi : Trigger.new) {
Account acc = [SELECT Id
FROM Account
WHERE Id = :mi.IntroductionFor__c];
}
// 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: コンポーネントのライフサイクルに連動してデータを自動取得・更新したい場合
- 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'
);
});
});
テスト命名規則 重要
| 種別 | 命名パターン | 例 |
|---|---|---|
| 正常系 | 正常系_〇〇の場合△△されること |
正常系_サービス案内が自動作成されること |
| 異常系 | 異常系_〇〇の場合エラーになること |
異常系_必須項目が空の場合エラーになること |
カバレッジ基準 重要
📖 テストデータ作成のベストプラクティス
@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 | 情報 |
レビューフロー 必須
🛠 レビューコメントの書き方
must: 必ず修正が必要な指摘(セキュリティ、バグ)
should: 修正を推奨する指摘(パフォーマンス改善、可読性向上)
nit: 細かい指摘(命名、フォーマット)
question: 質問(設計意図の確認、仕様確認)
Quick Checklist
- 6つのレビューカテゴリを把握した
- セルフレビューの重要性を認識した
- レビューフローの4ステップを確認した
🚫 禁止事項
以下の項目は絶対に守る必要がある禁止事項です。違反した場合、コードレビューで即リジェクトされます。
CXFields__c の作成禁止 重要
CXFields__c のinsertは入居トリガーからのみ許可されています。他のコンテキストからの作成はデータ整合性を破壊します。
その他の禁止事項 重要
| 禁止事項 | 理由 | 対策 |
|---|---|---|
| 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禁止を認識した
- ソリューション選定基準を把握した