オブジェクト指向は、クラスは何だとか継承は何だとか
難しい話が多いので、結局こういうことがしたいんだ、
ということをこっそりタネ明かしします。
ただし、オブジェクト指向はプログラマ(設計者)の
考え方なので、何でもいいですからプログラム言語を
勉強しておいてからこの文章を読んでください。
関数(プロパティ、メソッドなど)と
構造体(テーブル、ユーザ定義型など)について理解し、
少しでもプログラミングできるのなら十分です。
まず、オブジェクト指向でない プログラム・ソース(C 言語)を list1.c に示します。 いきなり大きいプログラム・ソースを見せていますが、 驚かないでください。いや、驚いてもいいですけど 詳しい内容まで読まなくて結構です。
[ list1.c ]
← クリックしてください
実は list1.c は、main 関数しかありません。
プログラム言語で、
コンピュータにさせる作業(命令)を記述し、
その命令を実行する順番を(for 文などを使って)
記述すれば十分コンピュータは動いてくれるのですが、
さすがにこれだげダラダラと書かれると、
全体が見えなくなってきます。
余談ですけど、数行ごとにもコメントが書かれているので、
多少内容は理解できると思います。世の中のほとんどのプログラムは、
なぜかコメントが書いてないんですよね。ちょっとデキルやつが
書いたものほど、コメントが無かったり、暗黙の略語をバンバン
使ったりして、後で見る人たちが苦労します。
ちゃんとコメントを書きましょう。
さて、list1.c は、main 関数だけでしたが、せっかく関数
(他のプログラム言語ならサブルーチン、プロシージャ、メソッド)
を自分で作ることができるので、プログラムをいくつかの部分ごとに
分けることにしましょう。
すると、list2.c のようになると思います。
main 関数を見てください。
[ list2.c ]
← クリックしてください
main 関数がスッキリして、少しは全体がわかってきたと思います。
これは、メイン関数が目次の役割をしているためです。
しかし、逆にいくつかの関数を作ったために、データの流れが
つかみにくくなってしまっています。
たとえば、main 関数の最後の fclose( file ); の
file は、どこから来たのかすぐにはわかりません。
さて、どこから来たのでしょう?
答は、ソースファイルの始めの方にある
グローバル変数でした。
なんか、ひっかけ問題みたいですね。
こうなったのも、関数を作るときにプロセスだけに
注目したためです。
プログラムは、どのようなデータをどのようなプロセスで
処理するかをプログラム言語で文章にしたものです。
ですから、プロセスに相当する関数だけでなく、
データに相当する変数や構造体も適切に設計し、
プログラムの1文1文に登場させなければ、
わかりにくいプログラムになってしまいます。
そこでデータとプロセスをうまく融合できる
オブジェクト指向の登場となるわけです。
オブジェクトは、データ値(変数)とプロセス(関数)を
集めて「何か」を表現します。特にプロセスは
設定メソッド(set系関数)と参照メソッド(get系関数)によって
データ値(プロパティ)のように扱います。
(難しい用語の意味は追求しなくても構いません。
プログラムを見たり作ったりして感じ取ってください)
余談ですが、オブジェクトが中心になるのでプロセス主導から データ主導になったように思われますが、オブジェクト指向は ユースケースやアクティベーションなどの概念もあるので プロセス主導とデータ主導をうまく融合しています。
そのオブジェクト指向を採用したプログラムが list3.c です。
main 関数を見てください。
[ list3.c ]
← クリックしてください
main 関数だけの list1.c から比べると、
構造が明確になった分、
かなり複雑になったように見えますが、
それは欲しい情報がそこに記述されていると考えてください。
主なオブジェクトは、
ビットマップファイル・オブジェクト bmp と、
ビットマップソース・オブジェクト src です。
プログラムは、bmp から src へ変換しています。
その際、bmp からラインバッファ・オブジェクト buf
へ読み込み(read)(BmpFile_readLine 関数)、
buf をデータ変換し(change)(LineBuf_chg24to16 関数)、
buf から src に書きこみ(write)(BmpSrc_writeLine 関数)
しています。
このように、オブジェクト(クラス、タイプ)を使ってそのまま
文章にすることができるので、プログラムの
可読性も高いといえるでしょう。
ただし、前に述べたように、ぱっと見、複雑になってますので、
ここで言っている可読性は単なる読み易さではなく、
深い意味の理解のしやすさを意味しています。
その可読性が高ければ保守も楽になりますし、
再利用する際の検討も楽になり、
様々なメリットが得られるようになります。
可読性を維持したまま、再利用性を高めようとするために、
いろいろな方法が考えられました。
その成果が継承やインターフェイスや多態性といった
概念にまとめられ、プログラム言語の機能として組み込まれたり
プログラムのパターンとしてまとめられました。
C 言語なら オブジェクト指向記述法 COOL
というパターンにまとめられています。
オブジェクト指向は、スポーツに似ています。
スポーツの技術は口や文章で言うことはできますが、
それを聞いてすぐによくわかったとなるものではありません。
このスイングが正解というものは、ありません。
教えを聞いて実践し、何度も繰り返してみて、
より優れた設計をするだけです。
それだけに奥が深いといえますが、
プロでなければやれないことでもないのです。