オブジェクト指向を「逆」から解説してみる

「オブジェクト指向」というと、勉強しようとするとあれこれ言葉が出てきて、何が何だか分からないという方もいるでしょう。オブジェクト指向を理解するのは、 確かに難しく、ロボットに例えたり車に例えたりなど、各書籍などでもいろいろな方向で説明されているものの、なかなか「これぞ」という分かりやすい説明は見つけられません。

そこでここでは「逆から解説」をすることで、オブジェクト指向を理解してみましょう。なお、ここでは JavaScriptを前提に紹介します。

逆から解説とはどういう事か

通常、オブジェクト指向を説明する場合は「クラス」の説明から始めて、インスタンス→メソッド→プロパティと説明していきますが、これが分かりにくさを助長している気がするので、逆に「プロパティ」から説明していきたいと思います。

最初に覚えておきたいのは「プロパティ」

プロパティ(Property)というのは「所有物」といった意味がありますが、覚えていること、覚えておきたいことを表すのがプロパティです。例えば、「今画面には何が表示されているか」とか「現在の画面のサイズ」などをプロパティが覚えています。

また、このプロパティを変えることで覚えている内容を変えることができます。

仕事の方法をまとめたのが「メソッド」

メソッド(method)は「方法」や「方式」という意味ですが、あるプログラムをまとめてメソッド名をつけることで、一連の仕事の方法をまとめて依頼できるというものです。

例えば、ファイルに内容を保存して欲しいときに「save」というメソッドを呼び出したり、現在の年を知りたいときは「getFullYear」メソッドを呼び出したりします。

プロパティを触らせないのもメソッドの役割

メソッドにはもう1つ役割があります。それはプロパティを直接触るとおかしな状態にされてしまう恐れがある場合。例えば、「年」というプロパティを直接さらわせてしまうと、0未満の年にされてしまったり、数字ではないものにしようとしたりするかも知れません。

そこで「setYear」や「getFullYear」などのメソッドを準備して、プロパティを触らせないようにします。

プロパティとメソッドだけでプログラムが作れたら平和

さて、このプロパティとメソッドだけであれば、まだなんとか理解できるのではないでしょうか? 実際、これだけでプログラムを作ることもできます。少し言葉が違いますが、プロパティは「変数」、メソッドは「関数(ファンクション)」としてプログラムを作る方法を「構造化プログラミング」などと呼び、一昔前はこのシンプルな方法でした。

しかし、この方法にはデメリットがあります。関数が並列であるため、例えば日付に関するメソッドと、ファイルに関するメソッド、その他のメソッドなどがごっちゃごちゃになってしまうのです。

それを防ぐために、関数名に「dateなになに」とか「fileなになに」などと、共通した名前をつけたりしますが、その命名規則にも統一性がなかったりして、関数名も長くなってしまいます。

また、変数と関数に関連性がなく、「今日の日付の年」と「去年の日付の曜日」を知りたいなどの場合に、どの変数を使ってどの関数を呼び出すのかなどが良く分からなくなってしまいました。そこででてきたのが「オブジェクト」という考え方です。

プロパティとメソッドをまとめる役割がオブジェクト

プログラムには欠かせない、プロパティとメソッドをグループ毎に分ける役割をするのが、オブジェクトです。例えば、「Date」というオブジェクトは「日付」を司るオブジェクトで、この中には「年」や「月」などの日付に関するプロパティと、「getFullYear」や「getMinutes」など、日付に関するメソッドをまとまっています。

また、「Window」オブジェクトにはウィンドウの幅や高さといったプロパティ、警告ウィンドウを出す「alert」というメソッドなどがまとまっています。

こうして、メソッドやプロパティを機能ごとにまとめたものがオブジェクトなのです。

オブジェクトに具体的な情報を与えるのが「インスタンス」

インスタンス(Instance)は「実体」といった意味がありますが、オブジェクトを実際に触れるような存在にしたものです。例えば、「Date」というオブジェクトは「日付を扱います」という説明はあるものの、そのままでは「いつの日付」という具体的な情報がないので、扱えません。

これを「今現在の日付」など、具体的な内容にしたものがインスタンスです。ただし、インスタンスは必須ではありません。Mathオブジェクトなど、具体的な情報が必要ないオブジェクトについては、インスタンスにする必要はありません。

「日付」というオブジェクトに対して「今日の日付」がインスタンスと覚えましょう。

オブジェクトの内容を決めるのがクラス

オブジェクトにどのようなメソッドがあり、どんなプロパティがあるかを決めるのが「クラス」です。クラスを作る(定義する)ことで、新しいオブジェクトが生まれ、そのインスタンスを作り出せるようになります。

クラスはよく「設計図」などと説明されますが、どちらかというと先の通り、メソッドやプロパティをひとまとめにした、学校の「クラス」のようなものです。日付に関する生徒を集めたクラスと、数学の専門クラスといった具合。

触らせないのがカプセル化

先の通り、プロパティは直接触られてしまうとおかしな値になってしまうことがあります。また、メソッドも場合によっては呼び出されると困ることがあります。そんな時に、クラスの定義で触らせないようにできるのが「カプセル化」です。カプセルに閉じこもって、外から触られないようにします。

クラスのコピーが継承

作ったクラスは丸ごとコピーすることができます。コピーしたクラスは、自分用に少し改造をくわえたりもできます。これが「クラスの継承」です。継承元のクラスの内容をそのまま引き継ぎ(コピー)した状態で、オリジナルの変更を加えることができます。

共通の合い言葉が「ポリモーフィズム」

ポリモーフィズム(Polymorphism)は遺伝学などで「多型」などと訳される言葉で、プログラミングの世界では「多態性」などと呼ばれます。

言葉は難しいですが、要するに「合い言葉」のようなもので全クラスに同じ合い言葉を言ったときに、それぞれのクラスで適切な動きをするというものです。

先の通り、オブジェクト指向以前では関数がごちゃごちゃになっていたため、いちいち「dateなになに」とか「fileなになに」などと、関数名を工夫しなければなりませんでした。

しかし、オブジェクト指向では例えば「add」というメソッドがあったとして、日付のクラスにも「add」メソッドがあり、数学のクラスにも「add」があっても構いません。

この時、例えば日付クラスだと「日付の計算」で数学クラスだと「数値の足し算」などと、動きがクラスによって変化するというわけです。JavaScriptには代表的なもので、「toString」メソッドなどがあります。これを呼び出すと、クラスにかかわらず「適切な文字列に変更する」という役割があります。

オブジェクト指向は便利だから生まれた。便利さを感じて理解しよう

いかがだったでしょうか。オブジェクト指向を少しは理解できる助けになれば幸いです。オブジェクト指向を理解するのは難しいですが、便利だからこそ生まれた考え方です。便利さを理解したり、「これがなかったら、どれだけ不便か」を考えると、理解しやすいかも知れません。