AngularJS TIPS
アプリ内でよく利用するビジネスロジックを定義するには?(factoryメソッド)
より実践的なアプリ開発を行うために、アプリ固有のビジネスロジックをfactoryメソッドによりサービスとして切り出し、それを呼び出す方法を説明する。
別稿「TIPS:アプリ内でよく利用するビジネスロジックを定義するには?(serviceメソッド)」では、service
メソッドを使って、他のサービスと連携しながら、アプリ固有のビジネスロジックをサービス化する方法について解説しました。
AngularJSでは、ビジネスロジックをサービス化するために、service
メソッドともう一つ、factory
というメソッドを提供しています。両者はよく似ていますが、構文が異なります。
[構文]factoryメソッド
factory(name, func)
- name: サービスの名前
- func: サービスのインスタンスを生成するための関数
まずは、前掲の別稿で作成したAreaService
サービスを、factory
メソッドで実装し直してみましょう。AreaService
サービスは、
- 四角形の面積を求める
square
メソッド - 円の面積を求める
circle
メソッド - ひし形の面積を求める
diamond
メソッド
を備えているものとします。
angular.module('myAppService', [])
.factory('AreaService', ['$log', function($log) {
return {
square: function(base, height) {
$log.debug('[四角形]' + base + '×' + height);
return base * height;
},
circle: function(radius) {
$log.debug('[円(半径)]' + radius);
return radius * radius * Math.PI;
},
diamond: function(diagonal1, diagonal2) {
$log.debug('[ひし形]' + diagonal1 + '×' + diagonal2);
return diagonal1 * diagonal2 / 2;
}
}
}]);
|
<!DOCTYPE html>
<html ng-app="myApp">
<head>
<meta charset="UTF-8" />
<title>AngularJS TIPS</title>
</head>
<body ng-controller="MyController">
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular.min.js"></script>
<script src="scripts/factory.js"></script>
<script>
angular.module('myApp', ['myAppService'])
.controller('MyController', ['$scope', 'AreaService',
function($scope, AreaService) {
console.log(AreaService.square(3, 2));
console.log(AreaService.circle(3));
console.log(AreaService.diamond(4, 9));
}]);
</script>
</body>
</html>
|
AreaService
サービスを定義&呼び出すコード(上:factory.js/factory_app.html) service
メソッドでは、第2引数として「サービスをインスタンス化するためのコンストラクター関数」を指定していたのに対して、factory
メソッドでは「サービスのインスタンスを返す関数」(ここではオブジェクトリテラルを返す関数)を指定するわけです。
この性質上、サービスの機能を直接的に定義する場合にはservice
メソッドが向いています(factory
メソッドではインスタンス化の手順を踏む分、一段階、コードが冗長になります*1)。一方、すでにサービス化したい機能がクラスとして用意されている、既存のメソッドの戻り値をサービスとして公開したい、などのケースでは、factory
メソッドが向いています。例えば、既存のクラス/メソッドをサービス化するには、以下のようにします。
- *1 ですから、上のサンプルのような例では、
service
メソッドの方が適切です。
.factory('FactoryService', function() {
return new MyClass();
})
|
.factory('FactoryService', function() {
return MyClass.getInstance();
})
|
処理対象:サービスの切り出し カテゴリ:基本
API:angular.Module カテゴリ:ng(コアモジュール) > type(型)
※以下では、本稿の前後を合わせて5回分(第64回~第68回)のみ表示しています。
連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。
64. 複数のコントローラー間で共有すべき値を管理するには?(constantメソッド)
より実践的なアプリ開発を行うためにアプリ固有の処理ロジック(今回はconstantメソッドにより管理する「値」)をサービスとして切り出し、それを呼び出す方法を説明する。
65. アプリ内でよく利用するビジネスロジックを定義するには?(serviceメソッド)
より実践的なアプリ開発を行うために、アプリ固有のビジネスロジックをserviceメソッドによりサービスとして切り出し、それを呼び出す方法を説明する。
66. 【現在、表示中】≫ アプリ内でよく利用するビジネスロジックを定義するには?(factoryメソッド)
より実践的なアプリ開発を行うために、アプリ固有のビジネスロジックをfactoryメソッドによりサービスとして切り出し、それを呼び出す方法を説明する。
67. パラメーター付きのサービスを定義するには?(providerメソッド)
value/service/factoryメソッドに比べてより原始的なproviderメソッドの利用場面を紹介し、使い分け指針をまとめる。またproviderメソッドを使ってサービスを定義する方法を解説する。
68. AngularJSアプリの単体テストを実施するには?(準備編)
AngularJSで一般的に採用されているテスティングフレームワーク「Karma+Jasmin」による単体テスト環境を構築する手順を説明する。