현재 주소록 어플리케이션에 구현되어 있는 메소드는 다음과 같습니다.
[#M_ more.. | less.. |
   void add(Member newMember);

   int getNumberOfMembers();

   List<Member> getAllMembers();

   Member get(int id);

   void update(Member member);

   void deleteById(int id);

   List<Member> findByName(String name);

   List<Member> findByMessengerId(String messengerId);

   List<Member> findByEmail(String email);

   List<Member> findByBlugAddress(String blugAddress);

   List<Member> findByPhone(String phone);

_M#]
이 중에서 find 관련된 메소드들은 매우 구체적입니다. findByXXX(value); 이런식입니다. 이 것을 다음과 같이 추상화 시킬 수 있습니다.

1376261315.bmp
1번이 현재 상태입니다. 이것을 2번과 같이 좀더 추상화 시켜서 findByName(value)를 findBy("Name",value) 이런식으로 추상화 시킬 수 있습니다. 이 때 메소드 갯수는 대폭 줄어 듭니다. 하지만 이 메소드 내부가 복잡해 집니다. if나 switch 문이 생기게 될 것입니다.

3번 상태는 By 까지 추상화 시켜서 아예 맵을 넘겨 주는 것입니다. 그리고 4번은 key가 한정된 범위 내에서 선택 되도록 EnumMap을 사용하도록 3번을 좀더 개선 시킨 것입니다.

각각이 다 장단점이 있지만 1번의 메소드 이름이 구체적이고 새로운 검색 조건이 추가 될 때 기존 메소드를 고치기 보다 그냥 하나 추가하는 것이 편하기 때문에 1번 방법을 계속 사용하도록 하겠습니다.