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

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

Step 4

人材検索処理を、もう少し作りこんでみる。
コードの重複を一切気にしない、と言ったが、ちょっとひどすぎたので、
氏名での検索処理と、業種での検索処理とは、分けずに1つにまとめた。
とは言え、普段、仕事で書いているのは、こんなレベル。
オブジェクト指向とは縁遠く、保守性の低い、Do Repeat Yourself なプログラムを、日々量産している。。。

Main.java
import java.io.BufferedReader;
import java.io.InputStreamReader;
 
public class Main {
    public static void main(String[] args) {
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

            while(true) {
                // 選択肢 を 表示
                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]>");

                // 処理 を 選択
                String s = reader.readLine();
                if (s == null) break;
                if (s.equals("E")) break;

                // 選択した処理 を 実行
                if (s.equals("S"))
                    selectSearchType(reader); // 人材検索処理
                else if (s.equals("JI"))
                    System.out.println("人材追加処理...\n");
                else if (s.equals("JU"))
                    System.out.println("人材更新処理...\n");
                else if (s.equals("JD"))
                    System.out.println("人材削除処理...\n");
                else if (s.equals("KI"))
                    System.out.println("稼働状況追加処理...\n");
                else if (s.equals("KD"))
                    System.out.println("稼働状況削除処理...\n");
                else 
                    System.out.println("");
            }

