2013-12-02

force.com開発におけるApexとJavaScriptの使い分け

最近ではMobileの波が来ていることもあり、jQueryだけでなくBackbone.jsやAngular.js等の

JSフレームワークを利用した開発サンプルもSalesforceから提供されるようになった。

既存のApexタグと同じくらいJavaScriptも使いこなせないとね、って感じ。

 

そこで、出てくるのがApexとJavaScriptとの使い分け。

ここらへんってApexだけじゃなくて、全てのサーバサイドプログラミング言語に共通していることで、

私が偉そうに言えることでも無いけど、とりあえず書いてみる。

 

まず、混在するパターンとしては以下のとおり

 

1. Visualforceページ開発におけるバリデーションチェックでの混在。

→JavaScriptによるチェックは、デプロイ不要なため手軽に利用でき、

チェックにサーバへのアクセスが不要なため、ユーザビリティ的にも良いが、

JavaScript自体、書き換え可能なため不正な値がサーバにPOSTされる可能性がある。

 

一方、Apexによるチェックは、デプロイやテストクラスの修正が必要になるが、

サーバにPOSTされた値を検証するため、不正な値が来ても問題ない。

 

こうしたトレードオフにより、両者を併用することがセキュリティ的にはベストな実装。

デプロイ不要という手軽さ故、暫定対応的にJavaScriptのみのバリデーションを実装することが多いが、

飽くまでも暫定対応。

 

Apexによるチェックと書いたけど、入力規則をうまく使えば、サーバサイド(Apex)でのバリデーションチェックすらも要らない。

そもそもMVC的にはコントローラではなくモデルにバリデーションチェックを入れるべきだから、

入力規則やトリガに任せるのが一番良いんだろうけど…。

 

2. カスタムボタンのOnClickJSでの実装。

→これはOnClickJSでSOAP API(Ajax Tool Kit)を利用するパターンで、

カスタムSOAP APIを作って、それを呼び出すパターンが良い実装。

 

Apexクラスであればテストクラスが利用できるし、色々と再利用も可能。

OnClickJSで標準のSOAP APIをごりごり使うのも良いけど、

APIコール数の消費を抑えたり、単体テスト自動化を実装するためにも

カスタムSOAP APIでのApexクラスの利用を考えたほうが良い。

 

っていうか、個人的にはカスタムボタン使うくらいだったら、

インラインVFでAPIコール無しに自由にJavaScriptとApexクラスで実装しようよって感じなんだけど。

 

3. ApexをREST APIとして利用して、

HTML5,JavaScriptでゴリゴリとアプリを書くっていうパターン。

→最近のWebアプリはこんな感じだと思うので詳細は割愛。

force.comではRemoteAction(Salesforceが出しているライブラリとしてはremoteTK)を利用する。

 

どのパターンにおいても意識しないといけないことが「単体テストの自動化」ということ。

Apexクラスにはテストクラスと呼ばれるテスト自動化の仕組みがあり、比較的利用がしやすい。

 

一方JavaScriptの方は一般的なWebでの方法は確立されているものの、

導入の難易度が比較的高く、force.comでのテスト自動化が難しいように感じる。(OnClickJSとかでは特に)

 

アジャイル開発なforce.com開発において(というかアジャイルじゃなくても)テスト自動化は超重要事項。

salesforce側はMobileの波を受けて、JavaScript開発を薦めている感じだから

きっとJavaScriptのテスト自動化もsalesforce側で、つまりPaas的に提供される日がいつか来るんじゃないかと。

このエントリーをはてなブックマークに追加