AngularJSでカスタムサービスを作成するときの作成法まとめ
AngularJSでカスタムサービスを作成することは非常に大切です。なぜならビジネスロジックはサービスとして書くべきであり、そのようにプログラミングすることが想定されているからです。(少し自信ありませんが、多分そうです)
カスタムサービスを作成する方法ですが、いくつか選択肢があります。
- $provide#value メソッド
- $provide#service メソッド
- $provide#factory メソッド
- $provide#decorator メソッド
- $provide#constant メソッド
- $provide#provider メソッド
個人的にはserviceメソッドだけ使っていれば事足りるのでいいや、という気もするのですが、できれば使いわけたいです。valueやconstantを使い分けられるとコードの可読性と保守性が上がりそうです。そんな訳でこれらの違いや使い方について自分なりにまとめます。
・・・と思ったら、既に以下の公式ドキュメントや、その翻訳ドキュメントで割といい感じにまとまってました。
参照リンク
公式サイト Provider - AngularJS AngularJS Documentation for providers
翻訳資料 $provide | AngularJS 1.2 日本語リファレンス | js STUDIO プロバイダーについて | AngularJS 1.2 日本語リファレンス | js STUDIO
説明
valueとconstantは名前の通り、値を表現・提供するサービスのようです。複数のコントローラ間で値だけ共有したい、というようなシーンに使うと良いと思います。constantは定数と言いつつ値の変更はできるので、その点が少し気になりました。
valueとconstantの使い分けですが、valueはconfigフェーズ(メソッド)でInjectできませんが、constantはできる、という違いがあります。
例えば上記のコードはconstantレシピのサービスを作成してconfigで利用していますが、これをvalueレシピに変更すると動かなくなります。
providerは全てのメソッドの低レイヤAPIのようなもののようですね。覚えなくても大丈夫でしょう。
decoratorはサービスの新規作成もできますが、既存サービスの拡張という用途のようです。これはよく理解できていません。どんなときに使うんでしょうか・・・。誰か利用ケースを教えてください。
問題はserviceとfactoryですが、この違いも既に参考となるものがありました。
Tea for Coding: [Angular.js]factoryとserviceの使い分けについて angularjs - angular.service vs angular.factory - Stack Overflow
factoryの場合、returnしたものが公開APIなので、returnしない部分に好きな処理を書ける、という点がserviceと違いますね。これは便利かも?
まとめ
- グローバルに近い値、複数コントローラで共有した値がある場合 value, constant
- configフェーズでInjectして利用したい場合 constant
- ステートレスなビジネスロジックを作成したい、またはユーティリティクラスを作成した場合 service
- ステートフルなビジネスロジックを作成した場合 factory
※もちろん新規参入者の学習コストを下げるため、factory統一で行く!とかもありだと思います。一つの指標になれば幸いです。