ふ「で、前置きはおいといて、
U「まだ前置きでしたか…
ふ「改善したプログラムのコードには、こんなメソッドが出てきます。
public SimpleMatrix(int row, int column) {
values = new double[row][column];
}
(JAVA WORLD 2004年12月号、p.078 より引用。以降のプログラムも同じ)
U「コンストラクタですね。
ふ「これ自体は何も問題ないと思ったのですが、
まあ気になるかといえば、rowとcolumnの範囲はどうなのだ、
というあたりですね。
U「何か罠でもありましたか?
ふ「負の値は言語道断だとして、0が指定されたら何が起こるか、という話とか。
U「行や列の数が0の行列ってアリですか?
ふ「例の記事の少し前のところに、super(0, 0); というコードが出てくるのですよ。
つまり、0×0配列として初期化する、という話が。
U「Javaの配列の仕様的には、別にいいんじゃないですか、サイズが0でも?
ふ「サイズ0の配列を作るだけならいいですが、
改善したコードにはこんなメソッドがありますよ。
public int columnCount() {
return values[0].length;
}
ふ「というか、改善前もこのまんまですが。
U「java.lang.ArrayIndexOutOfBoundsException が出るのか。
ふ「教訓:境界条件はテストする。
U「境界というか、特殊条件ですね、0の場合をテストする、というのが定番。
ふ「まあそういう話ですが、ちなみに、メソッドの名前は基本的に動詞にする、
というのがこの特集記事の最初に出てきて、そうしないのは無知じゃ、
という話になっている。
U「それで?
ふ「だったら columnCount ではなくて、countColumn か、または
getColumnCount という名前じゃないのか、と突っ込みたい罠。
U「基本的というのだから、応用とかあるんじゃないですか?
ふ「そうきたか
U「というか、mやnという変数つかうナー、という話ありましたよね。
ふ「とりあえず、意味分からんからね。
U「だったら、こんなメソッドありますよね。
public double getValue(int i, int j) {
return values[i][j];
}
ふ「ありますが?
U「iとかjという変数名は使っていいのですか?
ふ「そりゃもう改善後のコードは
これまでに指摘してきた問題をどのようにして回避しているのかがおわかりいただけるはずです。
(p.078)
ふ「というモノですから、いいに決まってます。
U「こう書くべきではないのですか?
public double getValue(int row, int column) {
return values[row][column];
}
U「この方が分かりやすいでしょう。
というか、Eclipse でバルーンヘルプ出る時に
int arg0
とか出てきて、
なんじゃこりゃぁぁ、
と叫んでいたの誰でしたっけ?
ふ「まさか撃たれるとは思わなかったもので。
U「変数名に意味を持たせるのは基本ではないのですか?
ふ「Javaの世界ではスコープが狭い場合に変数を1文字にするのもよい、
というのが基本なのです。
ということが p.055 に書いてある。
U「でもメソッドの引数ってある意味無茶苦茶スコープ広いですよ?
ふ「外から見ればね。スコープというかどうか知らないけど。
U「変数に意味がなくてもいいのなら、こんなのもokなのですか?
public double getValue(int j, int i) {
return values[j][i];
}
ふ「ダメです。
U「iとjの順番が変わっただけでしょ、処理の内容は変わってないですよ。
それだけでダメなんですか?
ふ「ダメなんです。
U「なんで?
ふ「なんでも。
U「…
ふ「ループカウンタにはiという名前の変数を使うというのが伝統なんです。
常識です。
p.056 にも書いてあります。
U「でもこれ、ループじゃないですよ?
ふ「常識なんですっ!
U「…
U「まあそこは譲るとして、
ふ「譲る譲らないの問題ではありませんが、
それは置いといて、何でしょう?
U「良い名前を付けて意図を明確に、
というのは指針にもあるようだし、異論ないのですよね?
ふ「まあそんな所です。
U「とすると、改善後のプログラムには、こんなのが出てくるのですが、
throw new IllegalArgumentException("wrong dimension");
ふ「出てきますね、しかも、add と multiply の2箇所、
全く同じコードが出てきます。
U「これっていい名前なんですか?
ふ「といいますと?
U「illegal argument って、引数がヘンだ罠、って意味ですよね。
そりゃそうに違いないのですが、そっけないというか、
情報量少なくないですか? 単にエラーだと言ってるのとあまり変わらないみたいな。
ふ「そう言われてみればそうかも。
U「改善前は、
addとmultiply で別の例外が割り当てられていて、
どちらで例外が発生したか分かりやすかったのですが、
ふ「もっとも、両方とも wrong dimension という文字列を与えていましたね。
どちらかtypo のような気もしましたが。
U「確かに引数がヘンというのはヘンなのですが、
この場合は次元が不整合だというのが真相なのですから、
BadDimensionExceptionとか、
DimensionMismatchedException という名前の方がよさげ?
ふ「それもそうですが、
throw の時に指定する文字列も、
add の場合は not same size とかにして、
multiply の場合は、dimension mismatched にしてみるとか。
U「こだわりは分かりますが、英語としてどうかというのが謎。