変更に強いコードを書くための考え方を学びます
#目的ごとに変数を用意しよう
- 計算ロジックに意識が向き過ぎると変数名のことを忘れる
- 入力、処理、出力の役割ごとに変数名を使う (説明用の変数を導入)
-
一個の変数を使いまわさない
- ロジックを変更しにくい。長い目で見ると副作用が伴う
-
Immutableに書くことができる
- オブジェクトを更新せずに別の目的のオブジェクトが必要な時に新しいオブジェクトをつくること(Immutableなオブジェクト)
//目的ごとにローカル変数を使う
class Main {
public static void main(String args[]) {
int unitPrice = 1000;
int quantity = 3;
float tax = 10;
int basePrice = unitPrice * quantity;
int shippingCost = 0;
if (basePrice < 3000){
shippingCost = 500;
}
float basePriceWithTax = basePrice * (1+tax/100);
//NG例1.0になってしまう
//System.out.println((float)(1+10/100));
System.out.println(basePriceWithTax); //3300.0
//NG例 一個の変数を使いまわさない
//basePrice = basePrice * (1+tax/100);
}
}
#メソッドとして独立させよう
- 関連性のあるデータとロジックをメソッドに抽出
-
再利用/修正されることがあるかどうか考えよう
- ex: ShipppingCostの計算などは再利用されることがある機能
- 同じ機能のコードを何回もかくことがないようにしよう
- 複数箇所に渡って書いてしまうと変更時に回収できない
- 数値の直書きもよくない
- ロジックの中には固定値が入らないようにしよう
/*
point1:目的ごとにローカル変数を使う
point2:同じ機能のコードをメソッド化
point3:数値を固定値に(staticでいつでも参照できてfinalで変更できないようにする)
*/
public class Main {
//クラス変数は、インスタンス化された各オブジェクトから共通してアクセス可能
public static final int MIN_BASEPRICE = 500;
public static final int SHIPPING_COST = 500;
public static final int unitPrice = 1000;
public static final int quantity = 3;
public static final float tax = 10;
public static void main(String args[]) throws Exception {
/*非static変数(ンスタンス変数)はインスタンス固有の変数
int MIN_BASEPRICE = 500;
int SHIPPING_COST = 500;
int unitPrice = 1000;
int quantity = 3;
float tax = 10;
*/
var mainInstance = new Main();
var basePrice = mainInstance.run();
var shippingCost = mainInstance.getShippingCost(basePrice);
System.out.println("shippingCost " + shippingCost ); //shippingCost 0
/* 上記はこのコードと同じ
int basePrice = new Main().run();
int shippinigCost = new Main().getShippingCost(basePrice);
*/
/*非staticメソッドはインスタンスから呼び出さなくてはならない
error: non-static method getShippingCost(int) cannot be referenced from a static context
int shippinigCost = getShippingCost(basePrice);
*/
}
private int run(){
int basePrice = unitPrice * quantity;
float basePriceWithTax = basePrice * (1+tax/100);
System.out.println("basePrice "+ basePrice); //basePrice 3000
System.out.println("basePriceWithTax "+ basePriceWithTax); //basePriceWithTax 3300.0
return basePrice;
}
public int getShippingCost(int basePrice){
int shippingCost = 0;
if (basePrice<MIN_BASEPRICE){
shippingCost = SHIPPING_COST;
}
return shippingCost;
}
}