カスタムメタデータ型でApexコーディングをもっと楽しくする

みなさん、こんにちは。[@takahito0508](https://twitter.com/takahito0508) です。

2018年12月時点でSalesforce 5年目のエンジニアです。いろいろな言語のコーディングやSalesforceのことを考えるのが趣味で、休日は [#SalesforceSaturday](https://twitter.com/hashtag/salesforcesaturday) というキーワードを世の中に広める活動などをしております。詳しくは [こちらの資料](https://speakerdeck.com/salesforcesaturdaytokyo/salesforcesaturday-tokyo-trailhead-campfire) で発信している熱い想いをご覧ください。

仕事ではアクセンチュア（[@accentureTech](https://twitter.com/accenturetech)）に入社8年目で、主にSalesforceを活用したシステムのアーキテクチャやアプリケーションのコードのことをやりつつ、社員のCapability Developmentに尽力しています。そのための過程で作りためていった [My Trailmix Collection for Everyone](https://medium.com/takahitomiyamoto/my-trailmix-collection-for-everyone-b83131af79ec) を趣味で公開しています。ご参考まで。

さて、当記事は [Salesforce Platform Advent Calendar 2018](https://qiita.com/advent-calendar/2018/salesforce-platform) - Day 2 の投稿になります。ご興味を持っていただきありがとうございます。今回は「カスタムメタデータ型」を利用したApexコーディングについての想いを述べたいと思います。

# カスタムメタデータ型
2018/10/30(火)に開催された [Salesforce Developers Meetup #19](https://www.trailblazers.jp/event/tokyo-salesforce-developers-meetup-19/) のTech Sessionにて、カスタムメタデータ型について発表させていただきました。

> [10.30 Salesforce Developers Meetup #19 - Tech Session](https://www.slideshare.net/takahito0508/20181030sfdgtechsession)

今回はそこで触れられなかった内容を中心に、改めてカスタムメタデータ型について補足したいと思います。

（私の周りだけかもしれませんが...）カスタムオブジェクトやカスタムラベル、およびカスタム設定よりもバリバリ使われている印象がないカスタムメタデータ型ですが、実はとても便利なのです。Dreamforce 2018でもカスタムメタデータ型をテーマにしたセッションが多く組まれていました。

>- [Create Guided User Experiences for Managing ISV Custom Metadata](https://success.salesforce.com/sessions?eventId=a1Q3A00001XoCSUUA3#/session/a2q3A000001WZSuQAO)
- [Path Forward with Custom Metadata Types](https://success.salesforce.com/sessions?eventId=a1Q3A00001XoCSUUA3#/session/a2q3A000001WXk3QAG)
- [Understanding the Value of Dependency Injection in the Lightning Platform](https://success.salesforce.com/sessions?eventId=a1Q3A00001XoCSUUA3#/session/a2q3A000001WZTYQA4)
- [Crafting Flexible APIs in Apex Using Custom Metadata](https://success.salesforce.com/sessions?eventId=a1Q3A00001XoCSUUA3#/session/a2q3A000001WXFFQA4)
- [Become a Superstar Admin with Custom Metadata Types](https://success.salesforce.com/sessions?eventId=a1Q3A00001XoCSUUA3#/session/a2q3A000001WXVXQA4)
- [Build Awesome Configuration Pages with Lightning Components & Custom Metadata](https://success.salesforce.com/sessions?eventId=a1Q3A00001XoCSUUA3#/session/a2q3A000001WWFnQAO)
- [Reveal Your Inner Trailblazer with Custom Metadata Types](https://success.salesforce.com/sessions?eventId=a1Q3A00001XoCSUUA3#/session/a2q3A000001WW8rQAG)

現地でこれら（の一部しかライブで体感できませんでしたが）に感銘を受けた私は、それまであまり本格的に取り組めていなかったカスタムメタデータ型について、帰国後すぐ内容を深めていったわけです。その過程で、特に2つの興味深いコンテンツにもたどり着きました。解説は別の機会に譲ろうと思いますが、リンクだけ貼っておきますね。

> 1. [Force DI](https://andyinthecloud.com/2018/07/15/managing-dependency-injection-within-salesforce/)
1. [Apex Cross-Cutting Concerns](https://developer.salesforce.com/blogs/2018/10/configuration-first-replacing-code-at-runtime.html)

# Apexトリガへの活用
いちばんインパクトが大きいのはApexコードへの適用だと考えています。特に、Apexトリガ。
Apexトリガって、時間とともにだんだん複雑な実装になっていくじゃないですか。それを解決すべく、カスタムメタデータ型を活用したフレームワークを考えました。

大きな処理の流れは共通クラスで汎用化しておき、複数の開発者がいた場合に各トリガで勝手な処理を書かせないようにします (Inversion of Control)。オブジェクト固有のロジックはそれぞれクラスに分割させますが、インターフェースを実装することを義務付けることによってあまりにも自由な書き方をさせないように制限します。そして、どのクラスをどのタイミング（登録、更新、削除）でトリガさせたいのかの設定をカスタムメタデータ型で注入します (Dependency Injection)。

サンプルコードを私のGitHubに公開していますので、これを参考にApexトリガを書いてもらうことでとても柔軟な実装を実現できるでしょう。詳しくは私のBloggerの方にハンズオン形式で書き方を解説していますので、ぜひ試してみてください。

> [Dependency Injection Sample for Apex Triggerを使って楽しくトリガを書こう](https://miyamototacademy.blogspot.com/2018/11/dependency-injection-sample-for-apex-trigger.html)

# Apex RESTへの活用
Apex RESTを使ったAPI開発も、同様に複雑になっちゃいますよね。そして、こっちのほうがApexトリガよりも深刻です。Apexトリガは通常Salesforce内に閉じているので、何かあった時に迷惑をかけるのはSalesforce内に留まります。しかしApex REST APIは外部システムとのやりとりがあるので、何かあった時は外部システムにも迷惑をかけることになってしまいます。そんなときに解析しにくかったりエラーハンドリングがイケてなかったりするコードだと、もう大変です。トラブルシュートに時間がかかってしまいます。これもフレームワークで解決しちゃいましょう。

> [Dependency Injection Sample for Apex RESTを使って楽しくAPIを書こう](https://miyamototacademy.blogspot.com/2018/12/dependency-injection-sample-for-apex-rest.html)

# さいごに
カスタムメタデータ型、いかがでしたか？コーディングは前よりも楽しくなりそうですか？？
今回紹介したコードも含め、類似品を今後も発展させてまいりますので、最新情報はTwitterでフォローしてください。あるいは、[Trailblazer Community](https://www.trailblazers.jp/events/)の各種勉強会に顔を出していますので、ぜひ会場で会って定期的にお話できればと思います。特に、土曜日にいっしょに勉強したいかたは、 [#SalesforceSaturday の勉強会](https://www.trailblazers.jp/group/saturdaytokyo_dg) でお待ちしています！！

それでは次にお会いする日までどうぞお元気で。Happy Coding!!