Salesforceの開発環境、Force.comの基本を学び、本格的にSalesforce開発に取り組んでいこう(編集部)
第1回ではSalesforce上での開発の概要を、第2回ではForce.com IDEの設定とForce.com Pages(VisualForce)について説明してきました 。新バージョン「Winter '10」も正式リリースが終わり、紹介したい便利な新機能がたくさんあるのですが、ひとまず今回はForce.com Codeで本格的にSalesforce開発に取り掛かってみましょう。
Force.com Codeってどんなもの?
第1回で概要のみ説明しましたが、改めて説明します。Force.com Codeとは、元々ApexCodeと呼ばれていたForce.com上で利用できる、「プログラミング言語」です。
この開発言語を利用して、Apexクラス/Apexトリガを記述していきます。
文法的にはJavaライクな言語なので、Java経験があれば簡単に理解できます。Java以外の開発言語、例えばPHPやRubyなどのオブジェクト指向言語(もしくはそういう考え方が可能な言語)での経験のみでも十分でしょう。
Force.com Code開発の準備
Force.com Code開発でForce.com Pages開発と一番違うのは、「運用環境ではブラウザ上で開発・保存ができない」ということです。運用環境とは、具体的にはEnterpriseEditionやForce.comFreeEditionのことを差しています。
アカウント種類 | 開発環境 | デプロイ |
---|---|---|
CRM Developer edition | Web上での開発が可能 | Web上で開発したものが常に実行される |
CRM Enterprise edition | Force.com IDE | テストを記述し、IDE/Antからデプロイ |
Force.com free edition | Force.com IDE | テストを記述し、IDE/Antからデプロイ |
各アカウントの開発環境とデプロイ |
SalesforceCRM DeveloperEditionは開発環境ですから、設定→開発→Apexクラス/Apexトリガ、からブラウザ上での開発(コーディング・保存)が可能ですが、実際に運用していく時のことを考えるとEclipse+Force.com IDE上で開発・テスト・デプロイの手順に慣れておく方が良いと思います。DeveloperEdition+Webブラウザでの開発は実現可能チェックや文法確認などに便利ですし、取りあえず試してみるには非常に良い環境ですね。
今回は、Force.com FreeEditionでForce.com IDEを利用してApexクラスの作成をしていきます。Force.com IDEの準備ができていない人は、前回の内容を見て環境を作ってみてください。
新規Apexクラス作成
Eclipse上でApexクラスの新規に作成しましょう。パッケージエクスプローラから、「プロジェクト名>src>classes」で右クリックから、「新規>Apex Class」を選択し、Apexクラス名を入力して完了すれば、[クラス名.cls]ファイルと[クラス名cls-meta.xml]ファイルが作成されます。clsファイルの方にForce.com Codeでロジックを記入し、プログラムを作成していきます。
今回は、前回作成したForce.com PagesのDevelopperListに合わせて、DevelopperListControllerという名前にしておきます。
さて、それでは早速実装に取り掛かりましょう。
public with sharing class DevelopperListController { Developper__c[] developpers; String min_s; String max_s; String tech; public Developper__c[] getDeveloppers(){ if(min_s==null && System.currentPageReference().getParameters().get('min')==null){ min_s = '0'; }else if(System.currentPageReference().getParameters().get('min')!=null){ min_s = System.currentPageReference().getParameters().get('min'); } if(max_s==null && System.currentPageReference().getParameters().get('max')==null){ max_s = '99'; }else if(System.currentPageReference().getParameters().get('max')!=null){ max_s = System.currentPageReference().getParameters().get('max'); } if((tech==null || tech.equals('')) && System.currentPageReference().getParameters().get('tech')==null){ tech = 'Java'; }else if( System.currentPageReference().getParameters().get('tech')!=null){ tech = System.currentPageReference().getParameters().get('tech'); } Integer min = Integer.valueOf(min_s); Integer max = Integer.valueOf(max_s); developpers = [ SELECT Id,Name,Experience__c,Tech__c FROM Developper__c WHERE Tech__c includes (:tech) AND Experience__c >:min AND Experience__c <:max ]; return developpers; } public static testMethod void testDevelopperListController(){ DevelopperListController controller = new DevelopperListController(); controller.developpers = controller.getDeveloppers(); System.assertNotEquals(controller.developpers, null); controller = new DevelopperListController(); controller.min_s='0'; controller.max_s='80'; controller.tech='java'; controller.developpers = controller.getDeveloppers(); System.assertNotEquals(controller.developpers, null); } }
では簡単にプログラムの説明をしていきます。
public with sharing class DevelopperListController
クラスの定義をしています。Javaそっくりですが、「with sharing」という見慣れない文字が付いてます。ここは気にせず、次に進みます。
Developper__c[] developpers;
これもよく見かける書き方ですね。
説明するまでもないかもしれませんが、Developper__cの配列型の変数、developpersを定義しています。Developper__cは、前回作成したカスタムオブジェクトの型で、オブジェクト名に__cを付けたものがプログラムで利用する際の型になることを思い出しておいてください。Pages内でも使用しています。
String min_s;
これはどうでしょうか? String型の変数定義ですよね。今回は変数のスコープなどはあまり気にせずに記述しています。
public Developper__c[] getDeveloppers()
これもすぐにわかりますね。PublicでDevelopper__c[]を返すgetDeveloppersメソッドを定義しています。当然ですが、メソッド内でDevelopper__c[]型の値をreturnする必要があります。
System.currentPageReference().getParameters().get('min')
次に、if文の条件の中に注目してみてください。
Webプログラミングに慣れている人であれば、直感的に気付いたかもしれませんが、URL内のGETパラメータから'min'の値を取得しています。
http://***/***?min=6
であれば、6が取得できます。
if文の個所は簡単だとは思いますが、GETパラメータが取得できた場合とできなかった場合に分けて、値を変数に代入しています。
Integer min = Integer.valueOf(min_s);
これもJavaそのものですね。min_sの中に入っている文字列情報を整数に変換しています。
developpers = [
ここから始まるSQLの様な個所は、SOQLと呼ばれるQueryLanguageを利用しています。
詳細は次項で説明しますので、ひとまずDBアクセスしてデータを取ってきていると考えてもらえれば大丈夫です。
return developpers;
DBから取ってきたオブジェクトの配列を格納した変数をreturnしています。
public static testMethod void testDevelopperListController()
developperListControllerのテストメソッドを定義しています。static testMethodと記述して、返り値をvoidに、test***(テストしたいメソッド)とすることで、テストメソッドを作成します。
テストメソッドの中身を簡単に説明すると、DevelopperListControllerオブジェクトをインスタンス化して、テストするメソッドを実行させて、結果が正しいことをSystem.assert〜メソッドで確認しています。
JUnitなどでテストプログラムを書いたことがある人であれば、手慣れたものかと思います。
ここで1点注意したいのが、Apexクラス/トリガを運用環境にデプロイするためにはテストのカバレッジ率が75%以上であることが必須という、Force.comの制限です。
Force.com IDEを利用している場合、ソースを右クリックしてForce.comからRun Testsを選択すればテストを実行して過不足を教えてくれます。
ちなみに、DevelopperEditionの場合はカバレッジ率は制限になりません。
いかがでしょうか? Javaでプログラミングしているのと同じ感覚でプログラミングができたのではないかと思います。Java以外のエンジニアの方はどうでしょう?オブジェクト指向での開発経験さえあれば、十分に一見で理解できる気がしませんか?
Salesforce.comの提供しているForce.comプラットフォーム、とりわけForce.com CodeやForce.com Pagesは他言語プログラミング経験者にとても優しい設計になっています。この優しい言語設計がSalesforce.comをクラウドの世界でダントツの知名度・利用社数を誇るサービスにしている理由の1つとなっていることはまず間違いないでしょう。
Copyright © ITmedia, Inc. All Rights Reserved.