            reader.close();

        } catch (Exception e) {
            System.out.println(e);
        }
    }
    // 人材検索 検索方法を選択
    private static void selectSearchType(BufferedReader reader) {
        try {
            // 業種一覧を作成
            java.util.Map<String, String> gyoshuMap = getGyoshuMap();

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

                // 検索方法を入力
                String searchType = reader.readLine();
                if (searchType == null) break;
                if (searchType.equals("E")) break;

                // 選択した処理 を 実行
                if (searchType.equals("N"))
                    inputSearchStr(reader, searchType, gyoshuMap); // 氏名で検索
                else if (searchType.equals("T"))
                    inputSearchStr(reader, searchType, gyoshuMap); // 業種で検索
            }

        } catch (Exception e) {
            System.out.println(e);
        }
    }
    // 業種一覧を作成
    private static java.util.Map<String, String> getGyoshuMap() {
        java.util.Map<String, String> gyoshuMap = new java.util.LinkedHashMap<String, String>();
        try {
            java.io.FileReader fr = new java.io.FileReader("gyoshu.txt");
            java.io.BufferedReader br = new java.io.BufferedReader(fr);
            String gyoshuStr;
            while ((gyoshuStr = br.readLine()) != null) {
                if (!gyoshuStr.endsWith("\t")) continue;
                String[] gyoshuAry = gyoshuStr.split( "\t");
                gyoshuMap.put(gyoshuAry[0], gyoshuAry[1]);
            }
            br.close();

        } catch (Exception e) {
            System.out.println(e);
        }

        return gyoshuMap;
    }
    // 人材検索 呼び出し
    private static void inputSearchStr(BufferedReader reader, String searchType, java.util.Map<String, String> gyoshuMap) {
        try {
            // 選択肢 を 表示
            if (searchType.equals("N")) {
                // 氏名で検索
                System.out.print("\n氏名に含まれる文字列を指定してください。\n>");
            } else if (searchType.equals("T")) {
                // 業種で検索
                System.out.println("\n業種を選択してください。");
                System.out.print(" [");
                java.util.Set gyoshuKeySet = gyoshuMap.keySet();
                java.util.Iterator i = gyoshuKeySet.iterator();
                while (i.hasNext()) {
                    System.out.print(i.next());
                    System.out.print(", ");
                }
                System.out.print("\b\b]>");
            }

            // 検索文字列を入力
            String searchStr = reader.readLine();
            if (searchStr == null) return;

            // 入力文字列で検索
            jinzaiKensaku(reader, searchType, searchStr, gyoshuMap);

        } catch (Exception e) {
            System.out.println(e);
        }
    }
    // 人材検索
    private static void jinzaiKensaku(BufferedReader reader, String searchType, String searchStr, java.util.Map<String, String> gyoshuMap) {
        try {
            int page = 0;
            while (true) {
                // 人材一覧 表示
                page = jinzaiListDisplay(gyoshuMap, searchType, searchStr, page);

                // 選択肢 を 表示
                System.out.println("");
                System.out.println("P->前の10件");
                System.out.println("N->次の10件");
                System.out.println("E->検索一覧終了( 検索条件指定に戻る )");
                System.out.print(" [人材ID, P, N, E]>");

                // 処理 を 選択
                String jinzaiID = reader.readLine();
                if (jinzaiID == null) break;
                if (jinzaiID.equals("E")) break;

                // 選択した処理 を 実行
                if (jinzaiID.equals("P"))
                    page--;
                else if (jinzaiID.equals("N"))
                    page++;
                else {
                    // 人材情報 表示
                    if (jinzaiDetailDisplay(gyoshuMap, jinzaiID)) {
                        System.out.print("エンターキーを押すと検索結果一覧に戻ります。\n>");
                        reader.readLine();
                    }
                    System.out.println("");
                }
            }
        } catch (Exception e) {
            System.out.println(e);
        }
    }
    // 人材一覧 表示
    private static int jinzaiListDisplay(java.util.Map<String, String> gyoshuMap, String searchType, String searchStr, int page) {
        try {
            while (true) {
                if (page < 0) page = 0;
                int min = page * 10;
                int max = min  +  9;
                boolean find = false;

                java.io.FileReader fr = new java.io.FileReader("jinzai.txt");
                java.io.BufferedReader br = new java.io.BufferedReader(fr);

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

                int cnt = -1;
                String jinzaiStr;
                while ((jinzaiStr = br.readLine()) != null) {
                    // 削除レコード
                    if (!jinzaiStr.endsWith("\t")) continue;

                    String[] jinzaiAry = jinzaiStr.split( "\t");

                    // 氏名で検索
                    if (searchType.equals("N") && (jinzaiAry[1].indexOf(searchStr) < 0 )) continue;
                    // 業種で検索
                    if (searchType.equals("T") && !jinzaiAry[9].equals(searchStr)) continue;

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

                    find = true;

                    System.out.print(jinzaiAry[0]); // 人材ID
                    System.out.print("\t");
                    System.out.print(jinzaiAry[1]); // 人材名
                    System.out.print("\t");
                    System.out.println(gyoshuMap.get(jinzaiAry[9]));    // 業種ID
                }
                br.close();
                if (find) break;

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

        } catch (Exception e) {
            System.out.println(e);
        }

        return page;
    }
    // 人材情報 表示
    private static boolean jinzaiDetailDisplay(java.util.Map<String, String> gyoshuMap, String jinzaiID) {
        boolean find = false;

        try {
            java.io.FileReader fr = new java.io.FileReader("jinzai.txt");
            java.io.BufferedReader br = new java.io.BufferedReader(fr);

            String jinzaiStr;
            while ((jinzaiStr = br.readLine()) != null) {
                // 削除レコード
                if (!jinzaiStr.endsWith("\t")) continue;

                String[] jinzaiAry = jinzaiStr.split( "\t");
                if (jinzaiAry[0].equals(jinzaiID)) {
                    System.out.println("");
                    System.out.println("人材ID : " + jinzaiAry[0]);
                    System.out.println("氏名 : " + jinzaiAry[1]);
                    System.out.println("郵便番号 : " + jinzaiAry[2]);
                    System.out.println("住所 : " + jinzaiAry[3]);
                    System.out.println("電話番号 : " + jinzaiAry[4]);
                    System.out.println("FAX番号 : " + jinzaiAry[5]);
                    System.out.println("e-mailアドレス : " + jinzaiAry[6]);
                    System.out.println("生年月日 : " + jinzaiAry[7]);
                    System.out.println("性別 : " + jinzaiAry[8]);
                    System.out.println("業種 : " + gyoshuMap.get(jinzaiAry[9]));
                    System.out.println("経験年数 : " + jinzaiAry[10] + "年");
                    System.out.println("最終学歴 : " + jinzaiAry[11]);
                    System.out.println("希望単価 : " + jinzaiAry[12] + "円");

                    // 稼働状況 表示
                    kadouListDisplay(jinzaiID);

                    find = true;
                    break;
                }
            }
            if (!find)
                System.out.println("入力された人材情報は登録されていません。");

            br.close();
        } catch (Exception e) {
            System.out.println(e);
        }

        return find;
    }
    // 稼働状況 表示
    private static void kadouListDisplay(String jinzaiID) {
        try {
            // 取引先一覧を作成
            java.util.Map<String, String> torihikiMap = getTorihikiMap();

            java.io.FileReader fr = new java.io.FileReader("kadou.txt");
            java.io.BufferedReader br = new java.io.BufferedReader(fr);

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

            String kadouStr;
            while ((kadouStr = br.readLine()) != null) {
                // 削除レコード
                if (!kadouStr.endsWith("\t")) continue;

                String[] kadouAry = kadouStr.split( "\t");
                if (!kadouAry[0].equals(jinzaiID)) continue;

                System.out.print(kadouAry[1]); // 稼働状況番号
                System.out.print("\t");
                System.out.print(kadouAry[3]); // 稼働開始日
                System.out.print("〜");
                System.out.print(kadouAry[4]); // 稼働終了日
                System.out.print("\t");
                System.out.println(torihikiMap.get(kadouAry[2])); // 取引先ID
            }
            br.close();

        } catch (Exception e) {
            System.out.println(e);
        }
    }
    // 取引先一覧を作成
    private static java.util.Map<String, String> getTorihikiMap() {
        java.util.Map<String, String> torihikiMap = new java.util.LinkedHashMap<String, String>();
        try {
            java.io.FileReader fr = new java.io.FileReader("torihiki.txt");
            java.io.BufferedReader br = new java.io.BufferedReader(fr);
            String torihikiStr;
            while ((torihikiStr = br.readLine()) != null) {
                if (!torihikiStr.endsWith("\t")) continue;
                String[] torihikiAry = torihikiStr.split( "\t");
                torihikiMap.put(torihikiAry[0], torihikiAry[1]);
            }
            br.close();

        } catch (Exception e) {
            System.out.println(e);
        }

        return torihikiMap;
    }
}
実行結果
S:\>java Main
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
            人材管理システム
                メニュー
  [1].人材検索(S)
  [2].人材管理(JI:追加 JU:更新 JD:削除)
  [3].稼働状況管理(KI:追加 KD:削除)
  [4].終了(E)
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
どの機能を実行しますか?
 [S, JI, JU, JD, KI, KD, E]>S

