なぜあなたはC#でオブジェクト指向プログラミングができないのか?2

当サイトではアフィリエイト広告を利用しています。

オブジェクト指向設計
[chat face=”496313.png” name=”アンダーソン” align=”left” border=”yellow” bg=”yellow” style=”maru”] 前回はオブジェクト指向の必要性や,なぜオブジェクト指向でないプログラマーが存在するかについて解説しました[/chat]

今回はオブジェクト指向プログラミングの中身を順番に見て行きたいと思います。

前回を読んでない方はこちらを先に読んでください。

なぜあなたはC#でオブジェクト指向プログラミングができないのか?1
オブジェクト指向でプログラミングをするってどういう意味か分かりますか? オブジェクト指向言語であるC#を使ってプログラミングをしていても,オブジェクト指向的にプログラミングできているものと,そうでないものがあります。 プログラミング初心者に...

なぜオブジェクト指向プログラミングは難しいと感じるのか?

はじめてオブジェクト指向に触れたとき,私はさっぱり意味がわかりませんでした。
プログラマーの会社に入社し,上司はCOBOLしか経験がなく,私は一人でオブジェクト指向の本を読んで勉強しました。
最初に読んだ本はこれでした。

オブジェクト指向でなぜつくるのか 第2版

この本を読むと,なぜオブジェクト指向で作るのか?というと,「それは簡単にプログラムを作りたいから」というような内容で始まります。さっぱり意味がわかりませんでした。オブジェクト指向は難しい!って頭の中で感じていましたし,VB6しかやったことのない先輩は,オブジェクト指向はとても難しいと言って,まともに私に教育できる人はいませんでしたから。

[chat face=”496313.png” name=”アンダーソン” align=”left” border=”yellow” bg=”yellow” style=”maru”]今ではこの本の意味がよくわかりますよ。
オブジェクト指向で作るのは,簡単にプログラミングをしたいから。
確かにそのとおりです。[/chat]

取っ掛かりとしてこの本はよかったと思います。
またこの本はオブジェクト指向を説明するときの説明に現実社会のもので例えるのが,かえって初心者の理解を妨げているという解説があります。これも確かにそうだと思います。

「車」がスーパークラスで「トラック」「スポーツカー」がサブクラスみたいな感じです。
理解している人からすればその例えで十分理解できますが,理解していない人からすると,それを聞いてどのようにプログラミングすればいいのかはさっぱりわかりません。

その後私はいろいろな本を読み,いくつものプロジェクトを立ち上げ,製品を世に出した経験で,実践の中で,オブジェクト指向を理解しました。そして今は新人や若手にマンツーマンでコードレビューをして,何度も何度も同じようなことをコンコンといいながら教育していますが,その中で感じるのは,オブジェクト指向をはじめ,よい実装を教育するには,まず,よい実装を見せてあげないといけないと思います。

先ほどの例えではなく,C#ならC#でどのように実装し,そうすることでどのような利点があるのか?を教えてあげないと,なかなか理解できるものではありません。

オブジェクト指向プログラミングをする上で必要な3つの知識

オブジェクト指向プログラミングをするのに必要な知識はいろいろありますが,確実に必要な知識は次の3つです。

  1. カプセル化
  2. インタフェース(ポリモーフィズム(多態性))
  3. 継承

オブジェクト指向本によく出てくる3つです。でもこの3つのうち特に重要なのは1と2です。比重をつけると次のような感じです。

機能 重要度(100%の振り分け)
カプセル化 43%
インタフェース 47%
継承 10%

若干インタフェースのほうが重要度は高めですが,カプセル化とほぼ同じ。
一方継承はそんなに重要ではありません。

オブジェクト指向が出たてのころは,みんな珍しくて使いたくて継承ばかりを使っていましたが,有名なGOFのデザインパターン本では「継承はあまり使うな!できるだけ,振る舞いをカプセル化しろ!」的なことをいっています。振る舞いをカプセル化というのは,デザインパターンのストラテジーパターンのようなやり方で,インタフェース越しに,実装は見えないように,意識しないように作って,さらにそれを取替え可能なものにしなさい!といっています。継承というパワフルな機能を多用することで,プログラムが複雑になってしまうことに気づいたGOFからのメッセージです。

そんな理由より,継承の重要度は10%と低めにしています。
継承は局所的に,できるだけ抽象クラスの継承以外の継承は避けましょう。本当に必要なときのみ継承機能を使うことで,非常に効果的に実装ができます。意味がわからない方も心配しないでください。この後の解説で,順番に解説していきます。わかる方のみ,覚えておいてください。

まとめ

オブジェクト指向の基本は次の3つ

  • カプセル化
  • インタフェース
  • 継承

継承はできるだけ使わず,インタフェースを多用しよう。