オブジェクト指向の理解は、プログラミング学習において不可欠といえるでしょう。
JavaやPHP、Ruby、Pythonはもちろん、意外にもExcelマクロ(VBA)を使うときもオブジェクト指向が顔を出します。
しかし、いざ勉強しようと思ってググってみると、多数の情報がヒットするものの、よく分からないたとえ話ばかりで、さらにクラスやオブジェクトといった聞き慣れない用語に圧倒されるばかり…、という人も多いのではないでしょうか?
本記事では、オブジェクト指向のすべてを理解しようとせず、まずはプログラミング初心者が押さえるべき内容だけに絞って解説します。(したがって、若干厳密さに欠けるところがあります。その点はご容赦ください。)
オブジェクト指向とは?その答えは1つじゃない!
オブジェクト指向とは?と質問する人は、だいたいはプログラミングを初めたばかりの方でしょう。回答する現役プログラマやSE(システムエンジニア)は、初心者が求める答えを返せているでしょうか?
(1)「オブジェクト指向」は開発工程によって意味がちがう
開発工程(おおまかにいうと要件定義、設計、プログラミングといった開発ステップのこと)に応じて、オブジェクト指向が何を指すのかは変わります。
オブジェクト指向とは次に説明する2つの側面を持つのです。
(2)オブジェクト指向は大きく分けて「実装手段」と「設計概念」
まず、開発工程について、もう少し詳しく説明します。
・要件定義:何を作るか
・設計:どう作るか
・プログラミング:実際に作る
※さらにテストや本番移行などがありますが割愛します。
この工程の中において、要件定義や設計において必要となる「設計概念としてのオブジェクト指向」と、「プログラミングにおいて必要になるオブジェクト指向」は、似ているようで異なります。
(3)オブジェクト指向の理解が難しい理由
プログラミングでのオブジェクト指向ってなに?と聞いて、設計レベルのオブジェクト指向についての回答が来れば「?」となるのは当然です。
よくあるのは、クラスはたい焼きの型で、たい焼きがオブジェクトで、という回答…。それでは質問と回答がかみあっていないのです。
本記事にたどり着いたあなたがオブジェクト指向(の解説)を理解できないのは、上記のように疑問と回答のレベル感が合っていない解説が多いからかもしれません。
プログラミングする人にとっての「オブジェクト指向」
プログラミングに必要な最低限のオブジェクト指向、とりあえずはクラスとオブジェクト(インスタンスと言い換えても可)を解説します。まずはオブジェクトからです。
(1)オブジェクトとは"まとめたもの"
まずは、一言で表現してみます。
「オブジェクトとは、変数とメソッドをまとめたもの」
以上!はい終わり!これ以上追求するのは次からです。
(2)オブジェクトとは変数とメソッドの集合体
超おおまかにオブジェクトの概念を説明しましたが、もう少し具体的に説明します。
販売を管理する仕組みで、Aという商品があったとします。ここで、例えば商品Aが3個あったら合計いくら?という要求には以下の計算式で対応できます。
合計金額 = 商品Aの単価 × 数量(3個)
ところで、商品Aを管理するのに最低限必要な変数はいくつでしょうか?ここでは商品コード、商品名、単価の3つが必要であることにしましょう。
・商品コード
・商品名
・単価
商品ごとに個別に扱うのはなんだか面倒なので以下のように定義してみます。
商品コードをshohin_cdで内容はa
商品名はshohin_nmで商品名A
商品の単価shohin_tankaの内容は150
これら3つを1つにまとめてしましょう。ついでにそれぞれを取得してくれるメソッドも準備して…
(図1)
実は、これがオブジェクトです。なぜまとめるの?まとめるとどうして図のようになるの?そこは悩まず、とにかく「オブジェクトとはまとめたもの」という理解で大丈夫です。
(3)クラスとはひな形のこと
先ほどの例では、商品Aだけを解説しました。しかし普通の場合、商品は多数あります。すべての商品についてオブジェクトを準備するのは面倒なので、ひな形を作っておきましょう。
(図2)
このひな形のことをクラスというのです。
もしクラスがなければ、図の右側に示したように大量の変数を準備しておかなくてはなりません。
(4)オブジェクトの中のものを取り出すにはドット「.」
オブジェクトの中の変数やメソッドを取り出すにはドット演算子「.」というものを使います。よって商品の合計金額(total)を計算するには、数量を(suryo)使って、
total = shohin_a.getShohin_tanka * suryo
となります。ドット演算子は「の」と置き換えると分かりやすくなります。上記でいうと、shohin_a「の」getShohin_tankaを呼び出しています。
このドット演算子、イマドキの開発言語では必ず出てきます。ドットを見るたびに、これはオブジェクトの持ち物を指している ⇒「の」で置き換えるとどうなる?という見方をすると、分かりやすくなります。
(5)Excel VBAでオブジェクト指向を解説してみる ~まずは導入~
大体分かったところで、今度は目で見て理解しやすいExcel VBAでオブジェクト指向を解説しましょう。例として、セルA1を赤にするVBAのソースコードと実行結果をお見せします。
(図3)
細かい話はさておいて、右側の「Sub 実行()」と書かれた部分をご覧ください。
Range("A1").Interior.Color = RGB(255, 0, 0)
A1「の」Interior(=背景色)「の」ColorをRGB(255, 0, 0)にしなさい、というのが何となく読み取れますね。
(6)先ほどの商品Aをクラス化してみる
今度はVBAでクラスを説明しましょう。
前述の解説で使った商品Aの例を、そのままコード化してみます。Shohinというクラスを作って、そこから単価を取得しています。
(図4)
ソースは上下に分かれています。下はクラスのコードです。こちらはちょっと難しいので、まずはその上のSub 実行()の最後に注目してください。
Range("a2").Value = shohin_a.getShohinTanka * suryo
これを訳すと、セルA2のValueに、shohin_aオブジェクト「の」メソッドgetShohinTankaを使って取得して、数量をかけたものをセットしなさい、となります。結果の450がA2のセルに表示されていますね。
以上で説明は一段落です!ここまで読めば、なんとなくクラスやオブジェクトの便利さや使い方のイメージを理解できたのではないでしょうか。
(7)開発に必要なものだけをまとめたクラスもある
商品を例にあげましたが、開発用のクラスもあります。開発ツールやフレームワークでは、プログラミングに必要な変数やメソッドをクラスにまとめています。
用途は先ほどとはちがいますが、こちらもやはり「まとめる」という点では変わりません。
設計する人にとっての「オブジェクト指向」
これまで、オブジェクト指向をプログラミングの概念から見てきました。今度は、設計の概念から見てみます。
(1)汎化(はんか)
何らかのシステムを構築するとき、業務分析を行います。そこでは、オブジェクトの対象を洗い出します。先の例では、販売を管理するシステムとして商品がオブジェクトになりました。
商品に共通の項目って何だろう?と考えると、どんな商品でも商品コードと商品名と単価を持っています。共通項目を見出してクラスを作るわけです(汎化)。
クラスがあれば、それを実体化して商品Aや商品Bオブジェクトを作り、プログラムの中で使っていきます。先ほどのプログラミングにおけるオブジェクト指向とは、方向性がちがいますね。
(2)クラスはたい焼きの型、オブジェクトはたい焼き?
これって、よく聞くたとえ話です。たこ焼きの例もあります(笑)。
これまで読んできた内容を見返してみると、このたとえ話が理解できるのではないでしょうか。オブジェクトは商品Aや商品B(つまりたいやき)、クラスは商品クラス(たいやきの型)に相当します。
ネット上では他に、生徒クラスに田中くん佐藤くん、果物クラスにりんごやみかん、などなどを見たことがあります。いずれにしても、共通するものと実体の関係です。
(3)今後の学習
本記事では触れなかったことにぜひチャレンジしてください。話が難しくならないように、あえて省略した用語や概念があります。
インスタンス化、コンストラクタ、カプセル化、アクセサ、継承、ポリモーフィズムはぜひ押さえて欲しいところです。できるならば、現役プログラマの方に聞いてみてください。きっと教えてくれますよ!
まとめ
本記事では、オブジェクト指向について解説しました。
最初は難しいことを考えず、目の前の実装に必要なことから確実に理解するところから始めましょう!
- カテゴリ: