組み込みC/C++

C/C++リテラシー向上のためのページ

オブジェクト指向?

構造化プログラミングからオブジェクト指向へというのをよく聞きます。

 

構造化プログラミングの定義を調べると「一つの入口と一つの出口を持つプログラムは、順次・選択・反復の3つの論理構造によって記述できる」とあります。

順次はPCが逐次実行されていく事、選択はif文、反復はfor, whileと考えてよいかと思います。ということは低水準言語からC言語への変遷で構造化プログラミングを意識するわけでもなく、構造化プログラミングが実現できているという事だと思います。今どきわざわざC言語でgotoを使っている人は見たことありません。アセンブリ時代のコーディングはこの三つの文に集約させる事がむしろ難しかったのかと想像します。

 

オブジェクト指向ですが、これがC言語からC++言語へ変遷しても実現できるものではありません。C++言語ではC言語の文法で書けてしまい、これがオブジェクト指向導入への一つの壁になっています。チームのメンバ一人一人がC++文法に習熟しないとオブジェクト指向へは遷移できません。オブジェクト指向で書かれたプログラムがどれくらいオブジェクティブか?というメトリクスというのは見たことありませんが(印象で語られる事が多いのかと思いますが)オブジェクト指向のプログラミングは概ね次のような特徴があるようです。

 

・コードから意図が汲み取りやすい。(C++のセマンティクスで実現される。)

・コード変更の影響範囲が狭い。(グローバル変数を使わず、クラスの隠蔽化で実現される。newを多用する。)

・少ないコード変更で機能追加を実現できる。(デザインパターンやイディオムを使用して、多相性、継承、テンプレートで実現される。)

・コードの再利用性が高い。(デザインパターンやイディオムを使用して、多相性、継承、テンプレートで実現される。)

 

とはいえ、組み込み現場というのは、newが使えない環境であることが多く、OSもつんでおらず、つんでいたとしてもitronのような低水準なものだったり、イベントドリブンではなくて疑似的なマルチタスクプログラミングを使用して、信じられない数のグローバル変数であふれかえり、まったく隠蔽されていないオブジェクト同士がどういった依存関係になっているか想像もつかず、似たような処理がいたる所に散在していて、開発メンバそれぞれが自分ルールを持っていたりするわけです。

 

オブジェクト指向への道は遠いですが、一つ一つ学んでいくことにより、それっぽいのが出来ればなと思っています。