倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

はじめての幻獣 Griffon 研 (7) : Service を作成する create-service

前回までで『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 を使用するのに必要な手順は概ね次の通り:

  1. Service クラスを生成する
  2. Service クラスの処理を実装する
  3. (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)を宣言すると自動でそのインスタンスがセットされるようです。

これで実装完了です。 実行結果は・・・前回と同じですよね。

Groovyイン・アクション

Groovyイン・アクション