71
77

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

意味が分かる「オブジェクト指向」入門 ――なぜOOなのか?

Last updated at Posted at 2016-09-01

#既存の説明では、ぜんぜん意味が分からない!

現代的なプログラミングにおいて、「オブジェクト指向」(英語名「object-oriented(OO)」)が重要な技術であるのは、言うまでもありません。

もしかすると「そんなの今さら常識」と思うかもしれませんが、しかし本当の意味で理解して使われている場合は、じつは少ないのではないかと思います。

たんにJavaやRubyなどのOO言語で書くだけで、自動的にOOが実現するわけではありません。実際はオブジェクト指向になっていない場合がかなり多いです。

しかしその一方で、「オブジェクト指向」について、本当の初心者に分かりやすい解説というのが、ほとんど見あたりません。

「犬がワンで、猫がニャー」みたいな、ワンニャー式のよくある解説を読んでも、

「オブジェクト指向とは何なのか」、「何が良いのか」、「何がしたいのか」、「なぜ採用するのか」、「複雑になってしまうのではないか」、「それまで(構造化)と何が違うのか」、「何をすればOOなのか」、「何がOOにとって一番大事なのか」、「どこからどこまでがOOなのか」、

……などなど、疑問が際限なく湧いてくると思います。

じつは昔は私自身も、オブジェクト指向がいったい何なのか、さっぱり分かりませんでした。今では逆にオブジェクト指向なしに組みたくないほど、身近な存在になりましたが。当時は分かりにくい説明にたいへん不満でした。

そこで本記事(連載を予定)では、分かりやすさを最重視して、割り切って説明します。分かりやすく、分かりやすく、とにかくそれを最優先に追求しています。「くわしく」より「分かりやすく」に振っていきます。ですので、「分かりやすい嘘」もためらわずに採用します。

もちろん、いろいろな立場があり、割り切れない難しい部分もあるのは百も承知です。が、「そんな単純じゃない」と言って、「あれもこれも」と概念を出すと、分かりにくくなってしまいます。その点をご了承の上、お読みください。

前置きが長くなりましたが、それでは説明していきましょう。

#オブジェクト指向とは何なのか? 何がしたいのか?

カプセル.jpg

オブジェクト指向(プログラミング)というのは、「オブジェクト」を単位にしてプログラミングする技法です。

オブジェクトを単位にすると何が違うのかというと、「カプセル化」されたプログラムにすることができます。

そもそも「オブジェクト」とは何かは、次回(以降)説明しますが、ここでは「オブジェクト=カプセル」とかんたんに理解しておきます。

かつて、OOが普及する前の「構造化技法」の時代でも、「モジュール化」はされていましたが、カプセル化としてはまだ不完全でした。

では「カプセル化」すると何が良いのか。それを一言でいうと、「変更容易性」です。プログラムの開発が完成した後で変更しやすくなります。派生的に保守性、拡張性、再利用性(の向上)なども挙げられます。

変更が容易だと何が良いかというと、保守コストが減ります。一般的に商業プログラムにおいては、開発費用より保守費用の方が大きくなりがちなので、企業としては経費削減の意味があります。

また、たとえ個人開発者でひとりで組んでいても、ある程度まで規模が大きくなると、保守する手間というのは無視できないので、その場合に採用する意味はあると思います。逆に、変更の予定がない小規模の書き捨てプログラムでは、OOの効果を発揮できません。

この点、「じゃんけんプログラム」みたいな単純なサンプルでは、OOの良さが伝わりません。構造化で書いても大差ないし、むしろそっちの方が簡明です。まあ書籍などは紙幅の関係で仕様がないですが。

「定期的にカードが追加されていき、カードによってゲームルールも微妙に変化していくTCG風カードゲーム」のような実際の複雑なプログラムで、OOの本領を発揮します。

こうしたメリットの一方で、OOにデメリットはないでしょうか? たとえば、OOだと複雑になってしまわないか?

複雑にはなるでしょう。しかし、ミクロレベルで多少複雑になっても、マクロレベルでは単純化できるはずです。また、大規模な開発だと、開発しながら保守するような面がありますので、開発もしやすくなる側面があります。

100行レベルで見ると複雑になっても、100「」行レベルで見ると、かえって単純になるのです。まあ100万行は極端に思うかもしれませんが、5千行から1万行くらいで、コードの理解しやすさに明確な差が出てきます。

OOは「都市計画」のようなもので、1万行、100万行の上空から鳥瞰的に見ると、整理されているのです。「木を見て森を見ず」になると、OOの良さが見えてきません。

