Salesforce Mobile SDKでBlocksパターンを使ってみよう

はじめに

みなさん、こんにちは。 走れるシステムエンジニア、溝口です。 最近はモバイル開発に熱中するあまり走る方が疎かになってきてしまって、「走れたシステムエンジニア」になってしまいそうです。 この辺りのバランスを取るのは非常に難しいですが、仕事と競技の両立はこの先も続けていきたい所ですね。

では、今回もSalesforce Mobile SDKを使用したiOS開発についてのテクニックをご紹介したいと思います。

Salesforce Mobile SDKの開発を始める際、みなさんは恐らくターミナルからforceiosコマンドを使用し、作成されたサンプルアプリケーションを元に開発を始めると思いますが、ここで使われているDelegateパターンがしばしば使いにくいと感じることはありませんか? SOQLクエリー、Insert、Update、Deleteの処理結果が全て1つのメソッドに集まり、コードが非常に見づらくなってしまうことがあるかと思います。

そこで、今日はそんなDelegateパターンの見づらいコードを改善する為に、Salesforce Mobile SDKの機能の1つでもあるBlocksパターンを紹介します。

Salesforce Mobile SDKのDelegateパターン

では、まずSalesforce Mobile SDKのforceiosコマンドで作成されるデフォルトのアプリケーションを元に、Delegateパターンを使用したコードが一体どのようなものなのか、見てみましょう。


send:delegate:メソッドが呼ばれると、デリゲートとして設定されている

request:didLoadResponse:メソッドがクエリーの結果として呼び出されます。

今回は単純に名前を指定しユーザーオブジェクトに検索をかけ、ユーザーIDを取得後、ログを出力するだけの処理です。 これだけであれば、特に問題なくコードを読むことが出来るかと思います。 しかし、次のように機能を追加したとしたらどうでしょう


先ほどの処理で取得したユーザーIDを所有者として持つ取引先を検索する処理を追加しました。 (本来であればサブクエリを使う所ですが、今回はあくまでDelegateパターンの凡例ということでこの様な記述をしています)

一気にコードを追いにくくなってしまいました。 searchUserメソッドの処理結果としてデリゲート先のrequest:didLoadResponse:メソッドが呼ばれて、そこからまたsearchAccountWithUserId:メソッドを呼んで、結果が返ってきて・・・と、何度もソースを行ったり来たりしなくてはなりません。

CRUD処理全てがrequest:didLoadResponse:に集約されてしまう以上、このようなことが起きてしまうのは仕方がないことでしょう。 Delegateパターンではこのように処理を実行するメソッドと、コールバックを受けるメソッドが交錯してしまい、可読性が低くなってしまうという欠点があります。

では、このような欠点を解決する為にはどうしたらいいのでしょうか?

Blocksパターンを使ってみよう

ここで、Objective-CのBlokcsパターンを使用してみましょう。 (今回はBlocks構文自体についての解説は割愛させて頂きます) Salesforce Mobile SDKではSalesforceとの通信方法として、Delegateパターンの他にSFRestAPI+Blocksクラスを使用したBlocksパターンも用意されています。

では、このBlocksパターンを使用するとどのように先ほどのコードが変わるのか、見てみましょう。


先ほどのDelegateパターンと比べて、クエリーを実行するメソッドと、クエリー結果を受け取るメソッドが明確に分離され、コードを上から順番に読むことが出来るようになったので、可読性が非常に高くなりました。

Blocksパターンではこのようにコールバック先のメソッドを自ら指定することが出来るので、処理が複雑になったとしても1つのメソッドの中身が膨らむこと無く記述することが可能です。

おわりに

如何でしたか?今回はSalesforce Mobile SDKのちょっとした小ネタを紹介させて頂きましたが、この他にももっと色々な便利な機能が用意されています。 5月9日で行われるTerraSky Power NightではSalesforce Mobile SDKに関する話をもっと手広く紹介したいと思います。

【告知】 TerraSky Power Night 番外編 テラスカイでは定期的に社内で勉強会を行っていますが、TerraSky Power Night 番外編と題してオンライン配信することにしました。 実際の案件を通じて得た経験をForce.comエンジニアの皆さんと共有し、Force.comコミュニティがますます盛り上がるよう多少なりとも貢献していきたいと思っています。 是非お気軽にご参加ください。

TerraSky Power Night 番外編 ~ テラスカイの社内勉強会をまるっと公開します!~

開催日時:5/9(金) 19:00-20:00

参加費:無料

場所:オンライン配信