倭マン's BLOG

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

はじめての幻獣 Griffon 研 (24) : マルチ MVC への道 (1) : MVC グループを新規に作成する create-mvc

さて今回から何回かにわたって、Griffon アプリケーションにて「マルチ MVC」を扱う方法を見ていきます(一覧)。 「マルチ MVC」とは、公式の用語なのかどうか知りませんが(以降、勝手に使います)、読んで字の如く、複数の MVC グループを扱うことを指します。 Griffon では、プロジェクトを作成した時点で1つの MVC グループが作成されますが、構造が複雑になってきたり、使い回したいコンポーネントがあったりした場合、新たに MVC グループを作成していくようです。

この記事では、専ら「マルチ MVC をどう構築するか」、「MVC グループ間の相互作用をどう実現するか」といったことに焦点を当てることにして、「どの部分を MVC グループとして切り出すか」といった設計レベルのことには基本的に触れません*1が、Griffon に付属しているサンプルを見る限りでは、以下の2つの場合にマルチ MVC が使われているようです:

  • 1つのある程度大きなビュー(コンポーネント)内で、1つの役割をする部分を切り出す場合(サンプル:Greet の LoginPanel)
  • Web ブラウザでタブ・ブラウズする際の各タブのように、同種のビュー(コンポーネント)を複数扱う場合(サンプル:FileViewer, WeatherWidget)

2つ目の使い方に関しては id:masanobuimai さんの「MVC Groupの切り替えを分かった気になってやってみた。」で扱われているので、この記事でも参考にさせて貰います。

一応の予定


一応、今後の予定。 この通りに行くかどうかは不明ではありますが*2

  1. MVC グループを新規に作成する
  2. MVC グループをコーディングする
  3. アプリケーション開始時に MVC グループを作成し、ビューを埋め込む
  4. アプリケーション実行中に MVC グループを作成する
  5. アプリケーション実行中に MVC グループを破棄する

3つ目が「1つのコンポーネント内で1つの役割をする部分を切り出す」使い方、4つ目が「同種のビューを複数扱う」使い方に対応します。

関数描画アプリケーション


「マルチ MVC」の機能も前回までに作成していた「関数描画アプリケーション」に追加していきます。 MVC として切り出す部分は「関数を Groovy コードとして入力する部分」とし、MVC グループ名は「MonolineFunction」(1行の関数)とします。

見た目を変えないようにすることも可能ですが、後々のために関数を入力する部分を上部 (north) から左部 (west) へ変更します。 変更後の見た目はこんな感じ:

  • 「Paint All」ボタンは前回までの「Paint」と同じく、グラフを描画するボタンです。 これは MonolineFunction グループには含めません。
  • サンプル数を指定する部分は簡単のため削除。
  • アプリケーション・タイトルやメニューなどが日本語化されてませんがあまり気にせずに。

MVC グループを新規に作成する


さて、今回は新たに MVC グループを作成する方法だけ見ておきます。 「MonolineFunction」グループを作成するためには、プロジェクトのルートのフォルダ下で以下のコマンドを実行します:

griffon create-mvc MonolineFunction

このコマンドを実行すると、以下の太字で示したファイルが作成(もしくはコードが追加)されます:

  • FunctionPlotter
    • griffon-app
      • conf
        • Application.groovy
      • models
        • functionplotter
          • FunctionPlotterModel.groovy
          • MonolineFunctionModel.groovy
      • views
        • functionplotter
          • FunctionPlotterView.groovy
          • MonolineFunctionView.groovy
      • controllers
        • functionplotter
          • FunctionPlotterController.groovy
          • MonolineFunctionController.groovy
    • test
      • integration
        • functionplotter
          • FunctionPlotterTests.groovy
          • MonolineFunctionTests.groovy

Model, View, Controller, Tests の内容はプロジェクト作成時に生成される MVC グループのもの (FunctionPlotter) と基本的に同じです。

Application.groovy

Application.groovy には、新たに作成された MVC グループの情報が追加されます:

application {
    ...
}
mvcGroups {
    // この MVC グループが追加
    // MVC Group for "MonolineFunction"
    'MonolineFunction' {
        model = 'functionplotter.MonolineFunctionModel'
        controller = 'functionplotter.MonolineFunctionController'
        view = 'functionplotter.MonolineFunctionView'
    }

    // この MVC グループはもともとある
    // MVC Group for "FunctionPlotter"
    'FunctionPlotter' {
        model = 'functionplotter.FunctionPlotterModel'
        controller = 'functionplotter.FunctionPlotterController'
        view = 'functionplotter.FunctionPlotterView'
    }
}

'MonolineFunction'{ ... } の部分が追加されます。

  • controller を使用しない場合は controller の行を削除するなど、必ずしも MVC の3組を作成する必要はないようです。
  • 逆に、通常 View に指定する actions を別ファイルに指定する場合に、「actions = ...」などとして MVC 以外のコンポーネントを追加することもできるようです。

次回からはコーディング。

Griffon in Action

Griffon in Action

*1:拙者の能力的に触れられません。

*2:1項目1記事の予定ですが、いくつかの記事に分けたり、新たに機能を追加したりするかもしれません。 以下の箇条書きもいつの間にか変更されてるかも。