ちょっとしたプログラムの書き方について(ガード節、ネスト、戻り値)
下記のようなメソッドの作成依頼を引き受けたとします。
▼依頼内容
/**
* 引数が2023以上の場合にtrueを返却する。
* @param year 西暦
*/
メソッド:public boolean checkYear(String year)
上記のメソッド作成して欲しいです。
引数がNULLだったり、数値以外の場合はFlaseを返却してください。
依頼内容に基づいて例えば下記のように作成したとします。
/**
* 引数が2023以上の場合にtrueを返却する。
* @param year 西暦
*/
public boolean checkYear(String year){
// 戻り値のデフォルトにfalseを設定する。
boolean retVal = false;
System.out.println( "checkYear 引数 : " + year );
if(year != null){
//引数がNULL以外
System.out.println("引数がNULL以外");
if(!year.isEmpty()){
//引数が空白ではない
System.out.println("引数が空白ではない");
try{
// 引数を数値に変換する
System.out.println("引数を数値に変換する");
int nYear = Integer.parseInt(year);
if(nYear >= 2023){
// 値が2023以上の場合
System.out.println("値が2023以上の場合");
retVal = true;
}
}
catch(NumberFormatException e){
// 変換に失敗
System.out.println("数値変換に失敗");
}
}
}
// 判定結果を返却する。
return retVal;
}
実行してみると下記のようになり、依頼通りの処理となっていることがわかります。
▼実行内容
System.out.println("checkYear 実行 ============");
System.out.println("== NULL ==");
System.out.println( checkYear(null) );
System.out.println("== 空白 ==");
System.out.println( checkYear("") );
System.out.println("== 数値以外 ==");
System.out.println( checkYear("a") );
System.out.println("== 2023未満 ==");
System.out.println( checkYear("2021") );
System.out.println("== 2023以上 ==");
System.out.println( checkYear("2023") );
System.out.println("");
▼実行結果
checkYear 実行 ============ == NULL == checkYear 引数 : null false == 空白 == checkYear 引数 : 引数がNULL以外 false == 数値以外 == checkYear 引数 : a 引数がNULL以外 引数が空白ではない 引数を数値に変換する 数値変換に失敗 false == 2023未満 == checkYear 引数 : 2021 引数がNULL以外 引数が空白ではない 引数を数値に変換する false == 2023以上 == checkYear 引数 : 2023 引数がNULL以外 引数が空白ではない 引数を数値に変換する 値が2023以上の場合 true
上手くできていますが、下記のように書くこともできます。
/**
* 引数が2023以上の場合にtrueを返却する。
* @param year 西暦
*/
public boolean checkYear(String year){
System.out.println( "checkYear 引数 : " + year );
// NULLチェック
if(year == null){
System.out.println(" 引数がNULLのためfalseを返却");
return false;
}
// 空文字チェック
if(year.isEmpty()){
System.out.println(" 引数が空白(空文字)のためfalseを返却");
return false;
}
try{
// 引数を数値に変換する
int nYear = Integer.parseInt(year);
if(nYear >= 2023){
// 値が2023以上の場合
System.out.println(" 値が2023以上のためtrueを返却");
return true;
}else{
System.out.println(" 値が2023未満のためfalseを返却");
return false;
}
}
catch(NumberFormatException e){
// 変換に失敗
System.out.println(" 数値変換に失敗したためfalseを返却 引数 : " + year);
return false;
}
}
こちらも、依頼通りの処理となっていることがわかります。
▼実行内容
System.out.println("checkYear(改善版) 実行 ============");
System.out.println("== NULL ==");
System.out.println( checkYear(null) );
System.out.println("== 空白 ==");
System.out.println( checkYear("") );
System.out.println("== 数値以外 ==");
System.out.println( checkYear("a") );
System.out.println("== 2023未満 ==");
System.out.println( checkYear("2021") );
System.out.println("== 2023以上 ==");
System.out.println( checkYear("2023") );
System.out.println("");
▼実行結果
checkYear(改善版) 実行 ============ == NULL == checkYear 引数 : null 引数がNULLのためfalseを返却 false == 空白 == checkYear 引数 : 引数が空白(空文字)のためfalseを返却 false == 数値以外 == checkYear 引数 : a 数値変換に失敗したためfalseを返却 引数 : a false == 2023未満 == checkYear 引数 : 2021 値が2023未満のためfalseを返却 false == 2023以上 == checkYear 引数 : 2023 値が2023以上のためtrueを返却 true
異常の場合、その時点でreturnする処理(ガード節)を入れることで、カッコの数が少なく(ネストが浅く)なりソースコードが読みやすくなったと思います。
また、戻り値を変数(boolean retVal)で管理しないようにしているため、どこで何を返却しているのか分かりやすくなったと思います。
どちらの書き方がお好きですか?