はじめに
今回は組込系のシステムをモデリングする際に必ず登場するデバイスのモデリングについて触れてみたいと思います。組込系システムではデバイスの制御が必須ですが、開発の現場で見ていると、その部分のモデルは意外に書けていないことが多いです。何をクラスにすれば良いのかといった視点からこの辺りを見ていってみましょう。
デバイスのモデリング
組込系のシステムをモデル化する場合、モデル化対象となっているソフトウエアの開発者か、過去にソフトウエア開発経験のある人がモデリングを行うことが多いと思います。そうした時によくあるのが、ソフトウエアのイメージに基づいてモデリングをしてしまうということです。組込系のソフトウエアはC言語で作られていることが多いですから、ソフトウエアのイメージというとデータと関数の集合体になります。これをイメージしてモデリングを行うと、デバイスに相当する部分はデバイスを制御している関数、例えばモータに関するものであれば、「モータ回転」や「モータ停止」、「等速移動開始」といったものがクラスとしてモデル化されていきます。
| モータ回転 |
| 実行(速度:int):void |
| モータ停止 |
| 実行():void |
| 等速移動開始 |
| スタート():void |
こうした、機能をクラスとしたモデル化は組込系の現場でよく目にしますが(ちなみに、業務系ではデータをクラスとしたモデル化になります)、これらのクラスで作られたクラス図はUMLで表現しようとしている、オブジェクト指向のモデルではないものになってしまっています(機能構造のモデルですね)。
では、オブジェクト指向らしいモデルではデバイスはどのようにモデル化されるのでしょうか。オブジェクト指向はオブジェクト(対象)というぐらいですから、制御したい対象をオブジェクトとして捉えるように考えていきます。例えば、上記のモータ回転やモータ停止の例でいけば、制御したい対象はモータですから、モータそのものをクラスとします。
| モータ |
| 回転(速度:int):void 停止():void |
そして、このクラスの持つ回転()や停止()の操作の実装にデバイスドライバを叩く部分(モータに対応するアドレスにシグナル値を代入する等)を入れることになります。こうすると「モータを回転させる」という人間の思考と同じように、プログラムで「aモータ->回転(10)」と記述することができるようになります。この人間の思考と同じようにソフトウエアを考えられるようにすることがオブジェクト指向で実現したいことですので、モデルもそうなるように作っていくのが理想です。
ということで、組込系のモデリングではデバイスは制御する対象(オブジェクト)となるものなので、デバイスそのものがクラスとなるようにモデルを作ってみてください。
ここでひとつ問題です。では、制御対象となっているモータが複数存在する場合はどうモデリングしましょうか。これも組込系のモデリングでよく問題になる部分です。次回はこの辺りについて取り上げていきたいと思います。










