コンストラクタを愛せよ
もうみてらんない! っていうソースに出会ったので意気消沈。
public class abstract AbstractFooBar implements Bar { String id; String name; boolean autoHoge; ... public AbstractFooBar(int key) { this(false,key); } public AbstractFooBar(boolean autoHoge, int key) { switch(key) { case HOGE_KEY: this.id = "hoge"; this.name = "hoge"; break; ... } } public AbstractFooBar(boolean autoHoge, String id) { if( id.contains("hoge") { this.name = "hoge"; } else if( ... ) { } } } // 呼び出しているところ if( id.contains("bar") ) { return new AbstractFooBarImpl(BAR_KEY); } else if( id.contains("foo") ) { return new AbstractFooBarImpl(FOO_KEY); } else if( id.contains("hoge") ) { return new AbstractFooBarImpl(HOGE_KEY); } else if( ... ) { ... }
ぱっとみ、keyを与えられたらkeyからidを探して代入。
idを与えられたらnameを代入ってなってるんだけど……。
これを呼び出しているソースがひどい。
idを知っていて、そのidからkeyを求めてコンストラクタを呼び出している。
で、また中でkeyからidを呼び出す。keyは保持しない。
id知ってるんだからid渡せよ!
key使わないんならkeyからid求めるなよ!
とか、(ぼかしてあるので微妙ですが)ツッコミは色々あれど、
コンストラクタでごにょごにょしすぎじゃない?(意味ないじゃない?)
みたいな感じがして泣けてくる。
しかもこのclass、既存のクラスのコピペで99%(コンストラクタ以外)同じクラスが現存するし。(なのに継承してない)
適切なコンストラクタを定義するってそんなに難しいことかなぁ。
なんかつらい気持ちになってきた。
「コンストラクタを大事に」