このサイトと ApexEloquent を作った理由
こんにちは、このブログを見つけてくださってありがとうございます!
このブログでは、 Salesforce Apex 向けのクエリライブラリ ApexEloquent や、 開発の背景にあるエピソード、 開発のなかで得た小さなコツを、 気軽に書き残していこうと思っています。
最初の投稿なので、 まずはこのサイトと ApexEloquent を作ろうと思った経緯から書いていきます。
😵 「テストを書くのって、 こんなに大変なの?」
Salesforce 開発に初めて触れたとき、 私はこう感じました
「Apex はデータベース操作をそのままコードで書けるのか、 便利だな!」
ところが実際にプロジェクトに入って開発を始めると、 現実は少しずつ違って見えてきました。
私が担当した Salesforce 環境は、 すでに導入から 3 年が経っており、 多数のカスタムオブジェクトと複雑なリレーションを抱えていて、 小さな修正をするにも、 関連するオブジェクトのテストデータを大量に用意する必要がある状態でした。
「この処理をテストするには、 まず関連を辿って、 親にデータを入れて、 ... あれ、 このデータはどう作るんだっけ?」
これが日常になっていました。
前任者はこれに疲れていたのでしょう。まともにテストが書かれていないコードが大量に放置されている理由がわかりました。
正直、 テストを書く時間がつらすぎて、 何度逃げ出したくなったか分かりません。
🔧 フレームワークを作り始めた理由
そんな環境のなかで、 「テストをもっと楽に書けたらいいのに...」 と思う日が増えていきました。
前職で Laravel を使った開発をしていた経験があり、 そこで触れた Eloquent ORM の書き心地が驚くほど良かった記憶がありました。
「あのスタイルで Salesforce でもクエリを書けたら...」 — そう考えたのが、 ApexEloquent を作る最初のきっかけです。
最初に取り組んだのは、 SOQL を動的に組み立てるためのライブラリ作りでした。
でも、 それだけではテストの書きにくさは解決しません。
次に取り組んだのが、 モックを中心としたテスト戦略を確立すること。 Salesforce は公式に「TestDataFactory でテストデータを作りましょう」 と推奨していますが、 当時の現場はすでにTestDataFactoryで何とかなる規模を超えていました。 そこで、 より現実的で楽なテストの書き方を模索した末にたどり着いたのが、 Query Delegation Pattern と呼んでいる設計パターンです。
そこに、 クエリ・モック・リレーションをひとまとめで扱える仕組みを足していった結果、 テストがずいぶん書きやすくなるフレームワークが出来上がりました。
途中で「書き込み不可項目をどう扱うか」 という Salesforce 特有の壁にもぶつかりましたが、 Evaluator / MockEvaluator(ApexEloquentの中のEntryの前身) を作ることでこれも乗り越えました。
🌐 そしてこのサイトを作った理由
ApexEloquent を使うことで開発が楽になり、 自分なりのテスト戦略もかなり整理できました。
ただ、 周りを見渡してみると、 Apex のモッキング戦略を扱うコミュニティが、 まだあまり活発ではないと感じました。 特に日本ではモッキングに関する情報がほとんどなく、議論が十分に交わされている様子もなさそうでした。
Laravel の Eloquent の良さや、 書き込み不可項目への対策を取り込んだ ApexEloquent を広く知ってもらうことで、 コミュニティを盛り上げ、 Apex エンジニアの開発環境を少しでも良くできないかと、kう考えました。
それがこのサイトを作ったきっかけです。
🎯 まとめ
このブログでは、 ApexEloquent の機能紹介だけでなく、 実際にどう使っているか、 設計で気をつけていること、 Salesforce 開発の小さなコツなども書き残していきます。
「Salesforce Apex 開発をもっと楽しくしたいな」 と思っている方にとって、 何かのヒントになれば嬉しいです。
🙏 謝辞
この機会に、 James Simone 氏と、 氏の素晴らしい著述 The Joy of Apex に感謝を伝えたいと思います。 ApexEloquent は、 氏の Apex 開発パターン・テスト戦略・クリーンアーキテクチャに関する洞察から多くのインスピレーションを受けています。 Salesforce 開発者コミュニティへの氏の貢献は計り知れず、 その築いてくれた土台の上に自分の OSS を載せられることを光栄に思います。
次の記事でまたお会いしましょう! 👋