************************************************************** _/_/_/_/_/_/_/
ソフトウェア業界 新航海術
_/_/_/_/_/_/_/_/_/ ************************************************************** 第197号
2008/1/1 『インスタンスという仕組みが画期的である理由』 ▼ まえがき ▼
[オブジェクト指向再入門] (1)広く深く浸透するOOP ▼ [オブジェクト指向再入門] (2)「まとめて、隠しす」はCでもできる ▼
[オブジェクト指向再入門] (3)「たくさん作る」はOOP特有の機能 ▼ [オブジェクト指向再入門] (4)Cで同様の処理を書く場合 ▼
[オブジェクト指向再入門] (5)インスタンスが画期的な理由 ▼ [オブジェクト指向再入門] (6)現実の事象を表現できる ▼
次回以降の予告
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
まえがき *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
蒲生嘉達(がもうよしさと)です。
明けましておめでとうございます。
今年も宜しくお願いいたします。
普通はここで年頭らしい話をするのでしょうが、それは次回以降に 回して、今日はオブジェクト指向プログラミングについて語ります。
「オブジェクト指向プログラミング」は本文では「OOP」と略します。 英語の'Object Oriented
Programming'の略です。
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*= [オブジェクト指向再入門] (1)広く深く浸透するOOP *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
私が実際に本格的にコーディングしたことのあるプログラミング言語 はCのみです。JavaなどのOOP言語のコーディング経験はありません。
OOPについて、本メルマガでは過去に第5号で解説したことがあります。
4年前(2004年1月5日発行)に書かれたこの記事は、今読み直してみても 内容的に間違えてはいないと思いますが、抽象的な説明に終わっています。 私自身も概念的にしか理解していませんでしたから。
4年前に比べて、オブジェクト指向は、現在、様々な分野(OOP、 フレームワーク、デザインパターン、UML、モデリング、設計、 開発プロセス)において広く深く浸透しています。
そこで、もう少しオブジェクト指向についての理解を深めようと思い、 今「オブジェクト指向でなぜつくるのか」(平澤章著、日経BP社発行) を読んでいます。
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*= [オブジェクト指向再入門] (2)「まとめて、隠しす」はCでもできる *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
オブジェクト指向のもっとも基本的な仕組みは「クラス(class)」と 「インスタンス(instance)」です。
「オブジェクト指向でなぜつくるのか」にはクラスとインスタンス について次のような説明があります。
--------------------------------------------- クラスは「まとめて、隠して、たくさん作る」仕組み
1)サブルーチンと変数を「まとめる」 2)クラスの内部だけで使う変数やサブルーチンを隠す
3)1つのクラスからインスタンスを「たくさん作る」
---------------------------------------------
オブジェクト指向の解説書には必ず出てくる説明ですが、私は以前から このような説明が腑に落ちませんでした。
サブルーチンと変数を「まとめる」「隠す」と言っても、Cでも static変数やstatic関数を使えば似たようなことができるはずです。
この点については、「オブジェクト指向でなぜつくるのか」でも認めて います。
> 「まとめる」「隠す」については、C言語など従来のプログラミング >
言語でも実現できることに気づいた方もおられるかもしれません。
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*= [オブジェクト指向再入門] (2)「たくさん作る」はOOP特有の機能 *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
しかし、同書ではそれに次の文が続きます。
> しかしこの「たくさん作る」仕組みは、従来のプログラミング言語 > では実現が難しいOOP特有の機能です。
そして、同書では、ファイル操作するクラスを例にして「たくさん作る」 仕組みの便利さを説明しています。
そのクラスではファイル番号を保持する変数は一つのみです。
しかし、複数のファイルを使うようなアプリケーションからこのクラス 内のメソッドが呼び出されても以下の理由で大丈夫だというのです。
・プログラムの実行時にインスタンスが複数できる。 ・呼び出し側でインスタンスを指定して呼び出すから、呼び出される 側では、どのインスタンスに対するメソッド呼び出しなのか分かる。 ・したがって、クラスの側では、そのインスタンスが複数同時に 動くことを意識してロジックを組む必要はない。
> こうした仕組みがない構造化言語で同じ機能を実現する場合、配列 >
などを使って必要な数だけ変数領域を用意しなければならないため、 > それを処理するサブルーチンのロジックも複雑になってしまいます。 >
(「オブジェクト指向でなぜつくるのか」より)
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*= [オブジェクト指向再入門] (4)Cで同様の処理を書く場合 *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
この部分を私が最初読んだときの感想は「Cでも呼び出される側は 複数同時に動くことを意識しないじゃないか。それほど画期的なこと なのかなぁ」でした。
Cで同様の処理を書く場合には、通常は次のようにします。
・ファイル識別子を呼び出し元のローカル変数に格納しておく。 ・ファイルを操作する関数を呼び出すときには、そのファイル識別子を 引数として渡す。 ・したがって、呼び出される関数の側では、異なるファイル識別子が 同時に存在していることを意識してロジックを組む必要はない。
つまり、呼び出される関数内のファイル番号を保持する変数は、やはり 一つで済むはずなのです。
なぜ、インスタンスという仕組みがそれほど画期的なのでしょうか? 私はこの点についてもう少し考えて、分かりました。
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*= [オブジェクト指向再入門] (5)インスタンスが画期的な理由 *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
呼び出し元と呼び出し先で共通して利用しなければならないデータが ファイル識別子のように一つの場合は、CでもOOPでも大差ありません。
しかし、複雑な構造を持つデータを共用する場合には、OOPが威力を 発揮します。
Cで複雑な構造を持つデータを共用する方法は次の二つです。
・グローバル変数 ・呼び出し元で構造体などを作り、呼ぶときにはその領域のポインタ を渡す。
グローバル変数もポインタ変数も共にプログラムの保守性を低下させます。
OOPにおけるインスタンス変数は必要なときだけ存在し、しかも、 複雑な構造を持てる変数です。 ローカル変数とグローバル変数のいいとこ取りなのです。
なるほど、これは便利です!
でも、Javaから入りJavaしか知らないプログラマには、この仕組みの ありがたみが分からないでしょうね。
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*= [オブジェクト指向再入門] (6)現実の事象を表現できる *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
この仕組みが理解できると、「オブジェクト指向が現実世界をそのまま ソフトウェアに表現する技術である」という、OOPについてのお決まり の説明が理解できます。
インスタンスとは複雑なデータ構造を持ち得る仕組みです。 つまり、複数の属性を持てるのです。 その点ではデータベースのレコードに似ています。 その意味で、現実の事象を表現できるのです。
但し、データベースのレコードと違って、呼び出し元が必要とする ときにしか存在しません。 また、データベースのレコードと違って、メソッドとそれが属する クラスに結びついています。
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
次回以降の予告 *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
次回発行予定は、1月中旬です。
乞うご期待!!
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
本メルマガについて *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
したがって、第一の読者としては、慶の社員(正社員・契約社員)及び 慶と契約している個人事業主を想定しています。
また、多くのソフトウェア会社・技術者が直面している問題を扱っているので、 ソフトウェア会社の経営者、管理者、技術者にとっても参考になると思い、 第33号(2004年7月19日号)からは「まぐまぐ!」で一般の方々にも公開する ことにしました。 「まぐまぐ!」での読者数は2007年1月1日現在、649名です。
本メルマガの内容に興味を持つであろう方をご存知なら、是非 本メルマガの存在を教えてあげてください。
バックナンバーは、発行者サイトまたはブログで、体系として 見てもらいたいので、「まぐまぐ!」でのバックナンバー公開は 最新号のみとなっています。
<< [第197号]
[全バックナンバー]
[オブジェクト指向再入門] [第199号] >>
|