2013-03-28 2 views
1

최대 절전 모드 나 절약 모드와 관련이 없습니다.최대 절전 모드와 절약 모드 간 변환

나는 Hibernate를 통해 데이터베이스로부터 데이터를 가져오고 아파치 절약 서비스를 통해 그 객체들을 제공하고자하는 자바 애플리케이션을 개발 중이다. 지금까지는 몇 가지 모델 만 가지고 있었지만 각 모델에 대해 최대 절전 개체 목록을 반복하고 절약 개체 목록을 구성해야했습니다.

예를 들어, (이 중고품 수집을 같이 수집을 최대 절전 모드 소요 반환 중고품 서비스 핸들러입니다) 코드의 조각을 다음 사항을 고려 :

@Override 
public List<TOutcome> getUserOutcomes(int user_id) throws TException { 
    List<Outcome> outcomes = this.dataProvider.getOutcomesByUserId(user_id); 
    List<TOutcome> result = new ArrayList<>(); 
    for (Iterator iterator = outcomes.iterator(); iterator.hasNext();) { 
     Outcome outcome = (Outcome) iterator.next(); 
     TOutcome t_outcome = new TOutcome(
       (double) (Math.round(outcome.getAmount() * 100))/100, 
       outcome.getUser().getName(), 
       String.valueOf(outcome.getCategory().getName())); 
     t_outcome.setComment(outcome.getComment()); 
     result.add(t_outcome); 
    } 
    return result; 
} 

@Override 
public List<TIncome> getUserIncomes(int user_id) throws TException { 
    List<Income> incomes = this.dataProvider.getIncomesByUserId(user_id); 
    List<TIncome> result = new ArrayList<>(); 
    for (Iterator iterator = incomes.iterator(); iterator.hasNext();) { 
     Income income = (Income) iterator.next(); 
     TIncome t_income = new TIncome(
       (double) (Math.round(income.getAmount() * 100))/100, 
       income.getUser().getName(), 
       String.valueOf(income.getCategory().getName())); 
     t_income.setComment(income.getComment()); 
     result.add(t_income); 
    } 
    return result; 
} 

Outcome, Income -이 최대 절전 모드 주석 클래스와 TOutcome 있습니다 , TIncome - 관련된 서리 개체 (필드의 80-90 %를 공유 함)입니다.

이 코드는 매우 유사하기 때문에 "DRY"원칙이 위반되었습니다. 최대 절전 모드 개체를 반복하고 절약 개체를 반환하는 일반적인 방법을 제공하고 싶습니다. 제네릭과 디자인 패턴을 생각하고있었습니다.

동적 언어에서는 문자열을 사용하여 클래스 이름을 만들고 개체를 구성 할 수 있습니다 (유형 검사 없음). 제네릭을 사용하여 Java에서 비슷한 기능을 수행 할 수있는 가능성이 있다고 생각하지만 어디에서 시작해야할지 모르겠습니다.

+0

결과 및 소득 공통 데이터에 대해 하나의 클래스를 사용하도록 코드를 리팩토링 할 수 있습니까? 상속 또는 믹싱을 사용할 수 있습니다. – kan

+0

@kan 쉽지 않습니다. [1] 저축에는 상속이없고 [2] 다른 모델은 서로 유사하지 않습니다 (사용자, 카테고리 및 결과 - 거의 공통점이 없지만 반복 항목은 동일합니다). – ducin

+0

Java Reflection을 사용하여 필드에 같은 이름 또는 일치하는 요소가 있다고 가정하면 혼성을 디자인 할 수 있지만 @ kan의 제안이 도움이 될 것 같습니다. –

답변

1

약 10 줄의 코드 만 보입니다. 일반적으로 비즈니스 요구 사항이 아닌 우연히 발생합니다. 물론 약간의 인터페이스를 추출하는 코드를 리펙토링하여 데이터 제공자가 getOutcomesByUserIdgetIncomesByUserId 중 하나를 선택하고 다른 하나는 객체 팩토리를 위해 new TIncome 또는 new TOutcome을 선택할 수 있습니다. 또는 반사를 사용하십시오. 그러나 이러한 코드 변종은 더 복잡하고 지원하기가 어려울 것입니다. 나는 그것이 충분히 좋은 순간이라고 생각합니다. 그것은 변할 가치가 없습니다. 반복기 상용구 대신 for(Income income : incomes)을 사용하는 것이 좋습니다.

그러나 매핑 할 복잡하지만 유사한 데이터 구조가있는 경우 매핑을 크게 단순화 할 수있는 라이브러리가 있습니다. Dozer을 살펴보십시오.

관련 문제