2011-03-22 3 views
1

자바에서 객체 지향 주소록을 디자인하는 방법을 스스로 묻습니다.주소록을 디자인 할 때 가장 객체 지향적 인 방법은 무엇입니까?

연락처에 주소, 전화 번호 및 전자 메일 주소와 같은 여러 연락처 정보가있을 수 있습니다.

이 방법을 구현하는 한 가지 방법은 모든 유형에 대해 모든 연락처에 ArrayList을 부여하는 것입니다. 그러나 더 나은 객체 지향 솔루션이 있어야합니다. 이게 뭐야?

답변

2

내가 줄 수있는 대부분의 OOP 제안은 모든 항목/정보에 대한 클래스를 만드는 것입니다. 예를 들어 :

public abstract class ContactInfo { /* ... */ } 

public class Address extends ContactInfo { /* ... */ } 

public class PhoneNumber extends ContactInfo { /* ... */ } 

public class EmailAddress extends ContactInfo { /* ... */ } 

public class Contact { 
    private String name; 
    private Set<ContactInfo> info; 
    // ... 
} 

그리고 마지막으로,이 수도 있고 특정 사건에 대한 과도하지 않을 수 있습니다

public class AddressBook { 
    List<Contact> contacts; 
    // ... 
} 

하지만, 사고 실험으로, 그 길을 가야하는 것입니다.분명히 객체 —을 사용하여 OOP —의 문자 부분을 처리하지만 밀접하게 관련된 원칙 인 캡슐화, 추상화 및 상속을위한 기본 작업도 제공합니다.

+0

답변 해 주셔서 감사합니다. 그러나 연락처 항목의 유형을 어떻게 결정합니까? – Mark

+0

@ 마크, 내가 제시 한 정확한 코드로는 그렇지 않을 것이다. 실제 프로그램에서는 고유 한 요구 사항을 충족시키기 위해 일부 조정을해야합니다. 당신이 타입을 알고 싶다면'Set

addresses; phoneNumbers;를 설정하십시오. (나는 당신이 연락처 항목보다는 정보 항목을 의미한다고 가정합니다.) – Pops

1

나는 그것이 특히 객체 지향적이라고 생각하지 않습니다. 귀하의 도메인이 Person에 0 이상 EmailAddress 일 수있는 경우라면, 거의 정확하게 상황을 설명하여 목록을 사용할 수 있습니다.

내가 생각할 수있는 유일한 다른 방법은, 같은

WorkEmail 
PersonalEmail 
OtherEmail1 
OtherEmail2 
OtherEmail3 

그러나 더 나쁜 내 의견 필드가하는 것 때문에 :

    당신은 간단하게 지원할 수
  • 개 이상 이메일 주소 (글쎄, 당신은 더 많은 필드를 추가 할 수 있지만, 후자의 고통을 증가시키고 여전히 유한 한 제한을 부과합니다.)
  • 당신은 존재할 수있는 것보다 약간의 의미를 암시하고 있습니다. 동일한 주소가 w 오크와 개인? 둘 다 적용되지 않는다면 Other자를 채울 수 있습니까? 목적을 모르는 경우 어떻게합니까?)
  • 이제는 각 필드를 수동으로 테스트하여 어느 것이 null인지 알기를 바랍니다. Java에서 중복되지 않는 부분이 있습니다. 향상된 루프와 같은 멋진 기능을 사용하여 모든 이메일 주소에 동일한 블록을 적용 할 수는 없습니다. 주소가 몇 개인 지 계산할 수 없습니다.
  • Person의 속성 목록이 훨씬 적습니다. 깨끗한. 이 속성을 EmailContactDetails 클래스 또는 다른 클래스로 패키지 할 수 있다고 가정 해 보겠습니다. 그러나 이제는 실질적인 이득을 얻지 못하는 간접적 인 수준의 개념이 생겼습니다. 사람이 이메일 주소의 가능성 - 빈, 무제한의 목록이있는 경우

그래서, 목록으로 저를 대표하는 문제점은 무엇입니까?

2

당신은 올바른 길을 가고 있습니다. 내가 다르게 할 유일한 방법은 ContactsList 컬렉션 대신 List interface을 사용하여 연락처의 속성 컬렉션을 참조하는 것입니다. 이것은 this article 및 기타 여러 가지 기술에서와 같이 코드 대 인터페이스의 경험 법칙에 기반한 조언입니다.

0

Map을 사용하고 구체적인 값을 얻을 수도 있습니다. myMap.get("emailAdress1")을 통해 또는 myMap.entrySet()을 통해 목록과 같이 전체지도를 반복합니다.

관련 문제