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

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

Step 16 その4 (人材更新)

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

人材ID を 入力

class JinzaiUpdate 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 ""; // 「人材IDを入力してください」に 戻る
        }

        // 人材情報 表示
        System.out.println();
        JinzaiDetailView  jinzaiDetailView = new JinzaiDetailView();
        if (jinzaiDetailView.display(jinzai)) {
            // 更新項目 選択
            SelectUpdateField ad = new SelectUpdateField();
            ad.run(reader, jinzai, new UpdateConfirm<Jinzai>());
        }

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

更新項目を選択

class SelectUpdateField extends AbstractDispatcher {
    private boolean isDirty = false;
    private Jinzai jinzai;
    private UpdateConfirmBase<Jinzai> updateConfirm;

    protected String run(BufferedReader reader, Jinzai jinzai, UpdateConfirmBase<Jinzai> updateConfirm) {
        this.jinzai = jinzai;
        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.println("5.FAX番号");
        System.out.println("6.e-mailアドレス");
        System.out.println("7.生年月日");
        System.out.println("8.性別");
        System.out.println("9.業種");
        System.out.println("10.経験年数");
        System.out.println("11.最終学歴");
        System.out.println("12.希望単価");
        System.out.print(" [1-12, E]>");
        return true;
    }

    // 選択した処理 を 実行
    @Override
    protected String runFunction(String inputCode) {
        if (inputCode.equals("E")) {
            // 内容確認後 更新処理
            if (isDirty) {
                DataViewer dataViewer = new JinzaiDetailView();
                String s = updateConfirm.run(reader, Jinzai.class, jinzai, dataViewer, "jinzai.txt", new JinzaiMatcher(jinzai));
                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 > 12) return ""; // 「更新したい項目を選択してください」 に 戻る

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

更新内容を入力

class InputUpdateValue extends AbstractDispatcher {
    private Jinzai jinzai;
    private int fieldIdx;

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

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

        if      (fieldIdx == 1)  System.out.print("氏名");
        else 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("FAX番号");
        else if (fieldIdx == 6)  System.out.print("e-mailアドレス");
        else if (fieldIdx == 7)  System.out.print("生年月日");
        else if (fieldIdx == 8)  System.out.print("性別");
        else if (fieldIdx == 9)  System.out.print("業種");
        else if (fieldIdx == 10) System.out.print("経験年数");
        else if (fieldIdx == 11) System.out.print("最終学歴");
        else if (fieldIdx == 12) System.out.print("希望単価");

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

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

内容確認後 更新

abstract class UpdateConfirmBase<T extends EntityBase> extends AbstractDispatcher {
    protected Class<T> entityClass;
    protected T entity;
    protected DataViewer dataViewer;
    protected String fileName;
    protected Matcher matcher;
    private boolean result = false;

    protected String run(BufferedReader reader, Class<T> entityClass, T entity, DataViewer dataViewer, String fileName, Matcher matcher) {
        this.entityClass = entityClass;
        this.entity = entity;
        this.dataViewer = dataViewer;
        this.fileName = fileName;
        this.matcher = matcher;
        return super.run(reader);
    }

    // 選択肢 を 表示
    @Override
    protected boolean displayMenu() {
        // 確認メッセージ
        displayConfirmMessage();
        // 人材情報 表示
        System.out.println();
        dataViewer.display(entity);
        System.out.print(" [Y, N, E]>");
        return true;
    }

    // 確認メッセージ
    protected abstract void displayConfirmMessage();

    // 選択した処理 を 実行
    @Override
    protected String runFunction(String inputCode) {
        if (inputCode.equals("Y")) {
            // 更新処理
            if (update(new Repository<T>(), matcher)) {
                // 完了メッセージ
                displayCompleteMessage();
            }
        }

        if (inputCode.equals("Y") || inputCode.equals("N") || inputCode.equals("E")) {
            return inputCode;
        }

        return ""; // 確認メッセージ に 戻る
    }

    // 追加・変更・削除 処理
    protected abstract boolean update(Repository<T> repository, Matcher matcher);

    // 完了メッセージ
    protected abstract void displayCompleteMessage();
}

内容確認後 追加

class InsertConfirm<T extends EntityBase> extends UpdateConfirmBase<T> {
    // 追加・変更・削除 処理
    @Override
    protected boolean update(Repository<T> repository, Matcher matcher) {
        repository.select(fileName, true, new Matcher(null), entityClass);
        entity.setCreateDate("");
        return repository.update(fileName, entity, matcher);
    }
    // 確認メッセージ
    @Override
    protected void displayConfirmMessage() {
        System.out.println();
        System.out.println("以下の内容で登録します。");
    }
    // 完了メッセージ
    @Override
    protected void displayCompleteMessage() {
        System.out.println();
        System.out.println("登録しました。");
    }
}

内容確認後 変更

class UpdateConfirm<T extends EntityBase> extends UpdateConfirmBase<T> {
    // 追加・変更・削除 処理
    @Override
    protected boolean update(Repository<T> repository, Matcher matcher) {
        repository.select(fileName, true, new Matcher(null), entityClass);
        entity.setUpdateDate("");
        return repository.update(fileName, entity, matcher);
    }
    // 確認メッセージ
    @Override
    protected void displayConfirmMessage() {
        System.out.println();
        System.out.println("以下の内容で更新します。");
    }
    // 完了メッセージ
    @Override
    protected void displayCompleteMessage() {
        System.out.println();
        System.out.println("更新しました。");
    }
}

内容確認後 削除

class DeleteConfirm<T extends EntityBase> extends UpdateConfirmBase<T> {
    // 追加・変更・削除 処理
    @Override
    protected boolean update(Repository<T> repository, Matcher matcher) {
        repository.select(fileName, true, new Matcher(null), entityClass);
        entity.setDeleteDate("");
        return repository.update(fileName, entity, matcher);
    }
    // 確認メッセージ
    @Override
    protected void displayConfirmMessage() {
        System.out.println();
        System.out.println("以下の情報を削除します。");
    }
    // 完了メッセージ
    @Override
    protected void displayCompleteMessage() {
        System.out.println();
        System.out.println("削除しました。");
    }
}