🔖

MVC アーキテクチャを Thingworx で考える

2022/01/20に公開

MVC アーキテクチャを Thingworx で考える

MVC アーキテクチャがどう適用されているかを理解するのがゴールです。

MVC アーキテクチャ

MVC は GUI アプリケーションのソフトウェア・アーキテクチャ・パターンの一つです。
アプリケーションを構成するモジュールを Model, View, Controller という呼び名で分類します。

  • Model
    ビジネスロジックやデータの保管や他システムとの連携を司るモジュールが含まれます。
    システムの中核部分です。
  • View
    GUI の表示を司るモジュールが含まれます。主に人に見せるための部分です。
  • Controller
    Model とも View とも言えないものが Controller になります。
    Model を適切な順番で起動したり、ユーザ入力を受け取って適切な Model に振り分けたり、View を動かすためのロジックの一部を置いたりします。

処理フローの基本は、Controller から Model への呼び出しです。
ユーザ入力に対するアクションがこの流れに従います。
逆方向になる Model から Controller への呼び出しは制限されるか禁止されます。
また、View が呼び出しの対象となることはありません。

それ以外のモジュール間の連携は、処理を直接呼び出すのでなくデータを取得してほしいという通知を送り、相手側に取り込みを促します。
Model から View もしくは Controller から View へは通知を送信し、View がデータ規約に従って取り込みます。

MVC は明快で使い勝手が良いため、いろいろなプラットフォームに取り入れられました。
その間改良が加えられ続けたため、MVC にはたくさんの派生が生じています。
大幅に改良されて新しい名称が付けられた MVC の派生もあります (MVVM など)
解釈の違いによっていくつもの MVC が存在します。Thingworx の MVC もその一つです。

Thingworx の MVC

Thingworx は開発元によって MVC であると謳われています。

https://support.ptc.com/help/thingworx/platform/r9/en/ThingWorx/Help/Getting_Started/ModelViewController.html

By using ThingWorx, you are taking advantage of the Model-View-Controller (MVC) pattern.

続く文章でどのように MVC が実現できるかを説明しています。

You are constructing a logical model of your device, which is independent of its user interface. You can then construct a view using the application builder. Finally, you connect (or bind) the model and the view, which produces the controller logic.

さっそく見てみましょう。

Thing

Thingworx では Thing と呼ばれるモノを個別に作ることが出来ます。
Thing には値を保持できる Property と、Javascript などで値を返す処理を記述できる Service を追加することができます。Thing は後述する Mashup からアクセスすることも、REST を使って呼び出すことも出来ます。
準備された Thing template を使って高度な Thing を作成すれば、任意の RDBMS を SQL を使って操作することも出来ます。
Thing に書かれたものは Model になりえます。

Widget

Thingworx で作成する Web ページが Mashup です。
Mashup には無数の Widget と呼ばれる部品を配置することができ、それぞれ表示や入力の機能を追加することが出来ます。外部 Web service を利用するための Widget もあります。
これらは Mashup Builder で編集することができます。
Widget は View と Controller を併せ持っていると見ることができます。

Data bindings

Widget は専用の Property を持ち、設定やデータの保持に使われます。
Widget の Property は相互に連携が可能で、ある Widget で入力された値を別の Widget の Property に接続することができます。
Data bindings はデータ変更の通知と、取り込みを自動化します。

Mashup には複数の Thing を紐づけることもできます。Thing を Widget に接続することで Thing から取り出したデータを Mashup のグラフやグリッドに表示できます。
Mashup で Widget と接続された Service は Data service となります。
Data service の特徴は All と SelectedRows の Property を持つところです。すなわち、Service から取得したデータが二次元形式であるかないかに関わらず、行選択のインタフェースを提供します。

Event bindings

Thing の Service でデータを取り出すには明示的な呼び出しが必要で、このときに使われるのが Event です。
Widget で特定の条件を満たすと Event が発生します。例えば、ボタンをクリックすることで Clicked event が発生します。
Mashup Builder で Event と Service を接続していれば、Event が発生した次のタイミングで Service が呼び出されます。
Event bindings は Widget と Thing を繋ぐ Controller の一部と見ることができます。

https://support.ptc.com/help/thingworx/platform/r9/en/index.html#page/ThingWorx/Help/Mashup_Builder/DataServicesandLinking/ViewingConnectionsInAMashup.html

結論

以上が Thingworx のアーキテクチャです。
Thingworx 自体は操作が簡単なため、Mashup Builder で Widget を接続するだけで Controller 相当のものができてしまいます。
それでも、アーキテクチャを理解することでより良い設計にすることができるでしょう。
お役に立てれば幸いです。

Discussion