| 著作一覧 |
ついにバッティングが明らかになってこちら立てればあちらが立たずで帰りが遅くなる日がこれで2日目。しかし明日を乗り切ればおしまいだと勝手に決めているので、まあ良いか。
今日の教訓。
public foo(bar, baz) {
super.foo(bar, baz); // 忘れても気付きにくく忘れるととっても困る
...
}
教訓というほどのことでも無いのだが久々にこれで1時間潰した。これがまた、あまりにもどうでも良い処理だったため(デバッグフラグの設定)にJUnitで検証していなかったという罠。しかし、まさにデバッグしようという時にこのバグのためにとても困ったのであった
今日の教訓の2。
A extends B, B extends Cという関係が成立しているところに、Bの兄弟が欲しくなり、Bを汎化してB extends B', B' extends Cとし(これによりB_brother extends B'可能となる)た場合に、肝となるメソッドが
protected void foo() {
aaaaaa;
try {
bbbbb;
ccccc;
} catch (Exception e) {
ddddd;
} finally {
eeee;
}
}
な場合に、
protected void foo() {
aaaaaa;
try {
foofoo();
} catch (Exception e) {
ddddd;
} finally {
eeee;
}
}
// これが欲しくて汎化させた
protected void foofoo() throws Exception {
bbbbb;
ccccc;
}
とすると、実は
bbbb ... bar.open(); eeee ... bar.close();
だったりすると、切り出したメソッドfoofooのbarに対する対称性が著しく欠けることになる。かくして、B_brotherでは見事にbar.open();を呼び忘れてはまること約10分(汎化作業に時間がかかった分だけすごくうんざり)。
#これの教訓は、後付けの汎化だと容易に対称性が悪いテンプレートメソッドが生まれるということ。常に切り出すメソッドはリソースの確保(open、newなど)と解放(closeやdestroyなど)を両方含むか、両方外すかでなければならない。
るいもさんとのJava本です。
SEshop(こっちはちょっぴりだけど内容紹介文もある)。
4つの領域(開発前、実装、テスト/チューニングなど、設計――実装設計のほう)に分けて、簡単なことから複雑なことまで、いろいろなノウハウやチップス(や必要に応じて原則論も)を詰め込めるだけ詰め込んでみました。原則論もあるが、オルターネイティブについても書いてあったりするので、右も左もわからない初心者用ではありません。でも初心者が脱初心者を目指して実装設計=実装(を、ついに等号で結んだな)を考えるための良きガイドにはなることは意識しているわけですが、位置的には中級本といった感じかな。まあ、この日記の3月から4月あたり(に執筆してた)にメモしたりしているようなことをまとめていたりもするので、大体の雰囲気や考えていることはわかるかも知れません。
個人的にはるいもさんのマルチスレッドバナナの叩き売りがお気に入り。
自分の書いたパートでは多値を例にしてTell Don't Askに繋げているやつが結構気に入ってます(追記:が、まさにこのパートにポカがあって正誤が入ったりしてるのがシオシオなんだな……)。
ジェズイットを見習え |