記事一覧 言語まとめ iosプライバシーポリシー

ちょっとしたプログラムの書き方について(ガード節、ネスト、戻り値)

下記のようなメソッドの作成依頼を引き受けたとします。

 

▼依頼内容

/**

 * 引数が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)で管理しないようにしているため、どこで何を返却しているのか分かりやすくなったと思います。

 

どちらの書き方がお好きですか?

 

個人制作アプリリリース中「TimePost」
Download on the App Store
個人制作アプリリリース中「UrlReader」
Download on the App Store