僕がプログラミングに興味を持ったのが小学生の頃だった。その頃はSEGA MARK IIIというテレビゲームにBasicのソフトを挿し、キーボードをつないでちょっとしたゲームを作る程度の事をやっていた。
それから時は経ち、大学のゼミで再びプログラミングに触れる機会が訪れた。ざっくりまとめると、C言語を使って実験に使う計測器を制御するという事を行った。
と同時に、Visual C++を使ってWindowsアプリケーションを作ることにも興味を持った・・・はいいものの、言語を全く理解できず。結局、ウィンドウからボタンを押すと、上記で作ったDLLを起動して実験を行うという程度のものしか作ることができなかった。
このVisual C++のベースになった?C++という言語でオブジェクト指向というものが扱えるらしいということを初めて知った。
当時(21歳とかその頃)は、C言語学習者の多くが躓くと言われているポインタすら理解できていなかった。その程度の頭で、オブジェクト指向を理解できるはずもなく。
その後、たまにプログラミングやろうとしてJavaだのPythonだの触るも、オブジェクト指向はやはり理解しようともせず。
そんな自分だったが、今回Javaを使ってスマホアプリを作ろうと思い立つにあたりオブジェクト指向をちゃんと勉強しようと思って、書籍を一冊購入した。
この書籍によって、20年以上理解できなかったオブジェクト指向というものがようやく理解できた(と思う)。なので、以下に自分の理解をもとに説明してみようと思う。
Contents
オブジェクト指向が難しいのはなぜか → 説明が悪いから
理解してみて、なぜ今まで理解できなかったのかが分かった。自分の頭が悪いから理解できないのだと思っていたが、そうではなかった(と思いたいw)。
ネットを検索すると、オブジェクト指向とは何なのかについて解説しているものがごまんと出てくる。しかし、どれを見てもなかなか理解し難い。
まず一番に、オブジェクト指向とは何か?という問いに対して、クラスだの継承だのの説明をしているサイトを見たならば、即刻閉じる事をおすすめする。そのような説明をしている人は、オブジェクト指向の本質を理解していない可能性が高い。
そもそも、オブジェクト指向を説明するのにクラスから入るのは順番が全く逆である。コミュニケーションとは何か?という問いに対して、have+過去分詞で現在完了を表すことができると説明するのがどれだけおかしな事か考えてもらえば、この話も少しは分かる事だろう。クラスやインスタンスについて勉強するのは、オブジェクト指向が何なのかを理解してから進めるべきである。
また同様に、オブジェクト指向とは何なのかを理解しないうちからクラスやインスタンス、またはカプセル化や継承、ポリモーフィズムの三大要素を学習しようとしているのであれば、即刻中止されたい。それらのものはオブジェクト指向の本質ではない。
オブジェクト指向の本質
さて本題に入ろう。「オブジェクト指向とは何か?」この問いに一言で答えるならば「プログラム設計の考え方の一つ」と言っていいだろう。
オブジェクト指向によるプログラム設計を実現するにあたって利用できるものがクラスであったり、カプセル化や継承、ポリモーフィズムである。
もう少し詳しく説明すると、オブジェクト指向とは人や物、あるいは実体の存在しない概念などをオブジェクト(物体)とみなして一纏めにするプログラミング手法の事である。実体のあるものについては想像しやすいが、例えばtwitterのツイートのような実体がないものをオブジェクトとみなしてもいいし、ブログの記事をオブジェクトとみなしてもよい。何をどのようにオブジェクトとして纏めるかが設計者やプログラマーの腕の見せどころとなる。
例えば銀行の業務を考えてみる。我々利用者は、口座の開設や入出金、他の口座への振込などを銀行へ依頼して行ってもらう。
上記で何をオブジェクトとみなすか例を挙げると、銀行、銀行員、利用者、口座、口座開設依頼書、入金依頼書、振込依頼書などとなる。またはもっと単純にして、銀行、口座の2つだけとしてもいい。
口座の持つ情報は、口座番号、名義、残高とする。
銀行の仕事は、利用者から入金された金額に従い口座の残高を増やす、または出金された金額に従い口座の残高を減らす、振込依頼の金額に従いAの口座の残高を減らしBの口座の残高を増やす、などとなる。
残高を増減する仕事を口座に持たせてもいい。その場合は、銀行の仕事は、口座の残高を直接増減するのではなく、対象の口座に対して残高を増減するように依頼する事となる。
このように、銀行と口座とをそれぞれ一纏めにする。メインのプログラムからは、銀行に対して仕事を依頼するだけである。銀行内または口座内で何がどう動いているのかをメインのプログラムが意識する必要はなくなる。
オブジェクト指向プログラミングの利点
手続き型プログラミングに慣れた人間にとってオブジェクト指向プログラミングはなかなかとっつきにくい。
上記の本によると、オブジェクト指向を用いるメリットは
「ラクして、楽しく、良いもの」を作れる
という事だ(自分はまだオブジェクト指向の経験が浅いのでいまいちピンとこないが)。
自分の考えるメリットは、より現実に則したプログラミングが可能になるという事だ。上記の例で言うならば、我々が振込をしようとする時、銀行業務がどのようになっているかや、残高増減の処理がどのようになっているかなどは一切意識する必要がない。
テレビのリモコンのボタンを押してチャンネルを変えようという時も、内部ではリモコンから発信された信号をテレビで受け取って何やかんやの処理をしてチャンネルを変更しているという事をやっているはずであるが、利用者はそのような処理を理解しないでもチャンネルを変更できる。
オブジェクト指向プログラミングでは、メインのプログラムに記述するのは、銀行に対して振込を依頼する、またはリモコンのボタンを押すなどの表面的な処理だけである。依頼したあとは、オブジェクト内部で細々とした処理を行ってくれる。
終わりに
まだ最近理解したばかりの初心者の戯言と思いながら話半分程度に聞いていただけたらありがたい。もっと詳しく知りたい方は、こんな説明よりも書籍にあたってもらった方がいいです。