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

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

Step 9

人材情報や、稼働状況を表示する処理を、別のクラスに分ける

人材検索
class JinzaiKensaku extends AbstractDispatcher {
    private String searchType;
    private String searchStr;
    private Map<String, EntityBase> jinzaiMap;
    private Map<String, EntityBase> jinzaiMapAll;
    private JinzaiListView jinzaiListView;
    private JinzaiDetailView jinzaiDetailView;

    JinzaiKensaku(BufferedReader reader) {
        super(reader);
    }

    public void run(String searchType, String searchStr) {
        this.searchType = searchType;
        this.searchStr = searchStr;

        // 人材一覧 取得
        EntityMap entityMap;
        if (searchType.equals("N")) 
            entityMap = new JinzaiMapByName(); // 氏名で検索
        else if (searchType.equals("T"))
            entityMap = new JinzaiMapByGyoshu(); // 業種で検索
        else
            return;
        jinzaiMap = entityMap.getMap("jinzai.txt", searchStr);
        jinzaiListView = new JinzaiListView(jinzaiMap, gyoshuMap);

        entityMap = new EntityMap(); // 全件数取得
        jinzaiMapAll = entityMap.getMap("jinzai.txt", "");
        jinzaiDetailView = new JinzaiDetailView(jinzaiMapAll, gyoshuMap);

        super.run();
    }

    // 選択肢 を 表示
    public void beforeDisplayMenu() {
        // 人材一覧 表示
        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]>");
    }

    // 選択した処理 を 実行
    public boolean runFunction(String inputCode) {
        if (inputCode.equals("P"))
            jinzaiListView.prev();
        else if (inputCode.equals("N"))
            jinzaiListView.next();
        else {
            // 人材情報 表示
            if (jinzaiDetailView.display(inputCode)) {
                // 稼働状況 表示
                kadouListDisplay(inputCode);

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

        return false;
    }
    // 稼働状況 表示
    private void kadouListDisplay(String jinzaiID) {
        // 稼働状況 取得
        EntityMap entityMap = new KadouMap();
        Map<String, EntityBase> kadouMap = entityMap.getMap("kadou.txt", jinzaiID);
        KadouListView kadouListView = new KadouListView(kadouMap, torihikiMap);
        // 稼働状況 表示
        kadouListView.display();
    }
}
人材一覧 表示
class JinzaiListView {
    private int page = 0;
    private Map<String, EntityBase> jinzaiMap;
    private Map<String, EntityBase> gyoshuMap;

    JinzaiListView(Map<String, EntityBase> jinzaiMap, Map<String, EntityBase> gyoshuMap) {
        this.jinzaiMap = jinzaiMap;
        this.gyoshuMap = gyoshuMap;
    }

    public void prev() {
        page--;
    }
    public void next() {
        page++;
    }
    public void display() {
        Collection jinzaiCol = jinzaiMap.values();

        while (true) {
            if (page < 0) page = 0;
            int min = page * 10;
            int max = min  +  9;
            boolean find = false;

            System.out.println("検索結果一覧");

            int cnt = -1;
            String jinzaiStr;

            // 人材一覧 表示
            Iterator i = jinzaiCol.iterator();
            while (i.hasNext()) {
                Jinzai jinzai = (Jinzai)i.next();

                cnt++;
                if (cnt < min) continue;
                if (cnt > max) break;

                find = true;

                System.out.print(jinzai.getID()); // 人材ID
                System.out.print("\t");
                System.out.print(jinzai.getName()); // 人材名
                System.out.print("\t");

                if (gyoshuMap.containsKey(jinzai.getGyoshuID()))
                    System.out.println(gyoshuMap.get(jinzai.getGyoshuID()).getName()); // 業種ID
            }
            if (find) break;

            System.out.println("人材情報はありません。\n");
            if (page < 1) break;;
            page--;
        }
    }
}
人材情報 表示
    private Map<String, EntityBase> jinzaiMap;
    private Map<String, EntityBase> gyoshuMap;

    JinzaiDetailView(Map<String, EntityBase> jinzaiMap, Map<String, EntityBase> gyoshuMap) {
        this.jinzaiMap = jinzaiMap;
        this.gyoshuMap = gyoshuMap;
    }

    public boolean display(String jinzaiID) {
        if (!jinzaiMap.containsKey(jinzaiID)) {
            System.out.println("入力された人材情報は登録されていません。");
            return false;
        }

        Jinzai jinzai = (Jinzai)jinzaiMap.get(jinzaiID);
        System.out.println("");
        System.out.println("人材ID : " + jinzai.getID());
        System.out.println("氏名 : " + jinzai.getName());
        System.out.println("郵便番号 : " + jinzai.getZip());
        System.out.println("住所 : " + jinzai.getAddress());
        System.out.println("電話番号 : " + jinzai.getTel());
        System.out.println("FAX番号 : " + jinzai.getFax());
        System.out.println("e-mailアドレス : " + jinzai.getEmail());
        System.out.println("生年月日 : " + jinzai.getBirthDate());
        System.out.println("性別 : " + jinzai.getSex());

        System.out.print("業種 : ");
        if (gyoshuMap.containsKey(jinzai.getGyoshuID()))
            System.out.println(gyoshuMap.get(jinzai.getGyoshuID()).getName());
        else
            System.out.println();

        System.out.println("経験年数 : " + jinzai.getNensu() + "年");
        System.out.println("最終学歴 : " + jinzai.getGakureki());
        System.out.println("希望単価 : " + jinzai.getTanka() + "円");

        return true;
    }
}
稼働状況 表示
class KadouListView {
    private Map<String, EntityBase> kadouMap;
    private Map<String, EntityBase> torihikiMap;

    KadouListView(Map<String, EntityBase> kadouMap, Map<String, EntityBase> torihikiMap) {
        this.kadouMap = kadouMap;
        this.torihikiMap = torihikiMap;
    }

    public void display() {
        System.out.println("\n稼働状況---------------------------------------------");

        Collection kadouCol = kadouMap.values();
        Iterator i = kadouCol.iterator();
        while (i.hasNext()) {
            Kadou kadou = (Kadou)i.next();

            System.out.print(kadou.getKadouStatus()); // 稼働状況番号
            System.out.print("\t");
            System.out.print(kadou.getStartDate()); // 稼働開始日
            System.out.print("〜");
            System.out.print(kadou.getEndDate()); // 稼働終了日
            System.out.print("\t");

            if (torihikiMap.containsKey(kadou.getTorihikiID()))
                System.out.println(torihikiMap.get(kadou.getTorihikiID()).getName()); // 取引先ID
            else
                System.out.println();
        }
    }
}