![]() |
[1998 年 11 月号] |
[Happy Squeaking!!]
1.はじめに
1.2 なぜ Smalltalk?
1.2.1 Simple and Pure
例えば、C++をオブジェクト指向の入門に使用すると、まず突き当たるのはその言語仕様の複雑さです。C++は手続き指向の言語であるCとの互換性を保つことを強いられたので、オブジェクト指向の本質とはあまり関係のない部分が多く言語仕様に入り込み、習得のし難い言語になってしまっています。(このように手続き指向をオブジェクト指向に拡張し、両者の概念の混在する言語をハイブリッド系OO言語といいます)。またC++のようなハイブリッド系言語は、手続き指向でのプログラム作成が全く問題なく行えてしまうので、「C++を使用しているが、オブジェクト指向になっていない(ただのCプログラミングをしている)」ということが起こってしまいます。
更に、なんとかC++を使いオブジェクト指向の考えでプログラミングできるようになったとしても、言語の性質上、メモリ管理の問題が常につきまとうことになります。もともとオブジェクト指向は、システムにまつわる問題を抽象的に捉えられるところに利点があり、メモリ管理といった低レベルの部分はなるべく気にせずに、アプリケーションドメインといった上位の概念に注目したいはずです。C++ではメモリ管理をみずから行わなければならないため、アプリケーションに本質的な処理と、単なるメモリ管理の処理が入り交じり、コード自体を非常にわかりにくくする側面があります。また人間の手によるメモリ管理は、必ずといっていいほどメモリリーク現象を引き起こします。このために、「あまり多くのオブジェクトを用意しないようにしよう」という考えが働くようになり、設計上は分離されていたはずのクラスが実装時に安易に合成され、奇麗なオブジェクト指向設計をくずしてしまうこともあります。
一方Javaはどうでしょうか。Javaはかなり奇麗にオブジェクト指向の考えを実現しているといえますが、数値や配列などの「基本データ型」はオブジェクトではありません。そのために「全てを統一的にオブジェクトとして扱えるはず」というオブジェクト指向の原則に合致せず、やはり不自然なコードを書かねばならない場面がでてきます。
例としてJavaでは、「何でも入れてしまえる順番つきの入れ物」を表すのに、Vectorというクラスが用意されています。このVectorに物をいれるときに、基本データ型が混ざっていると以下のようなコードを強いられます。
Vector ve = new Vector(); // 入れ物 Vector ve2 = new Vector(); // 入れ物の中に入る入れ物 ve.addElement(ve2); // ve2をve1に入れる (これはOK) ve.addElement(new Integer(1)); // 数値をいれるときはInegerに変換 ve.addElement("hello"); //文字列は基本データ型ではないのでこれでOK ve.addElement(new Character('a')); // 文字は基本データ型なのでCharacterに変換
なぜ、以下のようにすっきりと書けないのでしょう。
//全てをオブジェクトとして統一的に扱う。 ve.addElement(ve2); ve.addElement(1); ve.addElement("hello"); ve.addElement('a');
また、Vectorから物を取り出すときも、基本データ型かどうかを強く意識する場面がでてきます。
Enumeration enu = ve.elements(); while(enu.hasMoreElements()){ Object o = enu.nextElement(); //ここまでは統一的。要素を取り出している。 }
ところが、実際にその値を使うときには、以下のような形で変換が必要になります。
if(o instanceof Integer){ int i = ((Integer)o).intValue(); //Integerをもとの基本データ型に戻す } else if( o instanceof String){ String s = (String)o; //ObjectをもとのStringにダウンキャストする。 } else if ( o instanceof Character){ char c = ((Character)o).charValue(); //Characterをもとの基本データ型に戻す。 }
このようにif文でそのオブジェクトが実際に何者かを判断して、基本データ型か、そうでないオブジェクト型かによって処理を分けるというのは、非常に不自然なやり方と感じられないでしょうか。本来オブジェクト指向とは、オブジェクトがある程度インテリジェンスな振る舞いを持ち、使用する側では意識しなくとも、そのオブジェクトの特性に応じて処理を行ってくれるもののはずです。なぜ、アプリケーション開発者の側で、「これは基本型だから」「これはオブジェクト型だから」といちいち考えていなければならないのでしょう。
ところがSmalltalkでは、このような妥協、不自然な部分はみられません。
文法は、オブジェクト指向の実現に不可欠な部分のみを含み、非常に簡潔にまとまっています。習得に一日もかからないでしょう。メモリ管理は自動で、複雑なオブジェクトを万のオーダで作成しても、メモリリークにおびえる心配もありません。キャストの必要もなく、全てがオブジェクトという概念世界が、非常に忠実に表現されています。
© 1999-2001 OGIS-RI Co., Ltd. |
|