前回までで『Groovyイン・アクション』 Chapter 8 に載っている関数描画アプリケーションは出来上がりましたが、ちょっと惰性で Griffon を弄っていきます(一覧)。
今回は Service の作成。
Service とは?
Griffon での Service とは
Services are responsible for the application logic that does not belong to a single controller.
だそうです*1。 まぁ、特定の Controller に限定しない処理を抜き出して使い回しができるようにするためのもの、って感じでしょうか。 前回までに作成した関数描画アプリケーションには似たような処理がないので特に Service を使う必然性はないのですが、まぁちょっと無理矢理にでも使ってみましょう。
Service の分析
Service は Controller に定義されてる処理から抜き出すんでしょうけど、FunctionPlotterController に定義されている処理は
- paintGraph
- showAbout
の2つしかないですねぇ。 paintGraph (グラフの描画)はあんまり使い回すって感じでもないので、showAbout の処理を考えましょう。 「ダイアログにメッセージを表示する」ってのは何か使い回しが利きそうなので、これを Service として抽出することにします。
Service 名 | 説明 |
---|---|
message | ダイアログにメッセージを表示する |
Service 作成の手順
Service を使用するのに必要な手順は概ね次の通り:
- Service クラスを生成する
- Service クラスの処理を実装する
- (Controller から) Service を使用する
Service クラスを生成する create-service
Service は特定の Controller に依存しないということなので、名前は既存の MVC グループとは関係なく付けられます。 ここでは Service 名を message としましょう。 Service (の処理を実装するクラス)を作成するためには、プロジェクトのルート・フォルダ上で以下のコマンドを実行します:
griffon create-service message
この結果、griffon-app/services フォルダ下にパッケージ階層に対応するフォルダ構造と Service クラスを定義するソースファイルが生成されます:
- FunctionPlotter (ルート・フォルダ)
- griffon-app
- models
- views
- controllers
- services
- functionplotter
- MessageService.groovy
- others
- test
- unit
- functionplotter
- MessageServiceTest.groovy
- others
- service フォルダがない場合は、自動で作られます。
- 対応するテストコード (MessageServiceTest.groovy) も生成されます。
Service クラスの処理を実装する MessageService.groovy
次は Service の処理を上記で生成された Service クラスに記述します。 ソースファイルは
- FunctionPlotter/griffon-app/services/functionplotter/MessageService.groovy
です。 ここでは show() メソッド(あれ、分析になかったね。 まぁいっか)に処理を記述しています:
package functionplotter import javax.swing.JOptionPane class MessageService { def show(String message) { JOptionPane.showMessageDialog(app.windowManager.windows[0], message) } }
- デフォルトで app プロパティによって Griffon アプリケーションを取得できるようです。 ダイアログの親となるウインドウはここから取得します。
Service を使用する FunctionPlotterController.groovy
最後に既存の Controller から上記の Service を使用します。 上記の Service を使用するのは FunctionPlotterController でした(ていうか、それしか Controller が無ぇ)。 MessageService を使用するには以下のようにします:
class FunctionPlotterController { def model def view def messageService // MessageService の (Singleton) インスタンスが自動でセットされる def paintGraph = { evt = null -> ... } def showAbout = { evt = null -> messageService.show( '''A Function Plotter that serves as a SwingBuilder example for Groovy in Action''') } }
- Service オブジェクトは singleton として扱われ、Controller 中に Service クラスの単純名と同じ名前のフィールド(ここでは messageService)を宣言すると自動でそのインスタンスがセットされるようです。
これで実装完了です。 実行結果は・・・前回と同じですよね。
- 作者: Dierk Konig,Andrew Glover,Paul King,Guillaume Laforge,Jon Skeet,杉浦孝,櫻井正樹,須江信洋,関谷和愛,佐野徹郎,寺沢尚史
- 出版社/メーカー: 毎日コミュニケーションズ
- 発売日: 2008/09/27
- メディア: 単行本(ソフトカバー)
- 購入: 5人 クリック: 146回
- この商品を含むブログ (121件) を見る