オブジェクト指向再入門

March 24, 2008

オブジェクト指向プログラミングは万能選手ではない

**************************************************************
_/_/_/_/_/_/_/ ソフトウェア業界 新航海術 _/_/_/_/_/_/_/_/_/
**************************************************************
第202号 2008/3/24 『OOPは万能選手ではない』
▼ まえがき:「ソフト会社の心臓ブログ」開設
▼ [オブジェクト指向再入門] (1)抽象メソッド、抽象クラス
▼ [オブジェクト指向再入門] (2)フレームワーク
▼ [オブジェクト指向再入門] (3)OOPは万能選手ではない
▼ 次回以降の予告

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
まえがき:「ソフト会社の心臓ブログ」開設
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

蒲生嘉達(がもうよしさと)です。

2月12日に「ソフト会社の心臓」を出版しました。
Amazonで「なか見!検索」もできます。
http://amazon.co.jp/exec/obidos/ASIN/4779002958/keiitteanifty-22

また、「ソフト会社の心臓ブログ」を開設しました。
URL: http://www.gamou.jp/heart/

今後はそこから質問への回答、誤植訂正、セミナー情報を発信していきます。
既に、質問への回答1件、誤植訂正6件など、12件の記事を掲載しています。

また、「ソフト会社の心臓」について、ご質問があれば、info@kei-it.com
までお寄せください。

今回も引き続き、オブジェクト指向プログラミングについて解説します。
「オブジェクト指向プログラミング」は本文では「OOP」と略します。
英語の'Object Oriented Programming'の略です。

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (1)抽象メソッド、抽象クラス
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

第197号から第201号まで、OOPの三大要素であるクラス、継承、
ポリモーフィズムをコンピュータの中の動きから解説しました。

さて、第201号での占いクラスの鑑定メソッドは、実際にはロジックは
存在する必要がないことに気づいた読者もいるでしょう。

 第201号:ポリモーフィズムの仕組み
 [B] http://kei-it.tea-nifty.com/sailing/2008/03/post_a142.html
 [H] http://www.kei-it.com/sailing/201-080310.html
 

ロジックが存在しないメソッドは「抽象メソッド」と呼ばれます。
「抽象メソッド」が存在するクラスは「抽象クラス」と呼ばれます。

そして、

抽象クラスはインスタンス化できません。
必ず継承されて、継承したサブクラスがインスタンス化されます。
このとき、抽象クラスの抽象メソッドはオーバーライドされて、
完全なものになっていることが必要です。

     ( http://www.nextindex.net/java/abstract.html )

第201号での「図201-2:四柱推命の動き 」でも、「占星術インスタンス」
や「四柱推命インスタンス」はありますが、「占いインスタンス」は
ありません。

 図201-2:四柱推命の動き
 http://www.kei-it.com/sailing/2008/201-2.htm

「抽象クラスはインスタンス化できません」という規則は、言語仕様
で決められているから存在するというよりも、継承やポリモーフィズム
の仕組みから必然的に出てくる性質なのです。

第200号、第201号のように、一度内部で起きていることを順を追って
見てみると、その後の理解の速度と深度が違ってきます。

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (2)フレームワーク
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

OOPの三大要素によって、プログラムの再利用について新しい方式が
可能となりました。

その一例がフレームワークです。

フレームワークはよく次のように説明されます。

フレームワークとは不完全なアプリケーションのことであり、開発者は
それを完成させることで、一つのアプリケーションを開発することに
なります。
( http://www.nextindex.net/java/Struts/index.html )

「不完全なアプリケーション」が先に存在し、そこから呼び出される
側を後から作るという開発手法は、ポリモーフィズム(呼び出す側を
変えなくてもよい)を活かしたものです。

このような開発手法は構造化プログラミング言語からは生まれてきません。

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (3)OOPは万能選手ではない
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

しかし、コンピュータの内部からOOPを見ると、OOPが万能選手でない
ことも分かってきます。

OOPは、クラス、継承、ポリモーフィズムの仕組みの上で動きますが、
それらの仕組みを必要としない、あるいは、むしろ有害となる分野も
あり得るのです。

あるいは、システムの一部でのみOOPが有効に機能する場合もあり得ます。
システムの全てをOOPで作る必要もないのです。

様々な例が考えられますが、ここでは数例のみ上げましょう。

OOPは「ヒープ領域をじゃぶじゃぶ使って動く」(平澤章氏)ので、
ヒープ領域が潤沢にあることが前提となります。
極めて限られたメモリ資源で動くプログラム、例えば、組み込み系
プログラムでは、今後ともCが主流であり続けるでしょう。

また、アプリケーションプログラムであってもOSのネイティブの
機能へと降りていく必要のある部分では、やはりCが主流であり続ける
でしょう。

「OOP+RDBMSのストアドプロシージャ」というパターンも広く使われ
続けるでしょう。

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
次回以降の予告
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

次回発行予定は、4月上旬です。

今週号で「オブジェクト指向再入門シリーズ」は一段落したので、
次回は別のシリーズを予定しています。

乞うご期待!!

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
本メルマガについて
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

私は中小ソフトウェア会社の経営者なので、(特に日本の)ソフト
ウェア業界、ソフトウェア産業について強烈な興味を持っています。
技術面だけでなく、会計面、法律面、人事面など様々な面において・・・。

そして、私はものごとを見るときに次のことを心がけています。

・あるものをあるがままに見る。
 色眼鏡(例えば権威者の意見)でものを見ない。

・くっきりはっきり見る。
 複雑な現実も、ある観点から見ると、あるいはある角度から光を
 あてると、くっきりはっきり見えてくる。

・批判だけではなく、明るく前向きな解決策を提示する。

この視点で見えてきたことを本メルマガに綴っています。

本メルマガの内容に興味を持つであろう方をご存知なら、是非、
本メルマガの存在を教えてあげてください。

(以下をそのまま転送するだけです。)
---------------------------------------------------
【お勧めメルマガ ソフトウェア業界 新航海術】
⇒ http://www.mag2.com/m/0000136030.htm または
 http://kei-it.tea-nifty.com/sailing/ または
 http://www.kei-it.com/sailing/ 
--------------------------------------------------

このメールマガジンは『まぐまぐ!』 http://www.mag2.com/ を利用して
発行しています。配信中止はこちら http://www.mag2.com/m/0000136030.htm
(但し、慶社員には社内のメーリングリストで配信しています。)

「まぐまぐ!」での読者数は2007年3月23日現在、670名です。

バックナンバーは、発行者サイトまたはブログで、体系として
見てもらいたいので、「まぐまぐ!」でのバックナンバー公開は
最新号のみとなっています。

バックナンバーブログ:http://www.gamou.jp/sailing/
発行者Webサイト: http://www.kei-it.com/sailing/
(発行者Webサイトではバックナンバーの全文検索も可能です。)

|

March 10, 2008

ポリモーフィズムの仕組み

**************************************************************
_/_/_/_/_/_/_/ ソフトウェア業界 新航海術 _/_/_/_/_/_/_/_/_/
**************************************************************
第201号 2008/3/10 『ポリモーフィズムの仕組み』
▼ まえがき
▼ [オブジェクト指向再入門] (1)OOPを過大でも過小でもなく見る
▼ [オブジェクト指向再入門] (2)ポリモーフィズムの一般的な説明
▼ [オブジェクト指向再入門] (3)占いクラスを継承した占星術クラス
▼ [オブジェクト指向再入門] (4)継承するということの意味
▼ [オブジェクト指向再入門] (5)第200号「継承の仕組み」のおさらい
▼ [オブジェクト指向再入門] (6)占いクラスを継承した四柱推命クラス
▼ [オブジェクト指向再入門] (7)ポリモーフィズムとは
▼ 次回以降の予告


*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
まえがき
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

蒲生嘉達(がもうよしさと)です。

2月12日に「ソフト会社の心臓」を出版しました。

Amazonで「なか見!検索」もできます。
http://amazon.co.jp/exec/obidos/ASIN/4779002958/keiitteanifty-22


「ソフト会社の心臓」は下記のメルマガやブログでも取り上げられました。

中国オフショア開発最前線
http://snic.livedoor.biz/archives/51241499.html
新・中国ビジネス入門
http://www.ai-coach.com/backno/ciplatest.html

今回も引き続き、オブジェクト指向プログラミングについて解説します。

「オブジェクト指向プログラミング」は本文では「OOP」と略します。
英語の'Object Oriented Programming'の略です。

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (1)OOPを過大でも過小でもなく見る
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

私は「オブジェクト指向でなぜつくるのか」での平澤章氏の下記の
主張に賛成します。

(1)下流工程のオブジェクト指向(OOP)、上流工程のオブジェクト指向
 (モデリング)、全体をカバーするオブジェクト指向(UML、開発
 プロセス)は、個別に見るとそれぞれ随分違うものである。

(2)OOPは決して従来技術からの飛躍ではなく、連綿と続いてきた
 プログラム言語の進化の延長線上にある。

(3)OOPは純粋なプログラミングの仕組みとして捉えるべきである。


そして、メモリの側からOOPを見たとき、私は初めてOOPを過大でも
過小でもなく等身大に捉えられた気がしました。


第199号では、クラスが静的領域にロードされ、インスタンスが
ヒープ領域に生成される様子を見ました。

 第199号:クラスのロードからインスタンスへの情報設定まで
 http://www.gamou.jp/sailing/2008/02/post_a0f2.html

第200号では、継承が実現される様子を見ました。

 第200号:継承の仕組み
 http://www.gamou.jp/sailing/2008/02/post_968a.html


今週号では、ポリモーフィズムが実現される様子を見てみましょう。

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (2)ポリモーフィズムの一般的な説明
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

ポリモーフィズムは一般には次のように説明されます。

> ポリモーフィズム(Polymorphism)とは、主にオブジェクト指向
> プログラミングで、あるオブジェクトへの操作が呼び出し側(sender)
> ではなく、受け手のオブジェクト(receiver)によって定まる特性のこと。
>            (「ウィキペディア(Wikipedia)」より)


> オブジェクトが、自分の動作に責任を持って、自立的に動作すること。
> オブジェクトの型ではなく、生成されたオリジナルのクラス型で
> 実装されたメソッドが起動するために、同じ型のオブジェクトに対して、
> 同じメソッド呼び出しを実行しても、生成されたオリジナルのクラスが
> 異なれば、異なるメソッドが起動される。
>      (「浅煎り珈琲Java アプリケーション入門」
>     http://www.nextindex.net/java/polymorphism.html より )

読者は理解できますか?
私は理解できませんでした。

次のような説明はいかがでしょうか?

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (3)占いクラスを継承した占星術クラス
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

占いクラスとそれを継承した占星術クラスを例にして説明します。

「図201-1:占星術クラスの動き」
( http://www.kei-it.com/sailing/2008/201-1.htm )を参照しながら
説明を読んでください。

図中の「リスト1.占いクラス」に示すように、占いクラスには次の
4つのメソッドが存在します。
・姓設定
・名設定
・誕生日設定
・鑑定


一方、占星術クラスには、「リスト2.占星術クラス」に示すように、
自前のメソッドとしては「鑑定メソッド」だけが存在します。

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (4)継承するということの意味
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

第200号で解説したとおり、継承するということは次のことを意味します。


【メソッドテーブル】

占星術クラスのメソッドテーブルが静的領域に作られます。
そして、その中には、占星術クラスのメソッドへのポインタだけでなく
占いクラスのメソッドへのポインタも含まれます。


【インスタンスのメンバ変数】

また、占星術クラスから生成された占星術インスタンス福田康夫には、
占いクラスのメンバ変数が継承されます。

つまり、占星術インスタンスには占いインスタンスのメンバ変数
(姓、名、誕生日、性、鑑定)が含まれます。

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (5)第200号「継承の仕組み」のおさらい
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

「図201-1:占星術クラスの動き」中の(A)から(D)までは
インスタンス福田康夫の姓変数に"福田"を設定する処理が実行される
様子を表しています。

(E)から(H)まではインスタンス福田康夫の鑑定変数に鑑定結果を
設定する処理が実行される様子を表しています。

どちらも第200号「継承の仕組み」のおさらいですが、念のため
解説しておきます。


【姓の設定】
(A)OSはインスタンス福田康夫に関連付けられているメソッドテーブルを
 参照する。
(B)そのメソッドテーブルの中で姓設定メソッドへのポインタを探す。
 →占いクラスから継承された姓設定メソッドへのポインタを見つける。

(C)見つかった姓設定メソッドを実行する。
(D)姓設定メソッドは、インスタンス福田康夫の姓変数に"福田"を
 設定する。

【鑑定の設定】
(E)OSはインスタンス福田康夫に関連付けられているメソッドテーブルを
 参照する。
(F)そのメソッドテーブルの中で鑑定メソッドへのポインタを探す。
(G)見つかったら、その鑑定メソッドを実行する。
(H)鑑定メソッドは、インスタンス福田康夫の鑑定変数に鑑定結果を
 設定する。

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (6)占いクラスを継承した四柱推命クラス
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

さて、占いには占星術以外にも様々な流派があります。
四柱推命、姓名判断、前世占い、東洋占星術など・・・。

鑑定するために必要なデータは大概、姓、名、誕生日、性ですが、
鑑定ロジックは流派によって全く異なります。
したがって、様々な占いに対応するためには流派ごとにサブクラスが
必要となります。

「図201-2:四柱推命クラスの動き」
( http://www.kei-it.com/sailing/2008/201-2.htm )は四柱推命
クラスの例です。

占星術クラスと同じく、占いクラスを継承しています。

四柱推命クラスの動きは占星術クラスと同じなので、説明は省略します。

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (7)ポリモーフィズムとは
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

図201-2の中の「リスト3.占星術呼び出し元」と「リスト5.四柱推命
呼び出し元」を比べてみてください。

インスタンスの生成部分( 占星術 福田康夫 = new 占星術(); など)
のみが異なり、ロジック部分は全く変わっていないことに気づくでしょう。


同じような処理をCで書く場合、呼び出し側で共通処理(姓設定など)と
個別処理(鑑定)を意識し、且つ、個別処理は占星術鑑定関数とか
四柱推命鑑定関数とか関数に別名を付けなければなりません。

しかし、OOPの場合、メソッド名も同じで行けます。

これがはるか上で引用したポリモーフィズムの解説文
「オブジェクトの型ではなく、生成されたオリジナルのクラス型で
実装されたメソッドが起動するために、同じメソッド呼び出しを実行
しても、生成されたオリジナルのクラスが異なれば、異なるメソッドが
起動される」の意味するところです。

これがポリモーフィズムであり、フレームワークはその応用編となります。

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
次回以降の予告
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

次回以降で、クラスライブラリ、フレームワークへと話を進めていきます。


次回発行予定は、3月下旬です。

乞うご期待!!

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
本メルマガについて
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

私は中小ソフトウェア会社の経営者なので、(特に日本の)ソフト
ウェア業界、ソフトウェア産業について強烈な興味を持っています。
技術面だけでなく、会計面、法律面、人事面など様々な面において・・・。

そして、私はものごとを見るときに次のことを心がけています。

・あるものをあるがままに見る。
 色眼鏡(例えば権威者の意見)でものを見ない。

・くっきりはっきり見る。
 複雑な現実も、ある観点から見ると、あるいはある角度から光を
 あてると、くっきりはっきり見えてくる。

・批判だけではなく、明るく前向きな解決策を提示する。


この視点で見えてきたことを本メルマガに綴っています。


本メルマガの内容に興味を持つであろう方をご存知なら、是非、
本メルマガの存在を教えてあげてください。

(以下をそのまま転送するだけです。)
---------------------------------------------------
【お勧めメルマガ ソフトウェア業界 新航海術】
⇒ http://www.mag2.com/m/0000136030.htm または
 http://kei-it.tea-nifty.com/sailing/ または
 http://www.kei-it.com/sailing/ 
--------------------------------------------------

このメールマガジンは『まぐまぐ!』 http://www.mag2.com/ を利用して
発行しています。配信中止はこちら http://www.mag2.com/m/0000136030.htm
(但し、慶社員には社内のメーリングリストで配信しています。)

「まぐまぐ!」での読者数は2007年3月8日現在、669名です。

バックナンバーは、発行者サイトまたはブログで、体系として
見てもらいたいので、「まぐまぐ!」でのバックナンバー公開は
最新号のみとなっています。

バックナンバーブログ:http://www.gamou.jp/sailing/
発行者Webサイト: http://www.kei-it.com/sailing/
(発行者Webサイトではバックナンバーの全文検索も可能です。)


☆筆者の趣味のブログ:身近にいる小動物の図鑑☆
 http://www.gamou.jp/small/

|

February 25, 2008

継承の仕組み

**************************************************************
_/_/_/_/_/_/_/ ソフトウェア業界 新航海術 _/_/_/_/_/_/_/_/_/
**************************************************************
第200号 2008/2/25 『継承の仕組み』
▼ まえがき
▼ [オブジェクト指向再入門] (1)OOPは従来技術からの飛躍ではない
▼ [オブジェクト指向再入門] (2)ヒープ領域の獲得・解放での違い
▼ [オブジェクト指向再入門] (3)継承を実現するための仕組み
▼ [オブジェクト指向再入門] (4)サブクラスのインスタンス化
▼ [オブジェクト指向再入門] (5)自分のメソッドの実行
▼ [オブジェクト指向再入門] (6)継承されたメソッドの実行
▼ 次回以降の予告
▼ メルマガ紹介


*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
まえがき
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

蒲生嘉達(がもうよしさと)です。

2月12日に「ソフト会社の心臓」販売開始しました。
詳細は下記のページを参照してください。
http://www.kei-it.com/y_gamou/heart/


今回も引き続き、オブジェクト指向プログラミングについて解説します。
「オブジェクト指向でなぜつくるのか」(平澤章著、日経BP社発行)を
参考にしています。

「オブジェクト指向プログラミング」は本文では「OOP」と略します。
英語の'Object Oriented Programming'の略です。

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (1)OOPは従来技術からの飛躍ではない
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

私は「オブジェクト指向でなぜつくるのか」での平澤章氏の下記の
主張に賛成します。

(1)下流工程のオブジェクト指向(OOP)、上流工程のオブジェクト指向
 (モデリング)、全体をカバーするオブジェクト指向(UML、開発
 プロセス)は、個別に見るとそれぞれ随分違うものである。

(2)OOPは決して従来技術からの飛躍ではなく、連綿と続いてきた
 プログラム言語の進化の延長線上にある。

(3)OOPは純粋なプログラミングの仕組みとして捉えるべきである。


第199号では、クラスが静的領域にロードされ、インスタンスが
ヒープ領域に生成される様子を見ました。

図1から図5まで( http://www.kei-it.com/sailing/2008/199.htm )を
見ると、上記(2)「OOPは決して従来技術からの飛躍ではない」が
実感できます。

例えば「図5:2つのインスタンス」
http://www.kei-it.com/sailing/2008/199.htm#5 は、Cで書かれた
プログラムが実行されているときのメモリの状態とそっくりです。

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (2)ヒープ領域の獲得・解放での違い
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

但し、次の2点で大きな違いがあります。

一つは、Cではヒープ領域の獲得・解放をプログラム側で制御する
のに対し、OOPでは実行環境が制御するという点です。

具体的に言うと、Cでは malloc と free が必要なのに対し、
Javaでは new だけで済むということです。

 関連記事:第198号「インスタンスはヒープ領域に作られる」
 http://kei-it.tea-nifty.com/sailing/2008/01/post_6f91.html

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (3)継承を実現するための仕組み
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

二つ目の違いはメソッドテーブルです。

「図3:姓の設定」 http://www.kei-it.com/sailing/2008/199.htm#3
で描かれているとおり、OOPではメソッドテーブル経由でメソッド
コードが呼び出されます。

一方、Cではプログラマが自前で関数ポインタテーブル経由で呼ぶような
制御ルーチンを作らない限り、直接関数コードが呼び出されます。


このように言うと、Javaプログラマは「自分はメソッドテーブル経由
ではなく、直接メソッドを呼んでいる」と言うでしょう。

メソッドテーブルはプログラマからは見えないからです。

では、なぜメソッドテーブルが存在するのでしょうか?

それは、継承とポリモーフィズムを実現するための仕組みだからです。

(他にも継承やポリモーフィズムの実現方法はあるようですが、ここでは
「オブジェクト指向でなぜつくるのか」にならってメソッドテーブルで
説明しています。)

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (4)サブクラスのインスタンス化
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

「図6:継承」http://www.kei-it.com/sailing/2008/200-6.htm を
参照してください。

人クラスを継承している歌手クラスを想定して書かれています。
この継承は、Javaでなら次のような表記になります。

 class 歌手 extends 人{
}


「図6:継承」は、歌手インスタンス倖田來未が生成されたときの
メモリの状態です。
Javaでなら「歌手 倖田來未 = new 歌手();」が実行されたときの
メモリの状態です。

「図6:継承」では次のことが表現されています。


(A)コードのロード

歌手クラスのコード(デビュー曲設定メソッド、所属設定メソッドの
コード)は静的領域にロードされます。


(B)メソッドテーブル

歌手クラスのメソッドテーブルが静的領域に作られます。
そして、そのメソッドテーブルには次の二つが含まれます。
・人クラスのメソッドへのポインタ
・歌手クラスのメソッドへのポインタ

サブクラスのメソッドテーブルにはスーパークラスのメソッドへの
ポインタも含まれているということが重要です。


(C)インスタンス

歌手クラスから生成された歌手インスタンス倖田來未には、
人クラスのメンバ変数が継承されています。

つまり、歌手インスタンスには人インスタンスのメンバ変数
(姓、名、誕生日、性)が含まれています。

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (5)自分のメソッドの実行
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

「図7:デビュー曲設定」http://www.kei-it.com/sailing/2008/200-7.htm
は、インスタンス倖田來未のデビュー曲変数に"TAKE BACK"を設定する
処理が実行される様子を表しています。

Javaでなら「倖田來未.デビュー曲設定("TAKE BACK");」が実行される
仕組みです。


(A)OSはインスタンス倖田來未に関連付けられているメソッドテーブルを
 参照する。
(B)そのメソッドテーブルの中でデビュー曲設定メソッドへのポインタを
 探す。
(C)見つかったら、そのデビュー曲設定メソッドを実行する。
(D)デビュー曲設定メソッドは、インスタンス倖田來未のデビュー曲
 変数に"TAKE BACK"を設定する。

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (6)継承されたメソッドの実行
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

次に継承されたメソッドが実行される仕組みを見てみましょう。

「図8:継承されたメソッドの使用」
http://www.kei-it.com/sailing/2008/200-8.htm は、インスタンス
倖田來未の姓変数に"倖田"を設定する処理が実行される様子を表
しています。

Javaでなら「倖田來未.姓設定("倖田");」が実行される仕組みです。


(A)OSはインスタンス倖田來未に関連付けられているメソッドテーブルを
 参照する。
(B)そのメソッドテーブルの中で姓設定メソッドへのポインタを探す。
 →人クラスから継承された姓設定メソッドへのポインタを見つける。

(C)見つかった姓設定メソッドを実行する。
(D)姓設定メソッドは、インスタンス倖田來未の姓変数に"倖田"を
 設定する。


メソッドテーブルは、コードの重複を排除する役割を果たしている
ことが分かります。

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
次回以降の予告
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

次回以降で、ポリモーフィズム、クラスライブラリ、フレームワーク
へと話を進めていきます。


次回発行予定は、3月初旬です。

乞うご期待!!

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
 メルマガ紹介
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

私が購読しているメルマガの一つを紹介します。
経験に基づく様々なノウハウが盛り込まれています。

------------------------------------------------------------
「コンピュータシステムはなぜ機能しないのか?」
~利益を大幅にアップさせるシステム設計の裏ワザ~

SE、プログラマだけでなくユーザーを含むシステム開発に関わる全
ての方々へ。納得のいく、利益を生むシステム作りの裏ワザを業界
暦20余年のSEがマネジメント、プロジェクト管理、プログラミング、
保守、人材育成を踏まえて伝授します。相互紹介募集中です。

ご登録はこちらから
http://www.mag2.com/m/0000155977.html
------------------------------------------------------------

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
本メルマガについて
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

私は中小ソフトウェア会社の経営者なので、(特に日本の)ソフト
ウェア業界、ソフトウェア産業について強烈な興味を持っています。
技術面だけでなく、会計面、法律面、人事面など様々な面において・・・。

そして、私はものごとを見るときに次のことを心がけています。

・あるものをあるがままに見る。
 色眼鏡(例えば権威者の意見)でものを見ない。

・くっきりはっきり見る。
 複雑な現実も、ある観点から見ると、あるいはある角度から光を
 あてると、くっきりはっきり見えてくる。

・批判だけではなく、明るく前向きな解決策を提示する。


この視点で見えてきたことを本メルマガに綴っています。


本メルマガの内容に興味を持つであろう方をご存知なら、是非、
本メルマガの存在を教えてあげてください。

(以下をそのまま転送するだけです。)
---------------------------------------------------
【お勧めメルマガ ソフトウェア業界 新航海術】
⇒ http://www.mag2.com/m/0000136030.htm または
 http://kei-it.tea-nifty.com/sailing/ または
 http://www.kei-it.com/sailing/ 
--------------------------------------------------

このメールマガジンは『まぐまぐ!』 http://www.mag2.com/ を利用して
発行しています。配信中止はこちら http://www.mag2.com/m/0000136030.htm
(但し、慶社員には社内のメーリングリストで配信しています。)


バックナンバーは、発行者サイトまたはブログで、体系として
見てもらいたいので、「まぐまぐ!」でのバックナンバー公開は
最新号のみとなっています。

バックナンバーブログ:http://kei-it.tea-nifty.com/sailing/
発行者Webサイト: http://www.kei-it.com/sailing/
(発行者Webサイトではバックナンバーの全文検索も可能です。)


☆筆者の趣味のブログ:身近にいる小動物の図鑑☆
 http://kei-it.tea-nifty.com/small/

|

February 13, 2008

クラスのロードからインスタンスへの情報設定まで

**************************************************************
_/_/_/_/_/_/_/ ソフトウェア業界 新航海術 _/_/_/_/_/_/_/_/_/
**************************************************************
第199号 2008/2/12
『クラスのロードからインスタンスへの情報設定まで』
▼ まえがき
▼ [オブジェクト指向再入門] (1)クラスコードのロード
▼ [オブジェクト指向再入門] (2)メソッドテーブル
▼ [オブジェクト指向再入門] (3)インスタンスの生成
▼ [オブジェクト指向再入門] (4)変数への値の設定
▼ [オブジェクト指向再入門] (5)仕組みの側から捉えていく
▼ 次回以降の予告


*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
まえがき
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

蒲生嘉達(がもうよしさと)です。

今回も、引き続き「オブジェクト指向プログラミング」について
解説します。

「オブジェクト指向プログラミング」は本文では「OOP」と略します。
英語の'Object Oriented Programming'の略です。

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (1)クラスコードのロード
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

「オブジェクト指向でなぜつくるのか」(平澤章著、日経BP社発行)の
「第5章 メモリの仕組みの理解はプログラマのたしなみ」をもう少し
発展させて、OOPが動く様子をメモリの側から解説してみましょう。

メモリの話をする場合には、図が不可欠なので、
http://www.kei-it.com/sailing/2008/199.htm を参照しながら
読んでください。


「図1:クラスコードのロード」はクラス(図では人クラス)の
コードがメモリにロードされた状態を表しています。
http://www.kei-it.com/sailing/2008/199.htm#1


クラスのコードは静的領域に格納されます。
これはCもOOPも同じです。

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (2)メソッドテーブル
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

コードのロードにおいてCとOOPとの大きな違いは次の点です。

OOPの場合、クラスコードをロードすると同時に、クラスごとに
静的領域にメソッドテーブルが生成されます。
(他にもOOPの実現方法はあるようですが、ここでは「オブジェクト
指向でなぜつくるのか」にならってメソッドテーブルで説明します。)

「メソッドテーブル」とは、個々のメソッドコードへのポインタの
配列です。

「メソッドコードへのポインタ」とは、Cでの関数ポインタにあたります。

Cでは関数ポインタが明示的に存在し、マトリックス制御をするときなど、
関数ポインタの配列を作り、「この事象のときにはこの関数に飛ぶ」
というような使い方をします。

OOPでのメソッドテーブルも、メソッドの呼び方を制御するために
存在します。

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (3)インスタンスの生成
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

「図2:インスタンスの生成」はクラスのインスタンスが生成された
直後のメモリの状態です。
http://www.kei-it.com/sailing/2008/199.htm#2


図2では人クラスから福田康夫インスタンスを作ることを想定しています。

例えばJavaでは、「変数名 = new クラス名();」が実行されると、
インスタンスが生成されます。

図2の例なら「人 福田康夫 = new 人();」が実行されると、
インスタンス福田康夫が生成されます。

インスタンスが生成される領域はヒープ領域です。

 (第198号:インスタンスはヒープ領域に作られる
 http://kei-it.tea-nifty.com/sailing/2008/01/post_6f91.html 参照)


この時点では領域のみが確保され、姓、名、誕生日、性 の変数には
値はまだ入っていません。


ここで重要なことは、インスタンスが生成される際にインスタンス
からクラスのメソッドテーブルへの関連付けが行われるということです。

この関連付けの実現方法はOOP言語によって異なるのでしょうが、
例えば、インスタンス生成時に(プログラマからは見えない情報として)
インスタンスの中にクラスへのポインタが埋め込まれるのかもしれません。

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (4)変数への値の設定
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

「図3:姓の設定」は、インスタンスに具体的な値が設定される様子を
表しています。
http://www.kei-it.com/sailing/2008/199.htm#3

「福田康夫.姓設定("福田");」が実行されると、次のようなことが
起きます。

(A)インスタンス福田康夫に関連付けられているメソッドテーブルを
 参照する。
(B)そのメソッドテーブルの中で姓設定メソッドへのポインタを探す。
(C)見つかったら、その姓設定メソッドを実行する。
(D)姓設定メソッドは、インスタンス福田康夫内の姓変数に"福田"を
 設定する。


続いて下記のコードが実行された後の状態を、「図4:情報設定後」
( http://www.kei-it.com/sailing/2008/199.htm#4 )
に示します。

 福田康夫.名設定("康夫");
 福田康夫.誕生日設定("1936年7月16日");
 福田康夫.性設定("男");

さらに、インスタンス佐藤ゆかりを作って、そこに姓、名、誕生日、
性の情報を格納した状態を「図5:2つのインスタンス」
( http://www.kei-it.com/sailing/2008/199.htm#5 )に示します。
実行されたコードは下記の5行です。

 人 佐藤ゆかり = new 人();
 佐藤ゆかり.姓設定("佐藤");
 佐藤ゆかり.名設定("ゆかり");
 佐藤ゆかり.誕生日設定("1961年8月19日");
 佐藤ゆかり.性設定("女");


*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (5)仕組みの側から捉えていく
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

今日の話がOOPの実行の基本形で、それのほんの少しの応用が継承と
ポリモーフィズム、さらにもう一段の応用がクラスライブラリ、
フレームワークとなります。

今日の話だけだと、メソッドテーブルが介在するメリットは分か
ないでしょう。
しかし、継承とポリモーフィズムまで話を進めていくと、メソッド
テーブルを介在させる理由が理解できます。

逆に言えば、継承とポリモーフィズムを実現するためにメソッド
テーブルが存在するとも言えます。

OOPを、それが実現される仕組みの側から捉えていくと、OOPの
言語仕様が「たまたま決められたこと」ではなく、OOP特有のメモリ
管理の方法から必然的には発生することであることが分かってきます。

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
次回以降の予告
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

次回発行予定は、3月初旬です。

乞うご期待!!

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
本メルマガについて
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

本メルマガは2003年12月8日に創刊されました。
創刊号 http://www.kei-it.com/sailing/01-031208.html で述べたとおり、
本メルマガのコンセプトは「読みものとしても面白い慶の事業計画」であり、
目的は「事業計画の背後にある基本的な考え方を語ること」です。

したがって、第一の読者としては、慶の社員(正社員・契約社員)及び
慶と契約している個人事業主を想定しています。

また、多くのソフトウェア会社・技術者が直面している問題を扱っているので、
ソフトウェア会社の経営者、管理者、技術者にとっても参考になると思い、
第33号(2004年7月19日号)からは「まぐまぐ!」で一般の方々にも公開する
ことにしました。
「まぐまぐ!」での読者数は2007年2月11日現在、654名です。


本メルマガの内容に興味を持つであろう方をご存知なら、是非
本メルマガの存在を教えてあげてください。

(以下をそのまま転送するだけです。)
---------------------------------------------------
【お勧めメルマガ ソフトウェア業界 新航海術】
⇒ http://www.mag2.com/m/0000136030.htm または
 http://kei-it.tea-nifty.com/sailing/ または
 http://www.kei-it.com/sailing/ 
--------------------------------------------------

このメールマガジンは『まぐまぐ!』 http://www.mag2.com/ を利用して
発行しています。配信中止はこちら http://www.mag2.com/m/0000136030.htm
(但し、knextall@kei-it.com には直接配信しています。)


バックナンバーは、発行者サイトまたはブログで、体系として
見てもらいたいので、「まぐまぐ!」でのバックナンバー公開は
最新号のみとなっています。

バックナンバーブログ:http://kei-it.tea-nifty.com/sailing/
発行者Webサイト: http://www.kei-it.com/sailing/
(発行者Webサイトではバックナンバーの全文検索も可能です。)


☆筆者の趣味のブログ:身近にいる小動物の図鑑☆
 http://kei-it.tea-nifty.com/small/

--------------------------------------------------
発行:
株式会社 慶
 代表取締役 蒲生 嘉達
 http://www.kei-it.com/y_gamou/

☆ コピーや配布をされる時はご一報ください ☆

|

January 21, 2008

インスタンスはヒープ領域に作られる

**************************************************************
_/_/_/_/_/_/_/ ソフトウェア業界 新航海術 _/_/_/_/_/_/_/_/_/
**************************************************************
第198号 2008/1/21
『インスタンスはヒープ領域に作られる』
▼ まえがき
▼ [オブジェクト指向再入門] (1)良書である理由
▼ [オブジェクト指向再入門] (2)インスタンスはヒープ領域に作られる
▼ [オブジェクト指向再入門] (3)Cでのヒープ領域の使用方法
▼ [オブジェクト指向再入門] (4)Javaでも同じようなことをやっている
▼ [オブジェクト指向再入門] (5)Cは手動メモリ管理
▼ [オブジェクト指向再入門] (6)メモリ自動管理の唯一の弊害
▼ 次回以降の予告


*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
まえがき
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

蒲生嘉達(がもうよしさと)です。

いよいよ拙著「ソフト会社の心臓」が2月12日(火)に出版されます。
出版社からカバー案(↓)が送られてきました。
http://www.kei-it.com/sailing/img/soft.jpg


さて、今日は、引き続き「オブジェクト指向プログラミング」に
ついて話します。

「オブジェクト指向プログラミング」は本文では「OOP」と略します。
英語の'Object Oriented Programming'の略です。

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (1)良書である理由
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

第197号でもふれた「オブジェクト指向でなぜつくるのか」(平澤章著、
日経BP社発行)を読み終わりました。

 (第197号:インスタンスという仕組みが画期的である理由
 http://kei-it.tea-nifty.com/sailing/2008/01/post_606d.html )


私は、次の二つの点で、この本は良書だと思います。

(1)
プログラミング技術であるOOPと、上流工程で使われるオブジェクト
指向技術(モデリングなど)とを明確に区別して書いています。

(2)
OOPの特徴はメモリの使い方にあると指摘し、そのメモリの使い方
の側から、クラス、インスタンス、ポリフォーフィズム、継承
などの仕組みを説明しています。

OOPをメモリの使い方の側から説明している本は珍しいと思います。

(1)については別の機会に話すとして、本日は(2)について
話します。

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (2)インスタンスはヒープ領域に作られる
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

例えば、インスタンスの生成について、同書では、

> インスタンスを作る命令が実行されると、そのクラスのインスタンス
> 変数を格納するのに必要な大きさのメモリがヒープ領域に割り当てら
> れます

と説明されています。


例えば、Javaで次のように書くと、Bookインスタンスがヒープ領域に
作られます。

 Book WhyOOP = new Book(); // Bookインスタンスの作成


ここで「ヒープ領域に作られる」というところが重要です。


------------------------【基礎知識】------------------------

プログラムが動くときに使われるメモリ領域には、静的領域、
スタック領域、そしてヒープ領域の3つがあります。

静的領域とはプログラムコードやグローバル変数が格納される領域です。
スタック領域とはローカル変数、引数、呼び出し元アドレスが格納
される領域です。

それに対し、ヒープ領域とはアプリケーションが自由に使えるワーク
領域のようなもので、アプリケーションが必要とする大きさの領域を
必要とする期間保持できます。

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (3)Cでのヒープ領域の使用方法
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

第197号では次のように書きました。

> Cで複雑な構造を持つデータを共用する方法は次の二つです。
>
> ・グローバル変数
> ・呼び出し元で構造体などを作り、呼ぶときにはその領域のポインタ
>  を渡す。

 ( 第197号:インスタンスという仕組みが画期的である理由
 http://kei-it.tea-nifty.com/sailing/2008/01/post_606d.html )


Cでは、ある関数内でヒープ領域を獲得し、そこに構造体などを作り、
その領域のポインタを使って様々な関数がその領域にアクセスすると
いうことをよくやります。

スタック領域に作られる変数(ローカル変数)はその関数が呼び出
されているときにしか存在しないため、一定期間データを保持したい
ときには使えないからです。

また、グローバル変数として静的領域に作ると、プログラムサイズが
大きくなるし、保守性が低下するからです。


Cでは上記処理を具体的には次のように書きます。

・malloc関数でヒープ領域を獲得する。
・その領域のポインタを引数として、他の関数を呼び出す。

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (4)Javaでも同じようなことをやっている
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

実はJavaでも同じようなことをやっているのです。

 Book WhyOOP = new Book(); // Bookインスタンスの作成

というコードは次のことを意味しています。

・ヒープ領域を獲得し、そこにWhyOOPという名前のBookインスタンス
 を作る。
・Book WhyOOP には、上記インスタンスが存在するヒープ領域の
 ポインタが格納される。

そして、次に

 WhyOOP.setPrice("2400"); // WhyOOPに値段を設定する

というコードを書いたとしたら、それは次のことを意味します。

・メソッドsetPrice呼び出す。
・WhyOOPを指定する。
 つまり、WhyOOPインスタンスが存在するヒープ領域のポインタを渡す。
(Cのように明示的なポインタではないが・・・。)

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (5)Cは手動メモリ管理
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

しかし、下記の点でCとJavaとでは大きな違いがあります。

・Cでは、malloc関数で(サイズまで指定して)明示的にヒープ領域を
 獲得しなければならない。
・しかも、不要になったら、free関数で明示的にその領域を解放しな
 ければならない。


ここに2つの問題があります。

(1)他のヒープ領域まで侵入できる

Cではヒープ領域のポインタを明示的に扱えるため、自分が獲得
したヒープ領域を超えて、他のプログラムが獲得しているヒープ
領域まで参照できてしまいます。
したがって、Cでは他のプログラムが獲得しているヒープ領域のデータを
破壊するという重大なバグが発生しやすいのです。


(2)メモリ解放漏れバグ

メモリ解放漏れのバグもしばしば発生します。
特にイレギュラーなケースでメモリ解放を忘れがちです。

しかも、メモリ解放漏れのバグは見つけにくいのです。
多少解放漏れがあったとしても、プログラムを数回流した程度では、
メモリは枯渇しないからです。

つまり、通常のテストでは正常に動いていたのに、少しずつ使用可能
メモリが減っていって、長時間稼動させると妙な動きが始まるのです。
その解放漏れがレアケースにのみ通過する部分にあったりすると、
デバッグは困難を極めます。

一方、JavaなどのOOP言語ではヒープ領域の獲得と解放が自動化
されています。この自動解放の仕組みがガベージコレクションです。

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (6)メモリ自動管理の唯一の弊害
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

メモリ自動管理はプログラマの生産性を向上させました。

これはOOPに限ったことではありません。
多くのWindowsプログラマがCやC++ではなく、VBを使う理由は、
VBの方が生産性が高いからであり、その生産性の高さの大部分は
メモリ自動管理によるものです。


しかし、メモリ自動管理には、たった一つだけ弊害がありました。

プログラムが動く仕組みをプログラマがイメージしにくくなったと
いう点です。

Cのプログラマは頭の中でメモリ領域をシミュレートしながら
プログラムを書いていました。

しかし、JavaやVBや.NETのプログラマの頭の中ではメモリ領域の
シミュレーションは行われていないでしょう。

そして、普段はそれでいいのです。

しかし、ときどきは必要になるのです。


したがって、私はOOPにおけるメモリの使い方の話をもう少し続けようと
思います。


*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
次回以降の予告
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

次回発行予定は、2月初旬です。

乞うご期待!!

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
本メルマガについて
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

本メルマガは2003年12月8日に創刊されました。
創刊号 http://www.kei-it.com/sailing/01-031208.html で述べたとおり、
本メルマガのコンセプトは「読みものとしても面白い慶の事業計画」であり、
目的は「事業計画の背後にある基本的な考え方を語ること」です。

したがって、第一の読者としては、慶の社員(正社員・契約社員)及び
慶と契約している個人事業主を想定しています。

また、多くのソフトウェア会社・技術者が直面している問題を扱っているので、
ソフトウェア会社の経営者、管理者、技術者にとっても参考になると思い、
第33号(2004年7月19日号)からは「まぐまぐ!」で一般の方々にも公開する
ことにしました。
「まぐまぐ!」での読者数は2007年1月19日現在、649名です。


本メルマガの内容に興味を持つであろう方をご存知なら、是非
本メルマガの存在を教えてあげてください。

(以下をそのまま転送するだけです。)
---------------------------------------------------
【お勧めメルマガ ソフトウェア業界 新航海術】
⇒ http://www.mag2.com/m/0000136030.htm または
 http://kei-it.tea-nifty.com/sailing/ または
 http://www.kei-it.com/sailing/ 
--------------------------------------------------

このメールマガジンは『まぐまぐ!』 http://www.mag2.com/ を利用して
発行しています。配信中止はこちら http://www.mag2.com/m/0000136030.htm
(但し、knextall@kei-it.com には直接配信しています。)


バックナンバーは、発行者サイトまたはブログで、体系として
見てもらいたいので、「まぐまぐ!」でのバックナンバー公開は
最新号のみとなっています。

バックナンバーブログ:http://kei-it.tea-nifty.com/sailing/
発行者Webサイト: http://www.kei-it.com/sailing/
(発行者Webサイトではバックナンバーの全文検索も可能です。)


☆筆者の趣味のブログ:身近にいる小動物の図鑑☆
 http://kei-it.tea-nifty.com/small/

--------------------------------------------------
発行:
株式会社 慶
 代表取締役 蒲生 嘉達

☆ コピーや配布をされる時はご一報ください ☆

|

January 01, 2008

インスタンスという仕組みが画期的である理由

**************************************************************
_/_/_/_/_/_/_/ ソフトウェア業界 新航海術 _/_/_/_/_/_/_/_/_/
**************************************************************
第197号 2008/1/1
▼ まえがき
▼ [オブジェクト指向再入門] (1)広く深く浸透するOOP
▼ [オブジェクト指向再入門] (2)「まとめて、隠しす」はCでもできる
▼ [オブジェクト指向再入門] (3)「たくさん作る」はOOP特有の機能
▼ [オブジェクト指向再入門] (4)Cで同様の処理を書く場合
▼ [オブジェクト指向再入門] (5)インスタンスが画期的な理由
▼ [オブジェクト指向再入門] (6)現実の事象を表現できる
▼ 次回以降の予告


*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
まえがき
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

蒲生嘉達(がもうよしさと)です。

明けましておめでとうございます。

このメルマガ執筆中に初日の出を迎えました。
 初日の出の写真:
 http://kei-it.tea-nifty.com/small/2008/01/2008_32ce.html

今年も宜しくお願いいたします。


普通はここで年頭らしい話をするのでしょうが、それは次回以降に
回して、今日はオブジェクト指向プログラミングについて語ります。


「オブジェクト指向プログラミング」は本文では「OOP」と略します。
英語の'Object Oriented Programming'の略です。

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (1)広く深く浸透するOOP
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

私が実際に本格的にコーディングしたことのあるプログラミング言語
はCのみです。JavaなどのOOP言語のコーディング経験はありません。

OOPについて、本メルマガでは過去に第5号で解説したことがあります。

 第5号:オブジェクト指向プログラミング
 http://kei-it.tea-nifty.com/sailing/2004/01/post_3571.html
 http://www.kei-it.com/sailing/05-040105.html


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月中旬です。

乞うご期待!!

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
本メルマガについて
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

本メルマガは2003年12月8日に創刊されました。
創刊号 http://www.kei-it.com/sailing/01-031208.html で述べたとおり、
本メルマガのコンセプトは「読みものとしても面白い慶の事業計画」であり、
目的は「事業計画の背後にある基本的な考え方を語ること」です。

したがって、第一の読者としては、慶の社員(正社員・契約社員)及び
慶と契約している個人事業主を想定しています。

また、多くのソフトウェア会社・技術者が直面している問題を扱っているので、
ソフトウェア会社の経営者、管理者、技術者にとっても参考になると思い、
第33号(2004年7月19日号)からは「まぐまぐ!」で一般の方々にも公開する
ことにしました。
「まぐまぐ!」での読者数は2007年12月31日現在、650名です。


本メルマガの内容に興味を持つであろう方をご存知なら、是非
本メルマガの存在を教えてあげてください。

(以下をそのまま転送するだけです。)
---------------------------------------------------
【お勧めメルマガ ソフトウェア業界 新航海術】
⇒ http://www.mag2.com/m/0000136030.htm または
 http://kei-it.tea-nifty.com/sailing/ または
 http://www.kei-it.com/sailing/ 
--------------------------------------------------

このメールマガジンは『まぐまぐ!』 http://www.mag2.com/ を利用して
発行しています。配信中止はこちら http://www.mag2.com/m/0000136030.htm
(但し、knextall@kei-it.com には直接配信しています。)


バックナンバーは、発行者サイトまたはブログで、体系として
見てもらいたいので、「まぐまぐ!」でのバックナンバー公開は
最新号のみとなっています。

バックナンバーブログ:http://kei-it.tea-nifty.com/sailing/
発行者Webサイト: http://www.kei-it.com/sailing/
(発行者Webサイトではバックナンバーの全文検索も可能です。)


☆筆者の趣味のブログ:身近にいる小動物の図鑑☆
 http://kei-it.tea-nifty.com/small/

--------------------------------------------------
発行:
株式会社 慶
 代表取締役 蒲生 嘉達

☆ コピーや配布をされる時はご一報ください ☆

|

January 05, 2004

オブジェクト指向プログラミング

******************************************************************
_/_/_/_/_/_/_/_/_/ ソフトウェア業界 新航海術 _/_/_/_/_/_/_/_/_/_/
******************************************************************
第5号 2004/1/5
▼ まえがき
▼ オブジェクト指向プログラミングとは
▼ オブジェクト指向言語とは
▼ オブジェクト指向プログラミングの普及速度は遅かった
▼ オブジェクト指向プログラミングの普及速度が遅かった原因
▼ オブジェクト指向プログラミングのまとめ
▼ 次回以降の予告

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
まえがき
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
蒲生嘉達です。
明けましておめでとうございます。
本年も宜しくお願い致します。

前号では、全ての創作活動と同様にシステム開発にも
下記の二種類の困難が伴うことを述べました。
・媒体に表現することの困難さ
・構想を生み育てる困難さ

そして、OS、高級言語、UNIXは、媒体に表現することの
困難さを除去するための技術であることを説明しました。

今週号では、オブジェクト指向プログラミングについて
本メルマガ流に多少の独断も交えて解説します。


*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
[5年後、システム開発の仕事はどのようになっているか?]
 オブジェクト指向プログラミングとは
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*

第1号で、高級言語の発明がプログラマの構想を表現する
ことを飛躍的に容易にしたということを記しました。
「変数」「配列」「サブルーチン」「関数」等の扱いやすい
概念や、「選択」「反復」などの制御構造は高級言語により
提供されたものです。

しかし、単純な数値計算ならまだしも、複雑な業務
アプリケーションを作成しようとすると、従来の高級言語が
提供する仕組みだけでは力不足です。

現実世界は多様な事象からなり、且つ、その事象は互いに
複雑な関連性をもっています。
そして、プログラマが実現したい構想は現実世界を抽象化した
概念を部品として生まれます。

オブジェクト指向プログラミングとは、高級言語の文
よりももっと大きな単位の抽象化レベル、すなわち
プログラマの構想に近いレベルでプログラミング
することです。
構造化プログラミングに比べて、より人間の構想を
模倣しようとする表現技術です。

したがって、オブジェクト指向プログラミングも
表現の困難さを除去する技術です。


*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
[5年後、システム開発の仕事はどのようになっているか?]
 オブジェクト指向言語とは
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*

上記の説明で明らかなとおり、オブジェクト指向の要求は
ごく自然なものであり、オブジェクト指向プログラミングに
オブジェクト指向言語は必須ではありません。

RDBMSのテーブル設計とは、現実世界から類似した事象(object)、
その属性(attribute)、単独の事象(instance)を抽出する作業です。
また、構造化プログラミング言語でも、ライブラリ化によって
(モジュール化ときれいなインタフェースという意味で)
カプセル化に近いことは行なわれてきました。

オブジェクト指向言語は、カプセル化、抽象データ型、継承
というオブジェクト指向プログラミングの手法が、あらかじめ
言語仕様に組み込まれている言語であり、その言語を
使用することによりオブジェクト指向プログラミングを徹底
させることができます。


*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
[5年後、システム開発の仕事はどのようになっているか?]
 オブジェクト指向プログラミングの普及速度は遅かった
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*

オブジェクト指向プログラミングの普及は急速なものでは
ありませんでした。
1970年代後半には既にオブジェクト指向言語であるSmalltalk
が開発されていますが、オブジェクト指向言語の本格的普及は
2000年以降のJavaの急速な普及を待たなければなりませんでした。
データベースの世界では、オブジェクト指向データベースは
今でもマイナーです。

構造化プログラミングと比較するとその普及速度の遅さは
際立ちます。

構造化プログラミングがダイクストラによって提唱されたのは
1970年頃で、1980年代前半には広く普及していました。
COBOLにも構造化という考え方が取り入れられ、構造化COBOLは
大規模な業務アプリケーションでは最も標準的なプログラミング
言語となり、現在にいたっています。
オブジェクト指向COBOLも作られましたが、ほとんど使われていません。


*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
[5年後、システム開発の仕事はどのようになっているか?]
 オブジェクト指向プログラミングの普及速度が遅かった原因
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*

何故オブジェクト指向プログラミングは構造化プログラミング
ほどには熱狂的に受け入れられなかったのでしょうか?

(1)プログラマの再教育のコスト
オブジェクト指向言語によって構文上の記述を節約
できることは明らかです。保守性、拡張性の向上も明らかです。
しかし、上述のとおり、オブジェクト指向プログラミングは
構想に近い部分の表現技術なので、発想の転換が求められ、
そのためプログラマの再教育が必要となります。
そのコストも採用を遅らせる原因となりました。

(2)効果が劇的でない
もしもRDBMSの理論どおりデータベースが適切に設計されており、
構造化プログラミングによりモジュール化ときれいな
インタフェースが実現されていたなら、言語を従来の構造化
言語からオブジェクト指向言語に切り替えることによる
メリットは劇的なものとは言えません。

オブジェクト指向の効果が薄いというよりも、データベース
設計とモジュール化の過程で既にオブジェクト指向的
考え方(高レベルな表現)が入り込んでいるが故に
オブジェクト指向言語に切り替えても効果は劇的とならないと
いうほうが正確です。

オブジェクト指向COBOLが普及しない理由は、構造化COBOLを
オブジェクト指向COBOLに変える必要性を誰も感じないからです。


(3)再利用は現実には難しい
また、オブジェクト指向言語が重視している部品の再利用と
いうことが、下記の理由によってなかなかうまくいかないと
いう点もあげられます。
・再利用可能な部品を作成することは一回切りの部品の
 作成よりもはるかに労力がかかります。
・ツールは機能が豊富になるほど学習に時間がかかります。
 それと同様に再利用可能と思われる部品が増えれば、学習
 時間が増えてしまいます。


*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
[5年後、システム開発の仕事はどのようになっているか?]
 オブジェクト指向プログラミングのまとめ
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*

たとえ普及に時間がかかったとしても、オブジェクト指向
プログラミングは表現技術の必然的な進歩であり、
最近話題となる新しい技術の多くはオブジェクト指向
プログラミングを前提としています。

オブジェクト指向プログラミングの基本的な手法は
カプセル化と再利用です。
カプセル化による情報隠蔽は表現のレベルを上げる
最良の方法であり、再利用も注意深く行なわれるなら、
すばらしい成果を期待できます。


*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
次回以降の予告
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
1/12 
 1/19 ?
次号は、1月12日発行予定です。乞うご期待!!


--------------------------------------------------
発行:
株式会社 慶
 代表取締役 蒲生 嘉達
y_gamou@kei-ha.co.jp http://www.kei-ha.co.jp


|