BMI を計算するメソッド
同じ式を 3 か所に書くと、直すのも 3 か所
税込の合計金額を出す場面を考えます。カートの画面、注文確認の画面、送信するメールの本文。この 3 か所で unitPrice * count * 1.1 と直接書いてしまうと、税率が変わった日に、この式を全部探し出して直すことになります。1 か所でも見落とせば、その画面だけ古い金額を出し続けます。
メソッドにしておけば、直す場所は 1 つです。
Java
public static double totalWithTax(int unitPrice, int count) {
return unitPrice * count * 1.1;
}計算式という知識が、プログラムの中に 1 つだけ存在している状態を作る。これが計算メソッドを書く一番の理由です。
表示するメソッドは、正しさを確かめられない
同じ計算でも、次のように書くと様子が変わります。
Java
public static void printTotal(int unitPrice, int count) {
System.out.println("合計は " + unitPrice * count * 1.1 + " 円です");
}計算と表示が 1 つのメソッドに同居しています。呼んでも手元には何も返ってこないので、テストから「答えが合っているか」を確かめる手段がありません。文言を変えたくなったときも、計算の入ったメソッドを触ることになります。
計算するメソッドは値を返すだけにして、表示は別のメソッドに任せる。こう分けておけば、税率を直す作業と文言を直す作業が、それぞれ片方に閉じます。
単位は、呼ぶ側とメソッドのどちらが持つか
計算メソッドを書くときに必ず決めることが、もう 1 つあります。受け取る値の単位です。
長さを受け取るメソッドなら、cm で受けるのか m で受けるのかを先に決めなければなりません。メソッドの中で 100 で割って変換する手もありますが、その瞬間そのメソッドは「計算する」と「単位を直す」の 2 つの仕事を抱えます。仕様が増えたときに、どちらの都合で壊れたのかが分からなくなるのはこういうときです。
単位を揃えるのは呼ぶ側に任せて、メソッドは公式だけを持つ。今回の課題もこの方針で作られています。仕事が 1 つに絞られたメソッドは短く、読めば意味が分かり、テストも 1 行で書けます。
単位を取り違えても、型さえ合っていればプログラムは動いてしまいます。落ちないぶん厄介で、答えの桁だけが静かにずれます。値がおかしいのにエラーが出ないときは、まず単位を疑ってください。
やってみよう
今回は、体重と身長から BMI を返すメソッドを書きます。身長は m 単位で渡される前提なので、メソッドの中で単位を直す必要はありません。戻り値は double です。
いきなり Java を書かず、まず BMI の求め方を日本語で 1 行にしてみてください。それをそのまま式に置き換えるだけで済みます。書けたら、身長を cm のつもりで渡すとどんな値が返るかも試しておくと、単位の怖さが実感できます。
要件
- Solution クラスに public static double bmi(double weight, double height) を実装する
- BMI = 体重 / (身長 * 身長) の公式を使って計算する
- 戻り値は double 型。身長は m 単位で渡される前提にする (cm 変換はメソッド内では行わない)
入出力例
bmi(60, 2) → 15
bmi(80, 2) → 20
bmi(50, 1) → 50
bmi(100, 2) → 25
bmi(18, 1) → 18