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

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

Step 16 その7 (稼働状況更新)

処理フローを 制御する クラス (稼働状況更新)

人材ID を 入力

class KadouUpdate extends AbstractDispatcher {
    // 選択肢 を 表示
    @Override
    protected boolean displayMenu() {
        System.out.println();
        System.out.println("人材IDを入力してください。");
        System.out.print("[人材ID, E]>");
        return true;
    }

    // 選択した処理 を 実行
    @Override
    protected String runFunction(String inputCode) {
        // 人材一覧 取得
        Repository<Jinzai> jinzaiRepository = new Repository<Jinzai>();
        jinzaiRepository.select("jinzai.txt", false, new Matcher(null), Jinzai.class);
        Jinzai jinzai = (Jinzai)(jinzaiRepository.seek(inputCode));

        if (jinzai == null) {
            System.out.println();
            System.out.println("入力された人材情報は登録されていません。");
            return "";
        }

        // 人材情報 表示
        System.out.println();
        JinzaiDetailView jinzaiDetailView = new JinzaiDetailView();
        if (jinzaiDetailView.display(jinzai)) {
            System.out.println();

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

            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();

            // 稼動状況番号 選択
            InputKadouID ad = new InputKadouID();
            return ad.run(reader, jinzai);
        }

        return ""; // 「人材IDを入力してください」に 戻る
    }
}

稼動状況番号 選択

class InputKadouID extends AbstractDispatcher {
    private Jinzai jinzai;

    protected String run(BufferedReader reader, Jinzai jinzai) {
        this.jinzai = jinzai;
        return super.run(reader);
    }

    // 選択肢 を 表示
    @Override
    protected boolean displayMenu() {
        System.out.println();
        System.out.println("稼動状況番号を入力してください。");
        System.out.print("[稼動状況番号, E]>");
        return true;
    }

    // 選択した処理 を 実行
    @Override
    protected String runFunction(String inputCode) {
        Kadou search = new Kadou();
        search.setJinzaiID(jinzai.getID());
        Matcher matcher = new KadouMatcherByJinzai(search);

        // 稼動状況一覧 取得
        Repository<Kadou> kadouRepository = new Repository<Kadou>();
        kadouRepository.select("kadou.txt", false, matcher, Kadou.class);
        Kadou kadou = (Kadou)(kadouRepository.seek(inputCode));

        if (kadou == null) {
            System.out.println();
            System.out.println("入力された稼動状況は登録されていません。");
            return "";
        }

        SelectUpdateFieldKadou su = new SelectUpdateFieldKadou();
        su.run(reader, kadou, new UpdateConfirm<Kadou>());

        return "";
    }
}

更新項目を選択

class SelectUpdateFieldKadou extends AbstractDispatcher {
    private boolean isDirty = false;
    private Kadou kadou;
    private UpdateConfirmBase<Kadou> updateConfirm;

    protected String run(BufferedReader reader, Kadou kadou, UpdateConfirmBase<Kadou> updateConfirm) {
        this.kadou = kadou;
        this.updateConfirm = updateConfirm; 
        hasEndCommand = false;
        return super.run(reader);
    }

    // 選択肢 を 表示
    @Override
    protected boolean displayMenu() {
        System.out.println("");
        System.out.println("更新したい項目を選択してください。");
        System.out.println("1.取引先");
        System.out.println("2.稼動開始日");
        System.out.println("3.稼動終了日");
        System.out.println("4.契約単価");
        System.out.print(" [1-4, E]>");
        return true;
    }

    // 選択した処理 を 実行
    @Override
    protected String runFunction(String inputCode) {
        if (inputCode.equals("E")) {
            // 内容確認後 更新処理
            if (isDirty) {
                DataViewer dataViewer = new KadouDetailView();
                String s = updateConfirm.run(reader, Kadou.class, kadou, dataViewer, "kadou.txt", new KadouMatcher(kadou));
                if (s == null) return "E";

                // 「以下の内容で更新します。」で "Y" なら 「人材IDを入力」に 戻る、 
                if (s.equals("Y")) return "E";

                // 「以下の内容で更新します。」で "N" なら 「更新したい項目を選択してください」に戻る
                if (s.equals("N")) return "";
            }
            return inputCode; // 「人材IDを入力」に 戻る

        } else {
            int fieldIdx = 0;
            try {
                fieldIdx = Integer.parseInt(inputCode);
            } catch (Exception e) {
                return "E";
            }
            if (fieldIdx < 1) return ""; // 「更新したい項目を選択してください」 に 戻る
            if (fieldIdx > 4) return ""; // 「更新したい項目を選択してください」 に 戻る

            // 更新後の値を入力
            InputUpdateValueKadou ad = new InputUpdateValueKadou();
            ad.run(reader, kadou, fieldIdx + 1);
            isDirty = true;
            return ""; // 「更新したい項目を選択してください」 に 戻る
        }
    }
}

更新後の値を入力

class InputUpdateValueKadou extends AbstractDispatcher {
    private Kadou kadou;
    private int fieldIdx;

    protected String run(BufferedReader reader, Kadou kadou, int fieldIdx) {
        this.kadou = kadou;
        this.fieldIdx = fieldIdx;
        hasEndCommand = false;
        return super.run(reader);
    }

    // 選択肢 を 表示
    @Override
    protected boolean displayMenu() {
        System.out.println();

        if      (fieldIdx == 2)  System.out.print("取引先");
        else if (fieldIdx == 3)  System.out.print("稼動開始日");
        else if (fieldIdx == 4)  System.out.print("稼動終了日");
        else if (fieldIdx == 5)  System.out.print("契約単価");

        System.out.println("を入力してください。");
        System.out.print(">");
        return true;
    }

    // 選択した処理 を 実行                    
    @Override
    protected String runFunction(String inputCode) {
        // 更新内容セット
        kadou.setValue(fieldIdx, inputCode);
        return "E"; // 「更新したい項目を入力してください」に 戻る
    }
}