JavaScript SDKにはmBaaSを汎用的に使うための機能は揃っていますが、アプリにはそれぞれ特有の機能が組み込まれるものです。そうしたロジックをすべて関数として提供するのも一つのやり方ですが、コードがスパゲティになりやすい傾向があります。
そこで今回は既存のSDKを拡張する方法を紹介します。なお、注意すべき点もありますので副作用を正しく理解した上でご利用ください。
オブジェクトを拡張する
一つ目はオブジェクト自体の拡張です。データストアで複雑な条件を使って検索を行う場合に、各処理でそれを書いていると統一できません。そのため、関数にまとめるのがよくある方法です。
function searchDataStore(limit) { var Test = ncmb.DataStore("Test"); return Test .limit(limit) .greaterThan("playerAge", 18) .in("playerName", ["Taro", "Jiro", "Saburo"]) .fetchAll() }
これをオブジェクトの拡張で行うと次のようになります。
var Test = ncmb.DataStore("Test"); Test.searchDataStore = function(limit) { return this .limit(limit) .greaterThan("playerAge", 18) .in("playerName", ["Taro", "Jiro", "Saburo"]) .fetchAll() }
このようにTestオブジェクトに関数を追加してしまいます。こうすれば、
Test.searchDataStore(100) .then(function(results) { })
のように、まるでSDKのメソッドのように扱うことができます。注意点としては、メソッド名が被ると既存のメソッドをオーバーライドしてしまう点です。被らないようにネームスペースを設けるなどした方が良いでしょう。
インスタンスを拡張する
次にインスタンスを拡張する方法です。これは例えばユーザに特定のフラグがあるか(管理者かどうか)などを判定するのに使います。関数で行うと次のようになります。
function isAdmin(user) { return user.adminFlag === true || user.objectId === 'aaa' }
これでも良いですが、より扱いやすくするために prototype を拡張してみましょう。
ncmb.User.prototype.isAdmin = function() { return this.adminFlag === true || this.objectId === 'aaa' }
こうすると、new ncmb.Userに対してisAdminメソッドが使えるようになります。
var user = new ncmb.User; user.isAdmin(); -> false
インスタンスの中にメソッドが追加されることでより扱いやすくなるでしょう。なお、こちらもまたメソッドをオーバーライドする可能性があるので注意してください。
ES5時点でのJavaScriptのオブジェクト指向は弱く、メソッドのオーバーライドを防ぐ仕組みがないのが難点です。とは言え、オブジェクトを拡張する方法は使う処理と実際のオブジェクトが近い場所にあるのでコードがまとまります。
注意すべき点はありますが、より分かりやすいコードを維持するためにも検討してみてください。