どうもこういう話題が流行っているようなので考えていたことを投稿。
オブジェクト指向が難しいという話を聞きますが、私は最初から非常にしっくりきて自然に使い倒しています。
そういう人間の意見を書きます。
なおオブジェクト指向との付き合いは13年ほど。
#プログラム部品の再利用
プログラムを組むことの難しさは、大きなプログラムを、人間に理解できるよう書くことにあります。
コピペ多用を避けるなら、コードの再利用を行う必要があります。
そのためにはプログラムを部品に分けなければなりません。
大きなプログラムを作るなら部品の数は最低でも数百、下手すると数千数万となります。
これらをすべて、使いたい時にすぐ使えるように整理しておかなければなりません。
数百数千もあるものを分かりやすく整理するには非常に高度な技術が必要となります。
そして、オブジェクト指向はそのためにあるものです。
この時、整理は人間のためにするということを忘れてはなりません。
部品がどれだけごちゃごちゃにとっ散らかっていても、コンピューターはどこに何があるのか忘れたりしません。
整理しないと困るのはあくまで人間です。
つまり、オブジェクト指向とはコンピュータのための技術ではなく、プログラムを組む人間のための技術です。
#設計とプログラムで共通のモデルを利用
オブジェクト指向では、設計と実装で共通のモデルを使います。
ここで、共通なんだったら実装を自動生成してコストが削減できるじゃないか、とか言い出したバカがいたせいで混乱を呼んでいるようですが、全くそういう話ではないです。
アプリケーションを作る時は、まず何を作るかを設計し、その後プログラムを実装します。
設計は日本語や図などを使って、作る機能をすべて書きます。
そして実装は、設計した全てをプログラムに書き直します。
設計と実装は同じ人がやることも違う人がやることもあります。
設計も実装も、部品の数は膨大になり、整理するのはそれぞれ大変です。
整理する方法は、設計と実装でそれぞれ別のやり方がありますから、普通に進めると別々のやり方で整理することになります。
そうなると、設計時に整理したものを、実装時に読み替えて別のやり方で整理しなおすことになります。
一度整理したものを別のやり方で整理しなおすには、例えれば一度棚にしまったものを全部出してもう一度しまいなおす必要があるわけですから、完全な二度手間で大変な労力がかかります。
しかも、修正のたびに設計と実装を見直す必要がありますから、そのたびに両方の整理の対応付けをする必要があり、二度手間どころではなく、ものすごく大変です。
無理やり片方の整理のやり方にもう片方が合わせることもできますが、それぞれ作業の都合が違うのですから、合わせたほうは結局全く整理されていないのと同じで、大変さは減りません。
そこを何とかするためにオブジェクト指向が使えます。
オブジェクト指向では設計も整理でき、実装も整理できる方法で整理を行います。
設計、実装それぞれ最良の整理方法は選べないので、片方だけ見れば最良ではありませんが、設計時も実装時もあまり読み替える必要もなく、整理された状態で作業することができます。
とはいえ設計と実装ではやることが違いますから、完全に両方同じにはなりませんが、実際の作業にあまり支障がない程度には近いものになります。だいたい同じ図を見て、もしくは同じ人がやる場合は同じ図を想像して、作業を進めることができるので、それで十分です。
この、同じ図を使って作業することを、共通のモデルを使う、と言います。
#カプセル化・継承・ポリモーフィズム
カプセル化、継承、ポリモーフィズムというのは、設計・実装で使える整理の方法です。
設計の側からみると、猫はニャンと鳴いて犬はワンと鳴くけれども両方とも鳴くことは同じ、というように現実世界をうまく表現できます。この辺の整理に使われる方法にカプセル化、継承、ポリモーフィズムと呼ばれるものがあります。
実装の側からしてもカプセル化・継承・ポリモーフィズムという、設計時と同じ名前で呼ばれるプログラム言語の便利な機能を使い、プログラムを整理できます。
そして両方とも整理した図は大体同じになるので、とても便利です。
設計の整理の仕方、実装に使う機能別々に見れば多少不備な点もありますが、両方で同じものが使えるというメリットに比べれば大したことはありません。
最大のメリットは設計・実装両方で共通に使えることですから、この三つを実装時に利用する方法だけ覚えてもメリットはわかりませんし、メリットについて議論することもできないでしょう。
#この世の全てはオブジェクト
オブジェクト指向では、この世の全てのものをオブジェクトとして扱います。
というと、何やら哲学的なところにはまり込んでしまう人がいるようですが、あくまでプログラムの話であることを忘れてはいけません。
ソフトウェアはいろんなものを扱います。世の中のどんな業種でもソフトウェアを導入することはありえますから、プログラムは世の中すべてのものを扱う必要がある、と言っていいでしょう。
設計は大体日本語などの言語で記述されるので、ものは名詞で表されます。つまり、オブジェクト指向の言うすべてのものとは、すべての名詞と同じ意味です。
そして、設計での名詞は、プログラム上ではオブジェクトと呼ばれる言語機能に対応します。だからオブジェクト指向言語では、名詞で表されるすべてのものをオブジェクトとして扱います。
この世の全てのものがオブジェクト、とはそういう意味です。
#オブジェクト指向の生産性
ここまでまとめてみて気付いたのですが、オブジェクト指向を導入する理由として生産性を上げることを目的とすると、うまくいかないことが多いようです。
オブジェクト指向を理解し、使いこなすことによって、生産性が上がる、ということは当然あると思います。
しかし、生産性が上がるからという動機でオブジェクト指向の学習を始めると、変な理解に進むことになりがちで、オブジェクト指向を理解し使いこなすことができず、結局生産性も上がらない、ということがよく起きているようです。
#オブジェクト指向を一言で説明すると
以上のような考え方を踏まえてオブジェクト指向を一言で説明すると、
「オブジェクト指向とは変数に顧客や店舗が代入できること」です。
より厳密にいうと
「プログラム上で変数に代入したり処理の対象とできるものとして、整数や実数、文字列など限られたものだけではなく、顧客や店舗など世の中の全てのもが利用できる。」
ですが、ここまで説明すると一言じゃないですね。