はじめに

今回は前回に引き続き、デバイスのモデリングについてです。組込系システムでは同じデバイス(同じ形式のデバイス)がシステム内にいくつも存在していることがよくあります。例えば、同じ形式のモータを何箇所かに取り付けているような場合です。こうしたシステムをモデル化する際によく陥ってしまう誤りがあるので、今回はその辺りを取り上げていこうと思います。

クラスとインスタンスの違い

前回、デバイスのモデリングを行うときは、デバイスの扱い方といった機能を中心としたモデル化を行うのは誤りで、対象内に存在するデバイスそのものをクラスとして捉えた方が良いという話をしました。

モータ
回転(速度:int):void
停止():void

では、その考えに基づいて次のような装置(搬送用ベルトコンベア)をモデル化したらどうなるでしょうか。

図:荷物を矢印の方向に搬送するベルトコンベア
荷物を矢印の方向に搬送するベルトコンベア。
前段モータと後段モータには同じサーボモータが使われており、
入場センサと退場センサも同じ赤外線センサが使われている。

よくある間違いは次のようなものです。

図:間違いの例

このモデルは、問題に登場するそれぞれのデバイスをそのままクラスとしてモデリングしたものです。一見、すべての要素がモデル内に登場しているので、良さそうに見えますが、前段モータクラスや後段モータクラスの中身を考えると、同じ内容の属性と操作が並んでしまいそうです。同様に、入場センサクラスと退場センサクラスの中身も同じになりそうです。通常、クラス図では、属性と操作が同じ内容なら同じクラスになるはずなので、このモデルには何か捉え方に誤りがあるということになります。

では何がいけないのかというと、クラスとインスタンスの区別がついていないことが原因です。この問題では、前段モータと後段モータは同じサーボモータだとしています。その違いは何かというと、用途(使い方)だけです。それ以外のサーボモータとしての仕様は全く同じものになります。こういった場合、前段モータや後段モータという存在はオブジェクト指向の観点からいうと、クラスではなくインスタンス(クラスから作られた実体)という扱いになります。つまり、前段モータや後段モータはサーボモータクラスのインスタンスと考えるのです。もう少し違った言い方をすると、どのような仕様の部品なのかを表す部分はクラスとなり、その部品の用途を表す部分はインスタンスとなるのです。こうした観点から前述の問題をモデル化すると、次のようになります。

図:モデリングした搬送用ベルトコンベア

このモデルでは、部品の仕様をクラスとし、その用途を関連端名(ロール名)として表現しています。こうすることで、それぞれの場所に取り付けられた部品がどのような役割を持っており、何から作られているのかをモデルで明示することができます。

前述したようなクラスとインスタンスの勘違いは組込システムのモデリングでは非常によく目にします。そうしたモデルでは1つのクラスから1つのインスタンスしか作られないようなモデルになっていることが多いので、皆さんもモデルもそうなっていないか確認してみてください。

前回・今回とデバイスのモデリングを取り上げてきましたが、実際の開発ではデバイスだけでなく、それを制御する部分のモデル化も必要です。次回はその辺を取り上げていきたいと思います。