Javaのサンプルコードから、引数を出力値として扱ってはいけないことを理解する
出力引数とは
以下のadd()
メソッドの引数sum
は、メソッド内部で値が変更されている
このように出力として用いる引数を出力引数と呼ぶ
public class Main {
public static void main(String[] args) {
int sum = 0;
add(3, 5, sum);
System.out.println(sum); // 出力結果: 8 ←だと思うじゃん?
}
public static void add(int a, int b, int sum) {
sum = a + b;
}
}
出力結果は8じゃない
Javaでは値渡しが採用されており、引数に渡した変数はsum
のコピーである
そのため、sum
にa
とb
の和を代入しても、main()
メソッド内部のsum
は変更されない
つまり、add()
メソッドの中でsum
変数に何を代入しても、main()
メソッド内部のsum
には影響せず、出力結果は0となる
引数は入力値として受け渡すべきである
引数を出力値として扱うと、想定していない挙動が起こる可能性が高まる
『良いコード/悪いコードで学ぶ設計入門』では、以下のように言及されている
引数は入力値として受け渡すのが普通です。このように出力値として扱ってしまうと、引数が入力なのか出力なのか、メソッド内部のロジックを読んで確認しなければなりません。メソッドの中身をいちいち気にしなければならない構造は、ロジックを読み解く時間をいたずらに増大させ、可読性の低下を招きます。1
参考文献
-
良いコード/悪いコードで学ぶ設計入門 p.70 ↩