Wednesday, 26 December 2007

Java の続き



結局、はまりまくってますが... Java って、自虐的なところがある。

Object 指向の abstract class、interface、Generic、inheritance とかは、結局、アルゴリズムとは関係ない「コードの整理整頓」に過ぎない。でも、そういう掃除をしているのも楽しいと言えば楽しいんだよね。

  A   →   B

  ↓      ↓

  A'  →   B'

まぁ、矢印は extends でも implements でも良いんだけど、このあたりの整合性を取るのは大変。「良い設計をすれば」とかいう幻想もあるけど、最適解は、どうせNP困難なんでしょ? 適当なところで妥協するものです。

Generic も面白いんだけど、どっかで止めなきゃならないのがめんどくさい。二重にInstanticate していますとか言われると、どこどう直せば良いのか途方にくれるけど。結局、Generic で受けた型を知らないオブジェクトは、左から右に手渡すしかない。いや、<Hoge extends Fuga> で受けても良いんだろうけどさ...

Polymorphism で、狙ったメソッドではなくて、違うメソッドに飛ばされるのがめんどくさい。

 class A extends B

で、

 void method(A x) in class A
 void method(B x) in class B

のどちらに飛ぶのかが良くわからない。@Override は付けてますが、

 void method(A x) in class B

とか書くと、確実に A の method が Bのmethod を Override するわけなんだけど、それは変だよね。

 class A' extends A implements B'
 interface B' extends B

とかだと、さらにわかりません。でも、class A implements B を extends したければ、どうしてもそうなると思うんだけど。なんか間違っているのかな。出来るようになっているわけなんだから、そういう使い方もあるんだろうけどさ... とか言いながら、適当にいじっていると、動くには動くんだよな。

Smalltalk/Squeak/Perl だと、とりあえず動かして、messageDoesNotUnderstand とか Faild to AUTOLOAD で、止まったところから書くなんていう技もある。ad-hoc だけど、それはそれで「最短で動く」。 Java だと、テスト駆動とか言っても、やっぱり、コードをこねくり廻している時間が長い。

No comments: