Oh 脳《006》ハイブリッド車と Java の隘路

記事一覧Oh 脳: after ZERO《其之陸》

ハイブリッド車Java の隘路

《監修》小泉ひよ子とタマゴ倶楽部
第0版♪1998/09/01

赤いハイヒール, 1976

マニキュアの指 タイプライター
ひとつ打つたび夢なくしたわ


地球温暖化対策として、クリーンエネルギーの開発が脚光を浴びています。技術的には、高性能のバッテリーが開発され、伝統的なガソリン車に勝るとも劣らない性能を引き出すまでに至りました。しかし、価格的にはまだ、庶民が手の届く存在ではなく、ガソリンと併用できる「ハイブリッド」車が、過渡的な技術として普及しています。
開発コスト/工数削減の対策として、オブジェクト指向開発が脚光を浴びています。インターネット普及の追い風もあって、Java/C# などが広く利用されるまでに至りました。これらは純粋な OOP 言語ではありませんが、伝統的なプログラミングスタイルと併用できる「ハイブリッド」型 OOP 言語が、過渡的な技術として普及しています。
価格的な問題は棚上げにして、技術的な側面から電気自動車を眺めると、ガソリンエンジンなどの内燃機関を必要としないので、より性能を引き出す設計が可能です。むしろインフラ整備や維持コストなどの問題解決が、今後の普及の鍵になるとされています。
Java/C# に象徴される「ハイブリッド型」の OOP 言語では、純粋な OOP 言語のように「統一したフレームワークに沿ってコードを記述できない」という隘路を抱えています。その「弁慶の泣き所」たる「脛」の部分に相当するのが「組み込み型」の存在です。


... zap ...
「組み込み型」は first-class object ではなく、OOP の世界では「半人前」の扱いを受けます。そのため、OOP 言語としての脆弱さを露呈する場面が少なくありません。そこで、OOP に必須とされる最低限の機能の中から「1)情報操作、2)機能継承、3)ポリモフィズム」について、検証してみます。
1)情報操作については、他のクラスと同様に「組み込み型」にもメソッド呼び出しを適用できるかが鍵となります。残念ながら、Java ではそれを認めていません。C# でさえ、3.ToString() という「統一したフレームワークに沿ってコードを記述できる」のに、Java では 3.toString() ですらできないのです。
《Note》そのため、3)ポリモフィズムを適用するのが著しく困難になります。これと同じ滑稽さは「Oh 脳《027》錯覚:知識が邪魔をして見えなくなるもの - 続・ひよ子のきもち」に登場する小学生の逸話にも見られます。 □
2)機能継承については、他のクラスと同様に「組み込み型」から機能継承できるかが鍵となります。残念ながら、Java ではそれを認めていません。それを認めているもの(Python など)と比べて、冗長なコードを散在させて記述する羽目に陥り、メンテナンスの悪夢に魘されます。
《Note》メンテナンスの悪夢を回避するために、Jython を導入したようなものです。□
3)ポリモフィズムについては「switch 文の隘路」でも示したように、その条件式には任意のクラスのインスタンスを指定できないばかりか、他の「組み込み型」でさえ(整数型と可換でないものを)Java では指定できないのです。任意のオブジェクトを指定できるもの(Eiffel など)と比べて、その用途も限定されます。逆説的な表現をすると「ハイブリッド型」の OOP 言語にとって、switch 文は「必要悪」とも言えます。
《Note》(goto と同様)switch を封印できたなら、Java/C# も純粋な OOP 言語に仲間入りできるでしょう。□


... zap ...
それは「ハイブリッド型」の OOP 言語の特徴でもあり、ときにその脆弱さを露呈("GoF を反面教師に")します。半人前の存在でしかない「組み込み型」の存在が、一人前の存在である first-class object との「統一したフレームワーク」に沿った問題解決を困難にします。そのため、これらが出会う場面では、さまざまな不整合が起こり、簡潔で見通しの良いコードを記述するのが著しく困難になります。

その典型が「コンテナー問題」です。一人前の「オブジェクト」を対象とするコンテナーにとって、半人前の存在でしかない「組み込み型」とは距離を置いて付き合う必要があります。遅まきながら(C# に習って)autoboxing の機構が採用されましたが、それで本質的な問題が解消されたわけではないのも、周知の事実です。

過去の歴史が物語るように「未熟な言語仕様のツケ」を清算させられるのはいつも、プログラマーの役回りなのです。そして「歴史から何を学ぶか/学ばないか」は、受講者のみなさん次第です。□


《Tips》純粋な OOP 言語かどうかを見極める簡単な方法

オブジェクトが指定してあるところに、組み込み型を指定できますか。
組み込み型が指定してあるところに、オブジェクトを指定できますか。

これらの条件を満たさないと、組み込み型とオブジェクトとを協調させたい状況で、必ず不整合が生じます。前述した toString() などは、その典型です。first-class object なら、このような不整合を心配するには及びません。□

Last updated♪2009/12/01