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

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

Step 16 その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 String run(BufferedReader reader) {
        this.reader = reader;

        String inputCode = "";

        while (true) {
            // 選択肢 を 表示
            if (!displayMenu()) break;

            // 処理 を 選択
            inputCode = acceptCode();

            // 終了?
            if (isEndCommand(inputCode)) break;

            // 選択した処理 を 実行
            inputCode = runFunction(inputCode);

            // 終了?
            if (isTerminate(inputCode)) break;
        }

        // 入力値を 返す
        return inputCode;
    }

    // 選択肢 を 表示
    protected abstract boolean displayMenu();

    // 処理 を 選択
    protected String acceptCode() {
        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);
    }

    // 終了?
    private boolean isTerminate(String inputCode) {
        if (inputCode == null) return true;
        return (inputCode.length() > 0);
    }

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

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

class SelectFunction extends AbstractDispatcher {
    // 選択肢 を 表示
    @Override
    protected boolean displayMenu() {
        System.out.println();
        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:追加 KU:更新 KD:削除)");
        System.out.println("  [4].終了(E)");
        System.out.println("_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/");
        System.out.println("どの機能を実行しますか?");
        System.out.print(" [S, JI, JU, JD, KI, KU, KD, E]>");
        return true;
    }

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

        } else if (inputCode.equals("JI")) {
            // 人材 追加処理
            AbstractDispatcher ad = new JinzaiAppend();
            ad.run(reader);

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

        } else if (inputCode.equals("JD")) {
            // 人材 削除処理
            AbstractDispatcher ad = new JinzaiDelete();
            ad.run(reader);

        } else if (inputCode.equals("KI")) {
            // 稼働状況 追加処理
            AbstractDispatcher ad = new KadouAppend();
            ad.run(reader);

        } else if (inputCode.equals("KU")) {
            // 稼働状況 変更処理
            AbstractDispatcher ad = new KadouUpdate();
            ad.run(reader);

        } else if (inputCode.equals("KD")) {
            // 稼働状況 削除処理
            AbstractDispatcher ad = new KadouDelete();
            ad.run(reader);

        } else {
            System.out.println("");
        }

        return "";
    }
}