プログラムを書く時の基本的な考え方(10):ようやく、オブジェクト指向プログラミングとは・・・
前に書いたようにオブジェクト指向プログラミングについて説明する時は、最初にオブジェクトというのがあって、オブジェクトというのはこれこれこういうものだけれど、それがあるとどういうことができます・・・というように説明するのが普通です。それで、よく分からない。世の中のものはみんなオブジェクト(物体、物象)だから・・・世の中を模擬するシステムはオブジェクトからなるのが自然なのです、などと言うものなら、もっと分からなくなる(苦笑)・・・ですよねぇ。
それでね、「オブジェクト指向」をコンピュータ科学でどう考えるか・・・みたいな話は学者さんたちにお任せしましょう。プログラマやシステムエンジニアはそういうことは考えなくて良い。
プログラムをオブジェクトというもので組み上げて作る方法がオブジェクト指向プログラミングだと思えばいい。構造化プログラミングで、プログラムは関数を組み上げて作るのだと考えたのと同じです。
プログラムはオブジェクトの積み上げです。そして、オブジェクトもオブジェクトの積み上げでできている。では、オブジェクト指向プログラミングで、オブジェクトってどういうものか。
プログラムを書く時に、クラス定義というのをします。クラスというのはオブジェクトの設計図みたいなものです。中にデータと処理(メソッドと言います)がまとまって入っているものです。
こんな感じです。クラス(オブジェクトの定義)の中にデータ(変数、配列など)もあるし、処理(メソッド)もある。それもいくつかあったりする。そういうデータと処理の集まりをクラスとして、それがオブジェクトの定義(設計図みたいなもの)になります。
いつオブジェクトになるか・・・これがメモリ上に実体化した時です。プログラマがメモリ上に実体として作った時、それをインスタンス(実体)と言ったりします。
整理しておきましょう。
1. プログラムはオブジェクトの積み上げ(組み上げ)で作成される
2. プログラムを書くことの多くは、クラス定義を書くこと(考え方)
3. どのようなクラスを作ればいいのかは、プログラムがどのようなオブジェクトから構成されるかを想像、想定する
4. オブジェクトの中でも、またオブジェクトが使われるので、そこにもクラス定義を書く
プログラムが「どのようなオブジェクトから構成されるのか」を考えるところがポイントですね。これを上手に行うと良いプログラムが書けるということになります。この時に、オブジェクト指向プログラミングの仕組み・特徴を知っていると良い。
この知っていると良い「仕組み・特徴」とは、コンピュータサイエンス上の学問的な理解ということではありません。プログラミングするために必要十分な理解です。それに沿って説明します。
一つ目は「カプセル化」です。詳細は他の参考書を読んでください。カプセル化を理解していて、オブジェクトが使うデータ(変数など)やメソッド(処理)をオブジェクトの中だけに閉じ込めておく(ローカライズ、ブラックボックス化)と、このオブジェクトは別のところでも使い易い部品になります。ちなみにメンテナンスもしやすい、エラーがどこかにあっても、見つけやすく、かつ修正しやすくなります。だから「カプセル化」を考えてクラスを定義しましょう。
二つ目は「継承(インヘリタンス)」です。継承も難しく考えなくて良いです。既存のクラスAがあって、それが継承可能で、別のクラスBを書く時、クラスAを使えば一から全部プログラムを書かなくても済むとする。そういう場合、クラスBは「クラスAを継承する」とすればいい。そうすれば、Aというクラスの持っているデータ(データ構造)やメソッド(機能、処理)をそのままクラスBで使えます。なんてラッキー。
ところが、こういうこともあります。「継承」するとして、継承する上位クラス(スーパークラスといいます)のメソッドを使いたいのだけれど、自分の欲しい機能と違う。”ちょっと違う”のだよね・・・名称的には同じなんだけれど。という場合、書き直せます(オーバーライドといいます)。書き直すとそっちが優先です。これもラッキー、助かります。
・・・ということを理解したら、三つ目の特徴「多態性(ポリモーフィズム)」が見えてきます。
継承した上位のクラスに、あるメソッドがあって、それを使う時、実際はオーバーライドして下位のクラスで書き直す。複数の下位クラスで、それぞれに見合った内容でオーバーライドしたとします。この複数のクラスをまとめて使う時に一つの名前のメソッドで呼び出して異なる結果が出せる。上位クラスを継承していてオーバーライドしたから。中身は違う(違う処理をする)のに同じ名前でメソッドを呼ぶって・・・なんか面白い。使えそうなところあるのじゃないか・・・と思います。それが多態性です。
ということで、オブジェクト指向プログラミングする時のメリットは次の通り。
①まずはカプセル化して、継承をうまく使う。そうすると、自分で書かなくてはいけないプログラムを結構省略できる。それで生産性が向上する。継承の上位クラスが色々なところで使える共通部品の素(もと)みたいだ。あるものはうまく使わないとね。
②作ったクラスが、他の場所でも使い易い(使用可能くらいでもいい)ものだった場合、そのクラスを継承可能な状態でライブラリ(クラスライブラリ)にする。そうしておけばまた使える。生産性アップです。素晴らしい。
カプセル化と継承とオーバーライドの使い方が分かれば、オブジェクト指向プログラミングしている・・・と言えますね。
一応、ちょっと付け足しておくと、オーバーロードっていうのもあって、これはオーバーライドと違って、一つのクラスの中で引数や型が異なる同一名のクラスを書ける・・・っていうことです。上手く使うと生産性がアップするかもしれません。
オブジェクト指向プログラミングは難しいですか?
これらはその背景を知っていたら、大体の意味は分かりますよね。あとは実際にプログラムを書く時に覚えなくてはいけない仕様、文法、慣習的な作り方のスタイルとかは・・・個別に学ばないといけないです。勉強して下さい。他にはプログラミングツールの使い方とか、それらしいプログラムのスタイルとか、こだわるところは結構ありそうですからね。
でも、オブジェクト指向プログラミングとは何か・・・と言ったら、この程度の理解でまずは良いでしょう。もちろん、何事にも奥深い秘儀、秘伝はありますから、そういうところは超一流の技術者になったら是非とも追究してみてください。
【参考になる記事・書籍】
それでは最後に、構造化プログラミングやオブジェクト指向プログラミングで、これは勉強になる、なかなか良いぞというネット上の記事・ネタを紹介します。
まず、構造化プログラミングについてについてですが、正直、良いのがありません。前に書いたASCII.jpデジタル用語辞典「構造化プログラミング」の解説が明快で良いです(苦笑)。それだけかよ、と言われそうですね。
構造化プログラミング自体が今どき流行らないから、あえて説明する記事とかないのでしょうね。大体は、エドガー・ダイクストラがああだこうだ・・・から始まる理論中心の話で、そういうのはプログラマ(技術者)にすぐには役に立たんのです。でも、オブジェクト指向プログラミングする前に構造化プログラミングをしておいた(理解しておいた)方がいいのになぁと愚痴っておきます。
ネット記事では良いのがないので仕方ありませんから、書籍を上げておきますと、
1. 「プログラム書法(第2版)」Brian W.Kernighan (著), P.J.Plauger(著), 木村 泉 (翻訳) 共立出版
2. 「ソフトウェア作法」Brian W.Kernighan (著), P.J.Plauger(著), 木村 泉 (翻訳) 共立出版
でしょうかね。どちらも古い本です。もう絶版かな・・・(苦笑)
オブジェクト指向プログラミングについては、ネット上のコンテンツを2つ紹介しておきます。(※敬称略)
①日経Xテック(クロステック)|「オブジェクト指向プログラミングを基本から理解する(2006年)」
1. Part1 オブジェクト指向を正しく理解する (平澤 章)
2. Part2 オブジェクト指向プログラミング,始めの一歩 (矢沢久雄)
3. Part3 オブジェクト指向プログラミングの三本柱 (矢沢久雄)
②@IT|連載 オブジェクト指向プログラミング超入門 (遠藤孝信、2004年)
これら二つの記事(連載)は素晴らしい。オブジェクト指向とはどういうものかということがよく分かります。ただ、初心者だとちょっと難しいかもしれません。すでにプログラムを書いたことがあって、これからオブジェクト指向プログラミングだという人には、非常にためになります。
特に②はWindowsでのプログラミングでC#とVB.NETを考えて、Windowsプログラミングの仕組みとオブジェクト指向を関連付けて解説しているので、結構、深い。
こういう素晴らしい解説に出会うと嬉しくて仕方ない。昔はオブジェクト指向の説明って、訳分からなかったのですよ。是非、ご覧になってください。
(2022-01-10→2022-05-12)
コメント