2011-01-13 6 views
2

역방향으로 생성되어 내 응용 프로그램에서 사용할 수 있도록 두 개의 데이터 액세스 개체가 있습니다. 그들은 매우 유사한 테이블을 나타냅니다. 한 테이블에는 다른 테이블보다 몇 개의 추가 열이 있습니다. 이것은 비즈니스 지향적 인 데이터베이스 소유권 문제로 인해 통제 할 수없는 것입니다.인터페이스없이 복사/붙여 넣기 코드 제거

응용 프로그램에는 현재이 DAO에서 작동하는 리포지토리의 두 가지 구현이 있습니다. 구현은 매우 유사합니다. 하나는 두 번째 DAO의 추가 열에 해당하는 몇 가지 추가 작업이 있습니다. 그러나 몇 가지 예외 만 제외하면 하나의 구현은 다른 하나의 복사 및 붙여 넣기입니다. 구현은 수백 줄의 길이입니다.

그래서 복사/붙여 넣기 작업을 제거하고 싶습니다. 이상적으로는 DAO 앞에 인터페이스를 붙여 놓은 다음 추상 클래스를 사용하여 공유 코드 (거의 모든 코드)를 유지할 수 있습니다. 그러나 DAO 앞에 인터페이스를 배치 할 수는 없습니다. 그들은 역 생성 된 것을 기억하고 우리의 ORM 소프트웨어를 업그레이드하지 않고서는 이것이 합당한 선택이라고 생각하지 않습니다. (Kodo 3.x는 이것이 범위를 변경하는 것이 아니라고 생각합니다).

내가 생각할 수있는 유일한 사실은 리플렉션을 통해 약간의 불쾌감이 있지만 그 결과는 지금보다 훨씬 나쁜 것입니다.

영리한 솔루션?

편집 : 여기에 매우 난 당신이 중복 된 코드 일부 제어를 가정하고 코드 예제

package one.dao 
//reverse generated 
class UserDao { 
    getFirstName(..); 
    setFirstName(..); 
    getLastName(..); 
    .... 50 more just like this 
} 

package two.dao 
//reverse generated 
class UserDao { 
    getFirstName(..); 
    setFirstName(..); 
    getLastName(..); 
    .... the same 50 more as above 

    getSomethingElse(..); //doesn't exist in one.dao.UserDao 
    setSomethingElse(..); //doesn't exist in one.dao.UserDao 
} 

class RepositoryOne(one.dao.UserDao userDao) { 
    //insert code here. perform operations on nearly all methods, lots of code 
} 

class RepositoryTwo(two.dao.UserDao userDao) { 
    //insert code here. same as Repository one 

    //some extra code that isn't above, maybe 10 lines 
} 
+1

간단한 \ 물결 무늬가있는 코드 샘플을 게시 할 수 있습니까? – javamonkey79

답변

2

을 약화된다. 코드 생성기에서 모두 생성하는 경우 API & 구성에서 솔루션을 검색해야합니다.

상속이 작동하지 않으면 작곡을 시도하십시오. 공유 코드 (SharedCode)를 보유 할 세 번째 클래스를 만듭니다. 두 개의 기존 클래스 각각에 SharedCode 클래스의 private 멤버 인스턴스를 제공하고 SharedCode에 구현 된 모든 루틴을 메서드를 통해 멤버 인스턴스에 전달합니다.

+0

글쎄, 문제는 코드가 거의 똑같이 "읽습니다"뿐입니다. 기술적으로 그것은 다른 클래스에서 작동합니다. 귀하의 게시물 뒤에 예제를 추가, 나는 그것을 조금 취소 생각합니다. – emulcahy

+0

당신이 원하는 것은 오리 타이핑입니다. 나는 자바에서 그것을하는 방법을 모르는 척하지 않을 것이다. 그러나 그것의 견고한 토론이 여기에있는 것처럼 보인다 : http://stackoverflow.com/questions/4330330/simulating-duck-typing-in-java –

관련 문제