コードが多少複雑になっても、変更容易なメリットの方が大きい、と判断したときに採用すれば良いのです。

ただ、組み込みなど、非常に小さなオーバーヘッドが問題になる環境では、採用しない場合もあります。

まとめると、何がしたいかというと、プログラムの変更を容易にしたいのです。
だから、それをカプセル化で実現するため、オブジェクト指向を使うのです。

#「うさぎと亀」の物語でイメージをつかむ
ウサギとカメ.jpg

イメージしやすいように、シナリオを描いてみます。

プログラムを組んで完成したところを想像してください。
次に、完成後に変更するところを想像してください。

プログラミングの経験があれば、ジェンガ(積木)が崩れるように、
カオスになっていくところが想像できると思います。

仕様変更はだれしも嫌なものです。なければない方が良いです。
しかし、ビジネス上の理由などで、せざるをえない場合があります。

たとえば、消費税や年号、法律の改正といった不可避の場合。
あるいは、利用しているライブラリやサービスのAPI変更の場合とか。

商業的なプログラムは、競争力などの関係で規模が大きくなりがちですが、
規模が大きいと変更しにくくなるし、しかも変更が不可避の場合があります。

変化に対応できなくて生き残れない、というケースもあるでしょう。
しかし、オブジェクト指向で組んであると、相対的に変更に強いのです。

これは「うさぎと亀」のたとえ話のようなもので、
開発が多少難しくなっても、保守のターンで取り戻せるのです。

カプセル化のカプセルは亀の甲羅のようなもので、
書く速度は遅くなりますが、外敵(バグ)から本体(コード)を守ります。

OOは「ドジでのろまな亀」ですが、長い目で見れば安定しているのです。

#FAQ形式で簡易まとめ
さて、ここまでの整理として、冒頭の疑問をFAQ形式で、かんたんにまとめ直してみましょう。

  • Q. 「オブジェクト指向とは何なのか」
  • A. ――オブジェクトを単位にカプセル化する技法です
  • Q. 「何が良いのか」
  • A. ――変更が容易になります
  • Q. 「何がしたいのか」
  • A. ――(完成後も)変更を容易にしたいのです
  • Q. 「なぜ採用するのか」
  • A. ――変更を容易にすると、保守コストを減らせます
  • Q. 「複雑になってしまうのではないか」
  • A. ――なりますが、メリットの方が大きい場合に採用します
  • Q. 「それまで(構造化)と何が違うのか」
  • A. ――モジュール化とカプセル化の違いです
  • Q. 「何をすればOOなのか」
  • A. ――カプセル化すればOOです
  • Q. 「何がOOにとって一番大事なのか」
  • A. ――(ここでの立場では)カプセル化です
  • Q. 「どこからどこまでがOOなのか」
  • A. ――オブジェクトやカプセル化が関係する範囲です

#新たな疑問と、この先の予定について
ここまで読んで、こういう疑問が湧いてくるかもしれません。

オブジェクト指向の本質がカプセル化だとして、
なぜカプセル化すると変更が容易になるのか?

また、具体的にどのように書けば、
カプセル化されたプログラムになるのか?

それは次回(以降)に説明します。

今回は「なぜ」「Why」だけ説明しました。
一度に詰め込もうとすると分かりにくくなるので、
「どうやって」「How」は後回しにします。

本記事(連載)では、分かりやすさを最優先しているため、
まるで亀の歩みのように、説明のペースが異様に遅いです。

しかし、分かったつもりのうさぎを、
最後には追い抜ける地点まで行けるはずです。乞うご期待。

#参照
今回書いたことは、たんなる私ひとりの思いつきではありません。

多数派の考え方ではないかもしれませんが、『オブジェクト指向のこころ』などオブジェクト指向関連の書籍で、すでに先人が主張しています。

またたとえば、開発費より保守費が高いこと、よって変更を容易に組むべきということについては、「XP(エクストリーム・プログラミング)」の提唱で有名なケント・ベック氏も、『実装パターン』で指摘しています。

ただし『実装パターン』については、オブジェクト指向だけに限定せず、プログラミング全体の原理原則を追求しているのが、著者の意図だろうとは思います。

そしてまた、それらの著者の思考を忠実に伝えることまでは意図しておらず、最終的には私の個人的な考えであることもお断りしておきます。

今言及した参考文献をあらためて挙げておきます。

なお、記事中の画像は素材サイト「足成」のものを利用しました。

71
77
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
71
77

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?