まだ、動いてなかったりするんですが、若干、逃避も込めて、大規模改修してみました。6,000行ぐらいだといじりやすいんだよな。商売のソフトじゃないし、結局、一人で書いていたりするから、やり放題だ。
[でかいクラスの分割]
extends で分けるか、instance変数として持ってしまう。extends で相互参照するには、自分自身をsuper classに引き渡してやれば良いんだが、ちょっと技巧的すぎる感じ。ちゃんと分離するには、結構、考えないとだめ。大きく二つに分けるより、細かく削っていった方が良いらしい。
[packageの整理]
guiはguiでまとめる。一つのclassしかないpackageは消すとか。でも、ファイルの移動になるので、CVSでは、対処できない。いや、Repository側でmoveしてやれば良いんだが。これをやると、「使ってないクラス」ってのを見つけることが多い。
[castをabstractにする]
abstract class は、あんまり好きじゃないです。でも、似たよなclassをまとめるには、interface より便利。interface onlyで書いても良いのだが、method/accessorが増えるので。state pattern とか、command pattern だと、abstract class が正しい気がする。cast が減るのがメリットか。
[public/private/protected/default]
Java で一番嫌いなのがこれ。EclipseでRefactoringすると、protectedとかが良く出る。全部、publicで良いじゃん。final が付いていて、上書き拡張出来なかったりすると、どうしようもないとか... 人間が区別するものではないと思う。動いているプログラムから、自動的に、minimum な状態を判断して、privateとかを付けるぐらいで良いんじゃないか? private からpublicに変更するのが、Eclipse でも一番多い quick fix だと思う。
一方で、@Override は便利。Javaだと、どうしても「あ、そっちを呼んで欲しいんじゃないのに〜!」ってのがあるからなぁ。
うっかり、privateなfieldとかがって、一つのinstanceに同じ変数名が複数とかを見ると、%s/private/public/ したくなります。
Cだと、結構、真面目に static を付けまくるのだが、Java だと、大抵、public って書くな。C++ で、それをやるとコンパイルが地獄のように遅くなったりするけど、Java は、そんなことないし。不要なコードを判定できないってのが欠点なんだけど、それはツールでやるべきなんじゃないのか? Eclipse のプラグインぐらいありそうだけど、取り敢えず comment してみて赤くならないかぐらいのチェックでも十分。やっぱり、privateなんて、いらないです。
Cで、それをやると、名前空間が一つしかないのではまります。なので、Cでは、真面目にstatic を付けているのだと思う。C は、default static にするべきだと思う。
[static]
これがあるから、Cっぽく書いちゃう人が多い。singleton pattern では、必須だけど、それ以外は必要ないと思う。Factoryはstaticが楽ではあるんだが。定数を、static final で書くのも微妙。
[Generic]
1月あたりにはまりまくったので、最近は、minimumに使ってます。Map/Set にしか使わないってのが正解な気がする。Generic を変数のまま継承するのは難しすぎると思う。特に、static が混じっている Generic は最低。
static Singleton<Hoge> singleton = new Singleton<Hoge>();
が出来ないってのは気持ちはわかるけど、不便ではある。結局、base level では、Generic は具体的なクラスを書いてしまうってのが実用的だと思う。で、singleton は base level でしか使わないってことらしい。Generic を維持してdouble check pattern とかを使うより、やっぱり、Generic を外す/固定する努力をするべきだろうと思う。