« February 2008 | Main | April 2008 »

March 2008

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 2008 | Main | April 2008 »