読者です 読者をやめる 読者になる 読者になる

t-hom’s diary

主にVBAネタを扱っているブログです。

オブジェクト指向の本質はカプセル化 ~継承も多態性も脇役にすぎない

f:id:t-hom:20170328063503p:plain
ずいぶんと挑発的なタイトルをつけてしまったが、継承や多態性が重要でないなどというつもりはない。
ただオブジェクト指向の本質はどれかと言われると、やっぱりカプセル化だろうなと。

オブジェクト指向とは

オブジェクト指向とは、データや機能をまとめて「モノ」として扱いましょうという方針を言う。

オブジェクトってのはモノのこと。フランス語の「オブジェ」のほうがイメージしやすいかも。

指向ってのは「はじめからその方向を指して向かうこと」という意味。つまり「方針」にしたがって進むこと。

オブジェクト指向の本質はカプセル化

カプセル化とは、データや、そのデータを操作する機能を、まるでカプセルに入れるみたいに、ひとつにまとめて扱うための仕組みのこと。つまりオブジェクト指向そのもの。

これがないと始まらない。

ここでオブジェクト指向を学習したことのある方はカプセル化とは隠ぺいのことだと思い込んでいる方もいると思う。隠ぺいというのはオブジェクトの中にあるデータや機能を好き勝手に使えないように制限をかけるっていう意味。中身を隠して見えなくしちゃうから隠ぺい。都合の悪い事実を隠蔽(いんぺい)するとか言うときのアレと同じ隠ぺいだけど悪い意味はない。

日本語版のWikipediaにだってカプセル化と隠ぺいを混同しているように思える。

じゃあ英語版はというと、General definitionという見出しで以下のように書かれている。(Google翻訳結果)

カプセル化とは、そのデータを操作するメソッドとデータのバンドルを指します。

メソッドといのうは機能、バンドルってのは「束(たば)」のこと。つまりデータと機能を束ねると書いてある。これが本質だ。

続いてカプセル化はデータ隠ぺいに使用されると書かれているが、重要なのはカプセル化した結果として隠ぺいすること可能になるということであって、隠ぺいそのものをカプセル化と呼ぶわけではないこと。

隠ぺいもひじょーーーに有用な概念であるが、だからといってカプセル化の本質かというと違う。

データや機能をまとめて「モノ」として扱いましょうという方針に沿ってプログラミングするのに隠ぺいが必須かといえば、そんなことはない。内部のデータをバーンとPublicで公開しちゃってもモノはモノに違いない。

さて、さっきから色々書いてるけど、実際に言ってることはひとつ。
データや機能をまとめて「モノ」として扱いましょう。
つまりオブジェクト指向に必要な考え方は、これだけ。

ちなみにさっきからデータ「と」機能じゃなくて、データ「や」機能と言ってるのは、データだけまとめたり、機能だけまとめたりも出来るから。

オブジェクト指向の混乱を増長させる言葉

オブジェクト指向は複雑で分かりにくいという意見がある。
カプセル化・継承・ポリモーフィズム(多態性)・委譲・インターフェース・隠ぺい・デザインパターンUMLオブジェクト指向の書籍を開くとこのようなちょっと意味不明な言葉がわんさか出てくる。

これらがごちゃっとなって「難しい・わからない」というイメージを一層強めているんじゃないかと思う。

オブジェクト指向の本質を理解するだけなら、最初からこんな訳のわからない(と思われている)大量の言葉を覚える必要ない。いつか必要になったときに覚えれば。

ただ一つ、「カプセル化」だけ覚えておこう。いますぐ。さぁ。

VBAだからわかるオブジェクト指向の本質

オブジェクト指向の三大要素と呼ばれている機能がある。
カプセル化…データと機能をまとめること
・継承…別のオブジェクトから機能や特徴を受け継いで新しいオブジェクトを作ること
多態性…同じ命令を出してもオブジェクトによって異なる振る舞いをさせること
の3つだ。

継承や多態性は確かに便利である。もはやそれ無しではオブジェクト指向言語とは言えないほどに。

ところがVBAはというと、継承と多態性をまともにサポートしていない。つまり言語の機能としては、三大要素のうちオブジェクト指向の本質である「カプセル化」しか存在しないのである。

だからこそオブジェクト指向の本質がカプセル化であるという説明を(どこかで)読んだときすぐにピンと来た。たぶんオブジェクト指向Javaでだけやってたら私は今でも三大要素は等しく重要だと思いこんでいたことだろう。

カプセル化さえあれば、継承と多態性がなくてもオブジェクト指向のメリットを享受できるのだ。

継承も多態性も使わない、そして隠ぺいすらしない楽々オブジェクト指向

オブジェクト指向は複雑であると思われているけれど、それはオブジェクト指向のセオリーに完璧に従った場合の話。

私は最初からそんなややこしいことをする必要は無いと思っている。まずはデータと機能をモノとして扱えることの楽さを味わって「オブジェクト指向スゲー!」となるのが先決だ。いろんな機能はそのあとに学んでいけば良いと思う。

まずデータと機能をまとめるというのがどういうことなのか、具体的なやり方は以下の入門記事を参照してほしい。
thom.hateblo.jp

それから、上を読み終えた方はこの記事がおススメ。ゆるーくオブジェクトを使って楽をしている。
thom.hateblo.jp

執筆のきっかけになった記事

こちらの記事と、
shokuren.hateblo.jp

こらちの記事が今回の記事のきっかけ。
jsstudy.hatenablog.com

なずなさんの記事はオブジェクト指向の何がうれしいのかわからない(むしろ複雑になるんじゃね?)という疑問。
これについてはガチにオブジェクト指向やるとそうなるけど、おいしいとこだけ食べれば良いんじゃない?というテーマで何か書ければと思った。

jsstudyさんは差分プログラミングをOOPのメリットに挙げられているけれど、これはJavaや.Net、RubyPythonなど最近のマトモなオブジェクト指向言語のメリット。残念ながらVBAでは継承による差分プログラミングの恩恵は受けられない。だからこそ見えてくるオブジェクト指向の本質!というテーマで書きたくなったので。

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。