組込みでのオブジェクト指向的思考


コメントください。
とのことなので,書いてみる.


ではなぜ、オブジェクト指向を取り上げずに、今なお構造化設計にこだわっているのか...
その理由は、クラス設計には、思考の転換が必要で、ハードルが高いと感じているからです。

RTOSを扱うということは,事前に与えられ継承不可能なクラス群のインスタンスを操作することと換言できる.
μITRONで提供されるリソース群は,カーネルオブジェクトと呼ばれる.μITRONオブジェクト指向RTOSではないが,オブジェクト指向的な何かを理解せずに使うのは,おそらく難しい.

私は筆者と面識があり,あまりに当然のことすぎて筆が滑ったのだろうと判っているのだけれども,ツッコまなければならないところはツッコむ.クラス設計はオブジェクト指向の部分集合でしかない.ここをすり替えてしまうとミスリーディングになってしまう.

筆者は初学者も想定読者としているようなので,念のため記しておくと,オブジェクト指向にはいくつかの流派があり,クラスベースはその一つ.別の流派に,オブジェクトベース*1というものもある.

組込みシステムでは,極めて似てはいるが同一ではない処理をさせることが多い.例えばシリアルポートが多数ついていて,1個だけがFIFO付きだったり,とか.このような時の定石の一つとして,実行単位オブジェクト*2のエントリポイントを複数にしながらも,共通にできるところは極力サブルーチンに纏めるという手がある.これはオブジェクトベースの考え方に(洗練はされていないが)近い.

さらに言うと,データ構造に関してはオブジェクト指向の理解は必須と言ってよいと思う.
言語処理系や通信パケットをやり取りするようなアプリケーションのC言語記述では,しばしば下記のような構造体に出会う.

struct atom {
    int type;
    union {
       int integer;
       struct {
         char *buffer;
         size_t size;
        } string;

これは,integer と string が atom クラスのインヘリタンスであると見ることもできる.実際,オブジェクト指向言語では,そのように記述されるのが一般的である.

μITRON系のカーネルでは,メールボックスのT_MSG構造体で,上記のような手法が(やや強引な型キャストと共に)使われている.判っていない人は誤用してカーネルパニックを起こす.μITRONアプリの開発者の大半が,一度は通る道(?)である.

クラスベースの設計思想が判っていないと,この辺りをきちんと理解するのは難しいかもしれない.

というわけで

組込みでもオブジェクト指向の習得は,やはり必要であるのでは,と.
しかもOSの使用が珍しくなくなった昨今,初学者だからといって逃げられないかもしれない.

余談

とは言っても,いきなりクラスとインヘリタンスから説明を始めてしまうオブジェクト指向本が多くて,組込みシステムの実開発現場に取り込みづらいというのは,言えるような気がする.
…とかいうことを放言しておくと「じゃあお前が書け」って話になりそうなので,割といいんじゃないかなと思う構成の本へのリンクをつけて逃げる.

リアルタイムUML―オブジェクト指向による組込みシステム開発入門 (Object Oriented Selection)

リアルタイムUML―オブジェクト指向による組込みシステム開発入門 (Object Oriented Selection)

原書は3版になっている.和訳は2版で,UML的には古くなってしまった.けれども,UMLの書き方を学ぶのではなくオブジェクト指向の組込みシステム適用のエッセンスを学ぶのであれば,今も十分に役に立つ.たぶん.

*1:プロトタイプベースと呼ばれることもある

*2:スレッドとかタスクとか割込みハンドラとか