前回:sinProject流システム開発のススメ #004 早めのreturn
前回まで利用していたcalcメソッドを税込金額を計算するメソッドに変更します。
- メソッドの名前を決めます。ここでは「getTotalCost」とします。
- 商品の価格を引数にするので、引数名は「price」にします。
- 小数点以下は切り捨てを行います。
- メソッドが正しい値を返すかをmainメソッドから呼び出してテストします。
シンプルに書くと以下のようになります。(コードを見る前に一度書いてみて下さい。)
[code lang=”java” collapse=”true”] package net.sinproject;/**
* sinProject流システム開発のススメ
* @author iam_o_sin
*
*/
public class Lesson {
/**
* 税込金額を計算します。小数点以下は切り捨てられます。
* @param price 税抜き金額
* @return 税込金額
*/
public static int getTotalCost(int price) {
int result = (int) (price * (1 + 0.05));
return result;
}
// …
public static void main(String[] args) {
System.out.println(getTotalCost(0));
System.out.println(getTotalCost(19));
System.out.println(getTotalCost(20));
System.out.println(getTotalCost(100));
}
}
[/code]
mainメソッドでは、価格として、0, 19, 20, 100 を与えました。テストを行う場合はゼロを使ったり、判定式や条件の境界値をを利用します。今回は消費税が1として計算される価格が20からですので、19や20をテストの値として利用しました。19という数値を与えると結果が19、20という数値を与えると結果が21となることが確認できます。
上記のコードでは、商品金額から税込金額を計算していますが、コードの利便性や可読性と保守性を向上させるために消費税額のみを計算するメソッドは別メソッドに抽出します。また「0.05」という数値は「消費税率」という意味のある数値ですので、名前を決めて定数化します。
これらを考慮すると次のようなコードになります。
[code lang=”java” collapse=”true”] package net.sinproject;// …
public class Lesson {
/** 消費税率 */
public static final double SALES_TAX_RATE = 0.05;
/**
* 消費税を取得します。
* @param price 価格
* @return 消費税額
*/
public static double getSalesTax(int price) {
return (price * SALES_TAX_RATE);
}
/**
* 税込金額を取得します。小数点以下は切り捨てられます。
* @param price 価格
* @return 税込金額
*/
public static int getTotalCost(int price) {
int result = price + (int) getSalesTax(price);
return result;
}
// …
public static void main(String[] args) {
System.out.println(getTotalCost(0));
System.out.println(getTotalCost(19));
System.out.println(getTotalCost(20));
System.out.println(getTotalCost(100));
}
}
[/code]
ソースコードの中では変数でも定数でもない文字列リテラルや数値リテラルは原則使わないようにして、定数宣言を行います。リテラルが増えると「この数値はなんだろう」と悩んだり考えたりしないといけない時間が増え保守性が低下します。ご注意下さい。
getSalesTaxメソッドは中身が1行だけしかなく計算も単純です。しかし、その計算や評価が2箇所以上で行われたり再利用の可能性がかなり高いのであればメソッド化します。また呼び出し元のコードが読みやすくすくなるのであれば、計算式や評価がたとえ1行でもメソッド化していきます。
定数にもドキュメンテーションコメント「/** <コメント> */」を記述します。こうすることで開発環境を使ってソース中の「SALES_TAX_RATE」にカーソルを合わせることで、記述したコメントを確認することができるようになります。もちろん、今回作成した「getTotalCost」メソッドや「getSalesTax」メソッドもドキュメンテーションコメントを書いているので呼び出し元のメソッド名にカーソルを合わせると説明を見ることが出来ます。
最後に、今回の内容をまとめておきます。
- メソッドで名は動詞から始まる英語にする。Camel形式にする。
- 変数名は意味のある分かりやすい名前にする。Camel形式にする。
- テストはゼロや境界値の価など、厳密に動作確認が行える価で行う。
- ソースコードの中に文字列リテラルや数値リテラルを原則使わない。可能な限り定数にする。
- 定数は英語大文字とアンダーバーと数字で構成する。
- メソッド抽出によるリファクタリングを行い利便性や可読性と保守性を向上させる。
- たとえ1行のロジックでもメソッドでも再利用されたり、呼び出し元のコードが見やすくなるのであればメソッド化する。
- 定数にもドキュメンテーションコメントを記述する。
弊社では、「さらに高みを目指したいエンジニア」を育てる環境を用意しています。
株式会社 #sinProject CEO/CTO
Twitterアプリ1位 #Tweecha2 企画制作
サービス・システム設計開発、コンサルタント
#sinPro式学習 #Svelte #TypeScript #Flutter #Dart #Java #HTML #CSS
#kimurakan ピアノ弾き語り