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

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

Step 12 その2 (人材検索)

こまごまと修正してみた。

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

検索方法を選択

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

    // 選択した処理 を 実行
    public boolean runFunction(String inputCode) {
        if (inputCode.equals("N") || inputCode.equals("T")) {
            // 人材検索 呼び出し
            InputSearchStr ad = new InputSearchStr();
            ad.run(reader, inputCode);
        } else 
            System.out.println("");

        return false;
    }
}

検索文字列を入力

class InputSearchStr extends AbstractDispatcher {
    private String searchType;
    private Repository<Gyoshu> gyoshuRepository;

    public void run(BufferedReader reader, String searchType) {
        hasEndCommand = false;
        this.searchType = searchType;

        // 業種一覧を作成
        gyoshuRepository = new Repository<Gyoshu>();
        gyoshuRepository.select("gyoshu.txt", false, "", Gyoshu.class);

        super.run(reader);
    }

    // 選択肢 を 表示
    public void beforeDisplayMenu() {
        if (searchType.equals("N")) {
            // 氏名で検索
            System.out.print("\n氏名に含まれる文字列を指定してください。\n>");
        } else if (searchType.equals("T")) {
            // 業種で検索
            System.out.println("\n業種を選択してください。");
            System.out.print(" [");
            System.out.print(gyoshuRepository.keySetToString());
            System.out.print("]>");
        }
    }

    // 選択した処理 を 実行
    public boolean runFunction(String inputCode) {
        // 入力文字列で検索
        JinzaiKensaku ad = new JinzaiKensaku();
        ad.run(reader, searchType, inputCode);

        return true;
    }
}

人材検索

class JinzaiKensaku extends AbstractDispatcher {
    private String searchType;
    private String searchStr;

    private JinzaiListView jinzaiListView;
    private Repository<Jinzai> jinzaiRepository;

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

        // 人材一覧 取得
        if (searchType.equals("N")) 
            jinzaiRepository = new JinzaiRepositoryByName(); // 氏名で検索
        else if (searchType.equals("T"))
            jinzaiRepository = new JinzaiRepositoryByGyoshu(); // 業種で検索
        else
            return;
        jinzaiRepository.select("jinzai.txt", false, searchStr, Jinzai.class);
        jinzaiListView = new JinzaiListView(jinzaiRepository);

        super.run(reader);
    }

    // 選択肢 を 表示
    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 jinzaiID) {
        if (jinzaiID.equals("P"))
            jinzaiListView.prev();
        else if (jinzaiID.equals("N"))
            jinzaiListView.next();
        else {
            // 人材情報 取得
            Repository<Jinzai> jinzaiRepositoryAll = new Repository<Jinzai>();
            jinzaiRepositoryAll.select("jinzai.txt", false, "", Jinzai.class);
            Jinzai jinzai = (Jinzai)(jinzaiRepositoryAll.seek(jinzaiID));

            // 人材情報 表示
            JinzaiDetailView jinzaiDetailView = new JinzaiDetailView();
            if (jinzaiDetailView.display(jinzai)) {
                // 稼働状況 表示
                KadouListView kadouListView = new KadouListView();
                kadouListView.display(jinzaiID);

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

        return false;
    }
}

人材一覧 表示

class JinzaiListView {
    private int page = 0;
    private Repository<Jinzai> jinzaiRepository;
    private Repository<Gyoshu> gyoshuRepository;

    JinzaiListView(Repository jinzaiRepository) {
        this.jinzaiRepository = jinzaiRepository;

        // 業種一覧を作成
        gyoshuRepository = new Repository<Gyoshu>();
        gyoshuRepository.select("gyoshu.txt", false, "", Gyoshu.class);
    }

    public void prev() {
        page--;
    }
    public void next() {
        page++;
    }
    public void display() {
        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;

            // 人材一覧 表示
            List<Jinzai> jinzaiList = jinzaiRepository.getList();
            for (Jinzai jinzai: jinzaiList) {
                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");

                Gyoshu gyoshu = (Gyoshu)(gyoshuRepository.seek(jinzai.getGyoshuID()));
                if (gyoshu != null)
                    System.out.println(gyoshu.getName()); // 業種ID
            }
            if (find) break;

            System.out.println("人材情報はありません。\n");
            if (page < 1) break;;
            page--;
        }
    }
}

人材情報 詳細表示

class JinzaiDetailView {
    private Repository<Gyoshu> gyoshuRepository;

    JinzaiDetailView() {
        // 業種一覧を作成
        gyoshuRepository = new Repository<Gyoshu>();
        gyoshuRepository.select("gyoshu.txt", false, "", Gyoshu.class);
    }

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

        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("業種 : ");
        Gyoshu gyoshu = (Gyoshu)(gyoshuRepository.seek(jinzai.getGyoshuID()));
        if (gyoshu != null)
            System.out.println(gyoshu.getName());
        else
            System.out.println();

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

        return true;
    }
}

稼働状況 表示

class KadouListView {
    public void display(String jinzaiID) {
        // 取引先一覧を作成
        Repository<Torihiki> torihikiRepository = new Repository<Torihiki>();
        torihikiRepository.select("torihiki.txt", false, "", Torihiki.class);

        // 稼働状況 取得
        Repository<Kadou> kadouRepository = new KadouRepository();
        kadouRepository.select("kadou.txt", false, jinzaiID, Kadou.class);

        System.out.println("\n稼働状況---------------------------------------------");

        List<Kadou> kadouList = kadouRepository.getList();
        for (Kadou kadou: kadouList) {
            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");

            Torihiki torihiki = (Torihiki)(torihikiRepository.seek(kadou.getTorihikiID()));
            if (torihiki != null)
                System.out.println(torihiki.getName()); // 取引先ID
            else
                System.out.println();
        }
    }
}