近頃版/another blog@hatena/Wiki/BBS
< {Game}人の限界とゲーム・追加思索メモ | {BoardGame}鷲巣麻雀牌と妖精奇譚 >
近隣の席に近ごろJavaの仕様にあの手この手でやられている同僚様がおられる。その同僚様とあれこれ話していたときの俺の結論:
_いろいろ文句を言われそうなことを書いているという自覚はあるので解説。
世で一般に言われているオブジェクト指向とは、実際にはクラス指向と呼ばれるべきものである。Javaは「オブジェクト指向言語」というよりは「型指向言語」「クラス指向言語」という方がより適切にその指向を表現しているように思う。
そもそも(真の)オブジェクト指向においては、型による引き数の制約をかけるべきではない。仮に型付けがあるとしても、厳密で静的な(C++やJava的な)型ではなく、もっとソフトな型付けであるべきだろう。具体的には、「所定のメソッドと所定のデータフィールドを持つオブジェクト」を全て包含できるソフトな「型」こそが(真の)オブジェクト指向には向いている。
_静的な型付けやクラス指向が悪いとは言っていない。Javaが多重継承を排除したという決断もそんなに間違っているとは思わない。むしろ(作るもの/作り方によっては)それらはとても良い手助けになる。だがしかし、その結果でき上がったC++やらJavaやらはやはり静的で型/クラス指向な言語であり、(真に)オブジェクト指向らしい振るまいを記述したいと思ったとき、仕様の壁にぶち当たって仕方なくバッドノウハウでこれを実現することになってしまう。STL等のテンプレートは一部への解決手段であるが、本質的には解決できない。というか、そのへんのバッドノウハウ化は言語設計時の思想に起因して発生する問題なので、そもそも解決すべき問題ではない。
じゃあ何を使えばそのバッドノウハウ化を防げるのよ、と言われるときっと答に窮することだろう。結局何を選んでも継続的にいじるなら継続的なリファクタリングが必要になるわけで、全部把握してリファクタリングする覚悟があるならなんでもいいんじゃないの、と思う。いや、向き不向きは考慮すべきだが。
_ところで話の発端になったその仕事、ご多分に漏れず同僚様はあくまでメンテナーでありオリジナルプログラムの作成者ではない(そして作成者は既に社にいない)のだ。というわけで納期と予算と理解の不足ゆえリファクタリングもままならないという手詰りっぷり。そもそも客が(検閲削除)なのだがそれはきっと政治層で解決すべき話なのだが、弊社内での政治的事情によりその層での解決もままならないというよくある不幸な話の典型なのであった。
以上、まとまらないままこの段終わり。
Wayne : つまりこの話から導き出される教訓は、「クラス指向言語」を使用して「オブジェクト思考」するな、ちゃんと「クラス思考」しろってことですね?
自分で言っててどこまでが冗談なのかわからん(笑)