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

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

Step 17 その2 (人材検索)

処理フローを 制御する クラス (人材検索)

検索方法を選択

class JinzaiSearch extends AbstractDispatcher {
    // 選択肢 を 表示
    @Override
    protected void displayMenu() {
        System.out.println();
        System.out.println("検索方法を指定してください。");
        System.out.println("N->氏名から検索");
        System.out.println("T->業種から検索");
        System.out.println("E->人材検索終了(メニューに戻る)");
        System.out.print(" [N, T, E]>");
    }

    // 妥当な入力?
    @Override
    protected boolean isValid(String inputCode) {
        if (inputCode.equals("N")) return true;
        if (inputCode.equals("T")) return true;
        return false;
    }

    // 選択した処理 を 実行
    @Override
    protected boolean runFunction(String inputCode) {
        if (inputCode.equals("N")) {
            // 人材検索 呼び出し (氏名で検索)
            return true;

        } else {
            // 人材検索 呼び出し (業種で検索)
            return true;
        }
    }
}

検索 呼び出し (氏名で検索)

class InputSearchStrByName extends AbstractDispatcher {
    @Override
    public String run(BufferedReader reader, String inputCode) {
        hasEndCommand = false; // "E" で 終了しない
        return super.run(reader, inputCode);
    }

    // 選択肢 を 表示
    @Override
    protected void displayMenu() {
        // 氏名で検索
        System.out.println();
        System.out.println("氏名に含まれる文字列を指定してください。");
        System.out.print(">");
    }

    // 妥当な入力?
    @Override
    protected boolean isValid(String inputCode) {
        return true;
    }

    // 選択した処理 を 実行
    @Override
    protected boolean runFunction(String inputCode) {
        // 入力文字列で検索
        return true;
    }
}

検索 呼び出し (業種で検索)

class InputSearchStrByGyoshu extends AbstractDispatcher {
    private Repository<Gyoshu> gyoshuRepository;

    @Override
    public String run(BufferedReader reader, String inputCode) {
        // 業種一覧を作成
        gyoshuRepository = new Repository<Gyoshu>();
        gyoshuRepository.select("gyoshu.txt", false, new Matcher(null), Gyoshu.class);

        return super.run(reader, inputCode);
    }

    // 選択肢 を 表示
    @Override
    protected void displayMenu() {
        // 業種で検索
        System.out.println();
        System.out.println("業種を選択してください。");
        System.out.print(" [");
        System.out.print(gyoshuRepository.keySetToString());
        System.out.print(", E]>");
    }

    // 妥当な入力?
    @Override
    protected boolean isValid(String inputCode) {
        Gyoshu gyoshu = (Gyoshu)(gyoshuRepository.seek(inputCode));
        return (gyoshu != null);
    }

    // 選択した処理 を 実行
    @Override
    protected boolean runFunction(String inputCode) {
        // 業種で検索
        return true;
    }
}

検索結果 表示

class JinzaiKensaku extends AbstractDispatcher {
    private JinzaiListView jinzaiListView;

    @Override
    public String run(BufferedReader reader, String inputCode) {
        jinzaiListView = new JinzaiListView(jinzaiRepository);

        return super.run(reader, inputCode);
    }

    // 選択肢 を 表示
    @Override
    protected void displayMenu() {
        // 人材一覧 表示
        System.out.println();
        jinzaiListView.display();
        System.out.println();

        // 選択肢 を 表示
        System.out.println("P->前の10件");
        System.out.println("N->次の10件");
        System.out.println("E->検索一覧終了( 検索条件指定に戻る )");
        System.out.print(" [人材ID, P, N, E]>");
    }

    // 妥当な入力?
    @Override
    protected boolean isValid(String inputCode) {
        if (inputCode.equals("P")) return true;
        if (inputCode.equals("N")) return true;

        Repository<Jinzai> jinzaiRepositoryAll = new Repository<Jinzai>();
        jinzaiRepositoryAll.select("jinzai.txt", false, new Matcher(null), Jinzai.class);
        jinzai = jinzaiRepositoryAll.seek(inputCode);
        if (jinzai == null) {
            System.out.println();
            System.out.println("入力された人材情報は登録されていません。");
            return false; // [人材ID, P, N, E]に 戻る
        }
        return true;
    }

    // 選択した処理 を 実行
    @Override
    protected boolean runFunction(String inputCode) {
        if (inputCode.equals("P"))
            jinzaiListView.prev();
        else if (inputCode.equals("N"))
            jinzaiListView.next();
        else {
            // 人材情報 表示
            System.out.println();
            JinzaiDetailView jinzaiDetailView = new JinzaiDetailView();
            if (jinzaiDetailView.display(jinzai)) {
                System.out.println();

                // 稼働状況 取得
                Kadou search = new Kadou();
                search.setJinzaiID(inputCode);

                Matcher matcher = new KadouMatcherByJinzai(search);
                Repository<Kadou> kadouRepository = new Repository<Kadou>();
                kadouRepository.select("kadou.txt", false, matcher, Kadou.class);

                // 稼働状況 表示
                System.out.println("稼働状況---------------------------------------------");
                KadouListView kadouListView = new KadouListView(kadouRepository);
                kadouListView.display();
                System.out.println();

                System.out.print("エンターキーを押すと検索結果一覧に戻ります。\n>");
                try {
                    reader.readLine();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

        return false; // 検索結果一覧 に 戻る
    }
}