ショートカット
ファシリテーター × あり方
コーディングの向こう側
Hello, ANOTHER world!
オブジェクト指向のはなし
プログラミングのはなし
C言語実力診断クイズ
eSkillBooks
オブジェクト指向のはなし

実装はCでもいい

導入

オブジェクト指向を実践するには、C++ などのオブジェクト指向言語が必要でしょうか?

解説

結論から言うと、使う言語が C++ でないからといってオブジェクト指向を使えないということはありません。

開発を2つの段階にわけて考えてみましょう。すなわち設計段階と実装段階です。もちろん、これら2つの段階は複雑に絡み合いながら同時進行しますが、話を単純にするために2つにわけることにします。

  1. 設計段階でオブジェクト指向を使えない理由は何ひとつありません。
  2. 実装段階でオブジェクト指向を使えない理由は何ひとつありません。
設計段階でのオブジェクト指向

C、C++、Java、BASIC などようなの手続きを記述するタイプの言語を使っている限り、設計は(細かいインターフェイス仕様などの設計を別にすれば)言語に依存しません。つまり、どの言語を用いるかによって設計のやり方を変える必要はありません。設計をするということは、一言でいえば「モデル化する」ということであり、つまり考え方とか、ものの見方の問題です。

ただし、Prolog などのような特殊な言語を使用する場合は話は別かも知れません。

もし設計段階でオブジェクト指向を妨げるものがあるとすれば、それは開発チームの技術水準でしょう。あなたが設計担当で、だれかほかのオブジェクト指向を経験したことのない人たちが実装担当だとしたら、オブジェクト指向で設計するのは逆効果になり得ます。実装担当者が理解できないようなモデル化をしたところで意味がないからです(むしろ理解を妨げる可能性すらあります)。

しかし関係者がオブジェクト指向によるモデル化を理解できるなら、設計段階でオブジェクト指向を使えない理由はないのです。

余談ですが、実装担当者に理解できないような高度なモデル化をわざとしたいと思う人はいるでしょうか。つまり、そうすることによって自分の有能さをアピールすることができると考えてしまいがちではないでしょうか。いや、むしろ無意識にそういうことをやっていないでしょうか・・・。「設計は理解されなければ意味がないんだ」ということを、どうやら私たちは本当に肝に銘じる必要がありそうです。

実装段階でのオブジェクト指向

オブジェクト指向が特定の言語のことでないとすると、オブジェクト指向を前提としていない言語でも考え方だけはオブジェクト指向という風にできます。これは、開発者にとってとても重要なことです。未経験の言語で開発を行わなければならなくなったときでも、その文法さえ覚えればいままで通りの考え方でやっていくことが可能になるのです。

たとえば C 言語でオブジェクト指向風の実装を行うためにちょっと頭をひねってみると良いでしょう。できないと決めつけさえしなければ、意外とできるものです。どうやったらいいか、いくつかヒントを提示しておきます。答えはひとつではないはずなので、あくまでヒントだけ・・・

  • クラスは構造体で代用する(事実、C++ の class は C++ の struct とほとんど同じであり、C の struct の拡張版である)
  • new や delete にあたるものをクラス毎につくる
  • メンバ関数(にあたる関数)の第1引数は、操作対象となるオブジェクトへのポインタとする(これは C++ の this ポインタのような役割をする)
  • コンストラクタやデストラクタの連鎖は手動で行う必要がある
  • コンポジションは、普通にできる
  • 継承は少し工夫が必要だろう
  • ポリモーフィズムは、たとえば関数ポインタをうまく使えばできるだろう
  • クラススコープがないので、識別子名の衝突を避けるための命名法を工夫する必要がある

もしあなたがオブジェクト指向の勉強をはじめたばかりなら、C 言語でも実践できるんだということが助けになるのではないでしょうか。「オブジェクト指向を覚えたいんだけど、うちの会社は頭が固くって C 言語しか使わせてくれないんだ」なんて言い訳を言いながら、ちょっと肩をすくめて見せたりする必要はないということです。

(「オブジェクト指向のはなし」は1999年2月から2000年4月にかけて作成されたコンテンツです。)