「Javaプログラミング能力認定試験課題プログラムのリファクタリングレポート」に触発されて

ryoasai さんの「Javaプログラミング能力認定試験課題プログラムのリファクタリングレポート」に触発されたので、
Java の勉強がてら、同様なプログラムを作成してみる。

Step 12 その1 (処理フローの制御)

こまごまと修正してみた。

処理フローを 制御する クラス
import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) {
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

            // 処理を選択して実行
            AbstractDispatcher ad = new SelectFunction();
            ad.run(reader);

            reader.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

処理フローを 制御する 抽象クラス

abstract class AbstractDispatcher {
    protected BufferedReader reader;
    protected boolean hasEndCommand = true;

    protected void run(BufferedReader reader) {
        this.reader = reader;

        while (true) {
            // 選択肢 を 表示
            beforeDisplayMenu();
            
            // 処理 を 選択
            String inputCode = printMenuAndWaitForInput();

            // 終了?
            if (isEndCommand(inputCode)) break;
            
            // 選択した処理 を 実行
            if (runFunction(inputCode)) break;
        }
    }

    // 選択肢 を 表示
    protected abstract void beforeDisplayMenu();

    // 処理 を 選択
    protected String printMenuAndWaitForInput() {
        String inputCode;
        try {
            inputCode = reader.readLine();

        } catch (Exception e) {
            e.printStackTrace();
            inputCode = null;
        }

        return inputCode;
    }

    // 終了?
    protected boolean isEndCommand(String inputCode) {
        if (inputCode == null) return true;
        if (!hasEndCommand) return false;
        return "E".equals(inputCode);
    }

    // 選択した処理 を 実行
    protected abstract boolean runFunction(String inputCode);
}

メニューを表示し、処理を選択させる

class SelectFunction extends AbstractDispatcher {
    // 選択肢 を 表示
    public void beforeDisplayMenu() {
        System.out.println("_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/");
        System.out.println("            人材管理システム");
        System.out.println("                メニュー");
        System.out.println("  [1].人材検索(S)");
        System.out.println("  [2].人材管理(JI:追加 JU:更新 JD:削除)");
        System.out.println("  [3].稼働状況管理(KI:追加 KD:削除)");
        System.out.println("  [4].終了(E)");
        System.out.println("_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/");
        System.out.println("どの機能を実行しますか?");
        System.out.print(" [S, JI, JU, JD, KI, KD, E]>");
    }

    // 選択した処理 を 実行
    public boolean runFunction(String inputCode) {
        if (inputCode.equals("S")) {
            // 人材検索処理
            AbstractDispatcher ad = new SelectSearchType();
            ad.run(reader);

        } else if (inputCode.equals("JI"))
            System.out.println("人材追加処理...\n");

        else if (inputCode.equals("JU")) {
            // 人材更新処理
            AbstractDispatcher ad = new InputJinzaiID();
            ad.run(reader);

        } else if (inputCode.equals("JD"))
            System.out.println("人材削除処理...\n");
        else if (inputCode.equals("KI"))
            System.out.println("稼働状況追加処理...\n");
        else if (inputCode.equals("KD"))
            System.out.println("稼働状況削除処理...\n");
        else 
            System.out.println("");

        return false;
    }
}