2012-05-18 6 views
1

데이터베이스에 저장되고 네트워크를 통해 전송되도록 일련의 클래스로 프로그램을 작성하고 있습니다.지도 대 클래스 속성 조언

명령 줄 인터페이스를 통해 클래스 속성에 쉽게 액세스 할 수있게하려면 각 속성에 자체 변수를주는 대신 Map 클래스에 속성을 저장하는 것이 좋습니다.

기본적으로, 대신 이런 식으로 뭔가를 사용 :

String id = account.getUserId(); 

나는이

String id = account.properties.get("userId"); 

이이 일을하는 것이 좋습니다 방법 할 것?

+1

하지만 열거의 오히려 문자열보다 –

답변

2

예, 꽤 합리적인 모델입니다. 때로는 "prototype object model"이라고도하며 모든 객체가 효과적으로 맵핑되는 JavaScript에서 작업하는 방법과 매우 유사합니다. 그 결과 JSON 직렬화 형식이 널리 보급되었습니다.

멋진 기능 :

  • 당신은 지저분한 상속 heirarchies에 대해 걱정할 필요가 없습니다 - 그냥 마음대로 속성을 변경할 수 있습니다.
  • 다른 개체 (프로토 타입)에서 복사하여 새 개체를 만들 수 있습니다.
  • 데이터를 조작하는 코드는 모든 변수의 명시 적 이름을 지정하지 않고도 동일한 방식으로 수행 할 수 있습니다.
  • 그것은 정적 클래스 정의에 비해 더 "동적"- 그것은 당신의 객체

잠재적 위험/단점 확장하고 수정하기 쉽습니다 : 당신이 경우 속성 이름을 추적 할 필요가

  • 을 당신은 문자열을 사용합니다 - 컴파일러는 당신을 위해 그것을하지 않습니다! 이 문제는 Enum을 키로 사용하여 완화 할 수 있지만 유연성을 잃어 버릴 수 있습니다 ...
  • 정적 유형 검사의 이점을 얻지 못하기 때문에 더 많은 JUnit 테스트를 결과로 작성해야 할 수도 있습니다 제대로 작동하는 것을 보장하기 위해
  • 약간의 성능 오버 헤드가 실제로 변형 OG를 사용하여 90 년대에 전체 게임을 쓴

(지도 조회가 매우 빠른만큼, 걱정 아마 충분하지 불구하고)있다 이 객체 모델 (Tyrant)은 매우 잘 작동했습니다.

그러나 Map 객체를 노출하는 대신이 기능을 캡슐화하여 객체 자체에 대한 접근 자 메서드를 사용할 수 있습니다.

String id = account.getProperty("userId"); 
+0

감사를 사용! 나는 이것에 전진에 관하여 더 낫게 느낀다. –

2

어떻게 문제는이 같은 자주 수행하는 것을 선호 :

enum StringPropertyType { 
    USERID, FIRSTNAME, LASTNAME 
} 

interface StringAttributes { 
    String get(StringPropertyType s); 
    void put(StringPropertyType s, String value); 
} 

class MapBasedStringAttributes implements StringAttributes { 
    Map<StringPropertyType, String> map = new HashMap<~>(); 
    String get(StringPropertyType s) { return map.get(s); } 
    void put(StringPropertyType s, String value) { map.put(s,value); } 
} 

이 컴파일 타임 안전, 리팩토링, 등

당신은 또한 stringPropertyType를 사용할 수 있습니다.이름은() 열거 값의 문자열 표현을 얻을 대신

Map<String,String> 

사용 .. 나는 위와 같은 일을 제안

+0

감사합니다. 나는 오직 한 가지 대답을 녹색 수표로 줄 수는 있지만 더 많이 할 수 있다면 당신도 하나를 얻는다. –

+0

걱정할 필요가 없습니다. 포인트를 얻지 못했습니다 .... 더 이상의 질문이 있으시면 기꺼이 작성해 드리겠습니다. – ianpojman