検索方法を指定してください。
N->氏名から検索
T->業種から検索
E->人材検索終了(メニューに戻る)
 [N, T, E]>T

業種を選択してください。
 [1, 2, 3, 4, 5]>4
検索結果一覧
9       千葉 健太郎    プログラマ
11      京沢 雄二      プログラマ
13      長谷川 健太    プログラマ
14      田口 里奈      プログラマ
15      福本 詩織      プログラマ
16      山崎 昇        プログラマ
26      山田 一郎      プログラマ
27      山田 一郎      プログラマ
28      山田 一郎      プログラマ
29      山田 一郎      プログラマ

P->前の10件
N->次の10件
E->検索一覧終了( 検索条件指定に戻る )
 [人材ID, P, N, E]>N
検索結果一覧
30      山田 一郎      プログラマ
31      山田 一郎      プログラマ
32      山田 一郎      プログラマ
33      山田 一郎      プログラマ

P->前の10件
N->次の10件
E->検索一覧終了( 検索条件指定に戻る )
 [人材ID, P, N, E]>N
検索結果一覧
人材情報はありません。

検索結果一覧
30      山田 一郎      プログラマ
31      山田 一郎      プログラマ
32      山田 一郎      プログラマ
33      山田 一郎      プログラマ

P->前の10件
N->次の10件
E->検索一覧終了( 検索条件指定に戻る )
 [人材ID, P, N, E]>7

人材ID : 7
氏名 : 山田 太郎
郵便番号 : 135
住所 :
電話番号 : 03-0000-0000
FAX番号 : 00000000
e-mailアドレス : yamada@com
生年月日 :
性別 : M
業種 : 経理
経験年数 : 年
最終学歴 :
希望単価 : 円

稼働状況---------------------------------------------
2       20030201〜20030331      ○○商事有限会社
4       20010101〜20020404      ○○株式会社
5       20010101〜20020404      ○○商事有限会社
エンターキーを押すと検索結果一覧に戻ります。
>

検索結果一覧
30      山田 一郎      プログラマ
31      山田 一郎      プログラマ
32      山田 一郎      プログラマ
33      山田 一郎      プログラマ

P->前の10件
N->次の10件
E->検索一覧終了( 検索条件指定に戻る )
 [人材ID, P, N, E]>E

検索方法を指定してください。
N->氏名から検索
T->業種から検索
E->人材検索終了(メニューに戻る)
 [N, T, E]>E
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
            人材管理システム
                メニュー
  [1].人材検索(S)
  [2].人材管理(JI:追加 JU:更新 JD:削除)
  [3].稼働状況管理(KI:追加 KD:削除)
  [4].終了(E)
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
どの機能を実行しますか?
 [S, JI, JU, JD, KI, KD, E]>E