さて、、次のjavaのコードを見て貰いましょう。
mainでほぼ同じ処理を2回しています。
違いは呼び出しているメソッドがtest1,test2と違うだけ。
そしてtest1,test2の違いはメソッド内の最初の行だけです。
結果を受け取った後に戻り値を更新しています。
その後、fooXの値を2行ずつ出力していますが何が出力されるか分かりますか?
public class Test {
public static void main(String[] args) {
Test test = new Test();
Bar bar1 = new Bar(100, "abc");
Foo foo1 = new Foo(bar1);
Bar ret1 = test.test1(foo1);
ret1.i = 10000;
ret1.s = "ABC";
System.out.println(foo1.bar.i); //1回目処理の出力1
System.out.println(foo1.bar.s); //1回目処理の出力2
Bar bar2 = new Bar(100, "abc");
Foo foo2 = new Foo(bar2);
Bar ret2 = test.test2(foo2);
ret2.i = 10000;
ret2.s = "ABC";
System.out.println(foo2.bar.i); //2回目処理の出力1
System.out.println(foo2.bar.s); //2回目処理の出力2
}
public Bar test1(Foo foo) {
Bar bar = new Bar(foo.bar.i, foo.bar.s);
// ここでいろんな処理
return bar;
}
public Bar test2(Foo foo) {
Bar bar = foo.bar;
// ここでいろんな処理
return bar;
}
}
class Foo {
Bar bar;
public Foo(Bar bar) {
this.bar = bar;
}
}
class Bar {
int i;
String s;
public Bar(int i, String s) {
this.i = i;
this.s = s;
}
}
答えはこうです。
100 abc 10000 ABC
コードのどこを見てもfooXの更新なんてないですね。でも値は変わります。
test1とtest2で違いが出る理由が分からなかった人はもう少し頑張りましょう。
そして分かった人もtest2のようなメソッドは書かないようにしましょう。
test2メソッドを書いた人はjavaを理解していないか、
保守を全く考えていないか、
小さいプログラムしか書いたことが無いかの三択でしょうか。。
エンハンスやバグ修正などでfooXの更新場所を探さないといけなくなったらどうするんでしょうか。。
test2のようなのがあると機械的に探すのがほぼ不可能です。
こんなじゃTDDだってできないだろうに。。