オブジェクト指向設計の必要性について考える組込みソフトウェアの開発で使う言語はいまだにC言語が多いと聞く。2018-2019」のデータである。これによると,開発言語がC言語であると解答した組織が108で,C++と解答した組織81をまだ上回っている。ちなみに,一位はJavaの629である。対応済みなので,C言語を使っているのはコンパイラがC++に対応していないという理由ではないと思う。それは「C言語でできるのに,わざわざC++で作り直す,C++を学習し直す必要あるのか?」という単純な問いに答えられないからではないだろうか。日本人が英語を学習するのと同じで,言語の習得というのはハードルが高く見えるものだ。実際使いこなせるようになるには,それなりに時間もかかる。,「C言語でできるのに,わざわざC++で作り直す,C++を学習し直す必要あるのか?」という問いに対する答えはちゃんと用意しておいた方がよい。自分なら「ソフトウェアの再利用率を高め,開発効率と品質向上のために必要で,10万行を超える規模のソフトウェアアプリケーションではオブジェクト指向言語を使わないと自転車操業から抜けきれない。実際,同じ機能のアプリケーションソフトウェアをCPUやOSが変わる度に作り直して問題を作り込んでしまっている例を少なからず見るが,作り直す工数も馬鹿にならない上に,リリースしたあとに見つかった不具合の対応がこれまた大変だ。ソフトウェアは見えにくいから,ソフトウェアアイテム(モジュール)の再利用率も見えにくい。ハードウェアならば,共通部品を使ってコストダウンを図る取り組みが外から見えるのに,ソフトウェアでは過去に作ったことのある機能のソフトウェアモジュールを新たに作り直しても誰も文句を言わない。なってしまう理由はいろいろある。その機能のソフトウェアモジュールがすでにあることを知らなかった。ソースコードはあったが,使い方が分からないので新規に作ったほうがいい。他人の作ったソフトウェアは使いたくない。新規に作った方が売り上げが上がる。(派遣や請負のソフトウェア開発)再利用せよという指示がなかった。OSやCPUに依存している箇所があるので使えない。そもそも,再利用できるようなソフトウェアとして作っていない場合,確かに再利用は難しい。いう組織は「再利用」という言葉は使わず「流用」という。再利用することを意図して作ったソフトウェアではなく,たまたまそこにあったものを使い回すのが「流用」で,流用レベルでしか使ったことがないのだ。いう組織,プロジェクトではコードクローン(同じようなコードがシステムのあちこちに散らばっている状態)が多い。数千行のソフトウェアで製品が動いていたころ,青春時代を過ごし管理職になった技術者は「ソフトウェアを再利用しなければもう無理」という感覚にならないかもしれない。数十万行,数百万行まで増大してししまったソフトウェアを前に「なぜ,不具合がなくらなないのか」「どうしてソフトウェアエンジニアはミスを繰り返すのか」と自問し続けて負のスパイラルから抜け出せなくなっているのではないだろうか。その状態を脱却するには,再利用率の高いソフトウェアを作るしかない。資産価値の高いソフトウェアモジュールを再利用できれば,その組織のコアコンピタンスになるし,信頼性の高いソフトウェアモジュールを何回も再利用できれば,開発効率と品質を同時に上げることができる。C++を体験してみる。C++言語を学習するには「基礎からしっかり学ぶC++の教科書」を読むことをお勧めする。C++言語の概要は知っているという前提で進める。亀のひな形を例にして説明する。オブジェクトを使う側の者は,オブジェクトに対して必要な命令を与えて,レスポンスを受けるだけの方が使い勝手が良い。オブジェクトの中身の複雑なアルゴリズムなどは知らない方が,責務を分担できる。責務を分担して,オブジェクトの責任と権限を移譲するという考え方は,大規模・複雑化したシステムでは有効だし,そうしていかないと数十万行以上のソフトウェアシステムではやってられない。100万行を超えるようなソフトウェアシステムでは「隅々まで把握している技術者がプロジェクトに一人以上いる」という状態を維持できない。クラスを設計してみる。メンバ)に持つ外部からは,左を向く,右を向く,指定距離だけ前進することを指示できる。外部から,現在のX座標,Y座標,向きを尋ねることができる。右を向けとか,左を向けとか,nだけ前進しろとか,今の向きやX,Y座標を聞いたら答えてくれるだけの方が使い勝手がいい。中身を知っていると中身をいじりたくなってしまう。これがC言語開発の良くない点だ。そもそも再利用することを前提に作っていないので,ベターッとソースコードをいじってしまう。さわらなくていいところを隠蔽して,インタフェースだけをアクセスできるようにしようという意図がない。C言語でそういった変数や関数の隠蔽は可能だが,そういう意識を持った人だからできることであり,C++を使えば言語上の縛りがあるから,自然とそういった設計になる。ひな形(クラスが持つメンバ変数,メンバ関数が定義されている。このひな形を元にして,オブジェクトを生成(ひな形で定義した変数,関数の領域を確保して,初期化して使えるようにする)する。同じ性質を持つオブジェクトを複数生成し,それぞれを独自に動かすことができる。別々のタートルとして,動かすことができる。これは構造体を使って実態を2つ作るのと同じだ。組込みではクラスとオブジェクトは一体一のことが圧倒的に多いからもしれないが,このしくみを使うと意外と簡単におもしろいことができるようになる。生成し,現在の位置を表示。