salesforce-developer
Salesforceプラットフォーム上でApexコードの作成・デバッグ、Lightning Web Componentsの構築、SOQLクエリの最適化、トリガー・バッチジョブ・プラットフォームイベント・連携機能の実装ができます。Salesforceアプリケーション開発、CRMワークフローのカスタマイズ、ガバナー制限の管理、一括処理、Salesforce DXやCI/CDパイプラインの構築が必要な場合に活用できます。
description の原文を見る
Writes and debugs Apex code, builds Lightning Web Components, optimizes SOQL queries, implements triggers, batch jobs, platform events, and integrations on the Salesforce platform. Use when developing Salesforce applications, customizing CRM workflows, managing governor limits, bulk processing, or setting up Salesforce DX and CI/CD pipelines.
SKILL.md 本文
Salesforce Developer
コアワークフロー
- 要件分析 - ビジネスニーズ、データモデル、ガバナー制限、スケーラビリティを理解する
- ソリューション設計 - 宣言型と プログラマティック型の選択、バルク化の計画、統合設計を行う
- 実装 - ベストプラクティスに従い、Apexクラス、LWCコンポーネント、SOQLクエリを記述する
- ガバナー制限の検証 - SOQL/DML件数、ヒープサイズ、CPU時間がプラットフォーム制限内に収まっていることを確認した後、進める
- 包括的なテスト - 90%以上のカバレッジを含むテストクラスを記述し、バルクシナリオ(200件単位のバッチ)をテストする
- デプロイ - Salesforce DX、スクラッチ組織、CI/CDを使用してメタデータをデプロイする
リファレンスガイド
コンテキストに基づいて詳細なガイダンスを読み込みます:
| トピック | リファレンス | 読み込むタイミング |
|---|---|---|
| Apex開発 | references/apex-development.md | クラス、トリガー、非同期パターン、バッチ処理 |
| Lightning Web Components | references/lightning-web-components.md | LWCフレームワーク、コンポーネント設計、イベント、ワイアサービス |
| SOQL/SOSL | references/soql-sosl.md | クエリ最適化、リレーションシップ、ガバナー制限 |
| 統合パターン | references/integration-patterns.md | REST/SOAP API、プラットフォームイベント、外部サービス |
| デプロイメント & DevOps | references/deployment-devops.md | Salesforce DX、CI/CD、スクラッチ組織、メタデータAPI |
制約事項
必ず実行する
- Apexコードをバルク化する — ループ前にIDまたはレコードを集約し、ループ外でクエリ/DMLを実行する
- 最小90%のコードカバレッジを持つテストクラスを記述し、バルクシナリオを含める
- インデックス付きフィールドを使用した選択的なSOQLクエリを使用し、リレーションシップクエリを活用する
- 長時間実行される処理には適切な非同期処理(バッチ、キューイング可能、フューチャー)を使用する
- 適切なエラーハンドリングとログ記録を実装し、部分的な成功のために
Database.update(scope, false)を使用する - ソース駆動開発とメタデータデプロイメントには Salesforce DX を使用する
してはいけないこと
- ループ内でSOQL/DMLを実行する(ガバナー制限違反 — 下記のバルク化トリガーパターンを参照)
- IDまたは認証情報をコードにハードコーディングする
- セーフガードなしで再帰的なトリガーを作成する
- フィールドレベルのセキュリティと共有ルールのチェックをスキップする
- 廃止予定のSalesforce APIまたはコンポーネントを使用する
コードパターン
バルク化されたトリガー(正しいパターン)
// 正しい例: IDを集約し、ループ外で1回クエリを実行
trigger AccountTrigger on Account (before insert, before update) {
AccountTriggerHandler.handleBeforeInsert(Trigger.new);
}
public class AccountTriggerHandler {
public static void handleBeforeInsert(List<Account> newAccounts) {
Set<Id> parentIds = new Set<Id>();
for (Account acc : newAccounts) {
if (acc.ParentId != null) parentIds.add(acc.ParentId);
}
Map<Id, Account> parentMap = new Map<Id, Account>(
[SELECT Id, Name FROM Account WHERE Id IN :parentIds]
);
for (Account acc : newAccounts) {
if (acc.ParentId != null && parentMap.containsKey(acc.ParentId)) {
acc.Description = 'Child of: ' + parentMap.get(acc.ParentId).Name;
}
}
}
}
// 間違った例: ループ内のSOQL — ガバナー制限違反
trigger AccountTrigger on Account (before insert) {
for (Account acc : Trigger.new) {
Account parent = [SELECT Id, Name FROM Account WHERE Id = :acc.ParentId]; // 不適切
acc.Description = 'Child of: ' + parent.Name;
}
}
バッチApex
public class ContactBatchUpdate implements Database.Batchable<SObject> {
public Database.QueryLocator start(Database.BatchableContext bc) {
return Database.getQueryLocator([SELECT Id, Email FROM Contact WHERE Email = null]);
}
public void execute(Database.BatchableContext bc, List<Contact> scope) {
for (Contact c : scope) {
c.Email = 'unknown@example.com';
}
Database.update(scope, false); // 部分的な成功を許可
}
public void finish(Database.BatchableContext bc) {
// 通知を送信または次のバッチをチェーンする
}
}
// 実行: Database.executeBatch(new ContactBatchUpdate(), 200);
テストクラス
@IsTest
private class AccountTriggerHandlerTest {
@TestSetup
static void makeData() {
Account parent = new Account(Name = 'Parent Co');
insert parent;
Account child = new Account(Name = 'Child Co', ParentId = parent.Id);
insert child;
}
@IsTest
static void testBulkInsert() {
Account parent = [SELECT Id FROM Account WHERE Name = 'Parent Co' LIMIT 1];
List<Account> children = new List<Account>();
for (Integer i = 0; i < 200; i++) {
children.add(new Account(Name = 'Child ' + i, ParentId = parent.Id));
}
Test.startTest();
insert children;
Test.stopTest();
List<Account> updated = [SELECT Description FROM Account WHERE ParentId = :parent.Id];
System.assert(!updated.isEmpty(), 'Children should have descriptions set');
System.assert(updated[0].Description.startsWith('Child of:'), 'Description format mismatch');
}
}
SOQLベストプラクティス
// 選択的クエリ — WHERE句でインデックス付きフィールドを使用
List<Opportunity> opps = [
SELECT Id, Name, Amount, StageName
FROM Opportunity
WHERE AccountId IN :accountIds // インデックス付きフィールド
AND CloseDate >= :Date.today() // インデックス付きフィールド
ORDER BY CloseDate ASC
LIMIT 200
];
// リレーションシップクエリで余分なラウンドトリップを回避
List<Account> accounts = [
SELECT Id, Name,
(SELECT Id, LastName, Email FROM Contacts WHERE Email != null)
FROM Account
WHERE Id IN :accountIds
];
Lightning Web Component(カウンター例)
<!-- counterComponent.html -->
<template>
<lightning-card title="Counter">
<div class="slds-p-around_medium">
<p>Count: {count}</p>
<lightning-button label="Increment" onclick={handleIncrement}></lightning-button>
</div>
</lightning-card>
</template>
// counterComponent.js
import { LightningElement, track } from 'lwc';
export default class CounterComponent extends LightningElement {
@track count = 0;
handleIncrement() {
this.count += 1;
}
}
<!-- counterComponent.js-meta.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata">
<apiVersion>59.0</apiVersion>
<isExposed>true</isExposed>
<targets>
<target>lightning__AppPage</target>
<target>lightning__RecordPage</target>
</targets>
</LightningComponentBundle>
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- cedriclefoudelatech
- ライセンス
- MIT
- 最終更新
- 2026/5/10
Source: https://github.com/cedriclefoudelatech/TIMLEMEILLEURIDF / ライセンス: MIT
関連スキル
doubt-driven-development
重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。
apprun-skills
TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。
desloppify
コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。
debugging-and-error-recovery
テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。
test-driven-development
テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。
incremental-implementation
変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。