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

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

Step 15 人材削除処理を追加

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

class SelectFunction extends AbstractDispatcher {
    // 選択肢 を 表示
    @Override
    protected 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]>");
    }

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

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

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

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

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

        return false;
    }
}

人材IDを入力

class DeleteJinzai extends AbstractDispatcher {
    // 選択肢 を 表示
    @Override
    protected void beforeDisplayMenu() {
        System.out.print("人材IDを入力してください。\n [人材ID, E]>");
    }

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

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

        // 内容確認後 削除処理
        DeleteConfirm ad = new DeleteConfirm();
        return ad.run(reader, jinzai);
        // 「以下の内容で削除します。」で 
        //      "Y" なら メニューに 戻る、 
        //      "N" なら 人材IDを入力
    }
}

ファイル I/O クラス
データ削除処理を追加

    public boolean delete(String fileName, T entityNew, Class<T> entityClass) {
        select(fileName, true, "", entityClass);
        entityNew.setDeleteDate("");

        FileWriter outFile = null;
        BufferedWriter outBuffer = null;

        try {
            outFile = new FileWriter(fileName.replace("txt","tmp"));
            outBuffer = new BufferedWriter(outFile);

            for (T entity: entityList) {
                if (entity.getID().equals(entityNew.getID()))
                    outBuffer.write(entityNew.toString());
                else
                    outBuffer.write(entity.toString());
            }

            outBuffer.flush();
            outBuffer.close();
            outBuffer = null;

            File textFile = new File(fileName);
            File tempFile = new File(fileName.replace("txt","tmp"));
            textFile.delete();
            tempFile.renameTo(textFile);

        } catch (IOException e) { //面倒だがException全体をcatchしない方がよい。
            e.printStackTrace();
            return false;
        } finally {
            // finallyブロックで後処理
            if (outBuffer != null) {
                try {
                    outBuffer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        return true;
    }

これは、追加処理の、この部分が

        entityNew.setUpdateDate("");

こうなっているだけなので、

        entityNew.setDeleteDate("");

なんとか、するべき。