2012-08-14 2 views
0

잘못된 단어를 사용했을 수 있으므로 비즈니스 개체 (BO)를 말할 때 최대 절전 모드를 사용하는 데이터베이스 테이블에 매핑 된 클래스에 대한 참조가있는 클래스를 의미합니다 비즈니스 로직으로서.최대 절전 모드, 하위 클래스 및 방문객 패턴

내가 직면 한 문제는 반사 또는 instanceof를 사용하지 않고 하위 클래스에 적합한 BO를 인스턴스화하는 것입니다.

예를 들어 Animal-table에 대한 하나의 참조가있는 Pen-table이 있는데, Cat 테이블과 Dog 테이블 (모두 일대일 참조)이 있습니다. 클래스는 다음과 같이 다소 찾습니다

Pen p = ... // Get or load from database 
PenBO pbo = new PenBO(); 
pbo.setPen(p); 

그런 다음 나는이 같은 클래스를 사용합니다 :

public class Pen { 
    private Animal a; 
    // Getters and setters 
} 
public class Animal { 
    // Getters and setters 
} 
public class Dog extends Animal { 
    // Getters and setters 
} 
public class Cat extends Animal { 
    // Getters and setters 
} 
public class PenBO { 
    private Pen p; 
    public AnimalBO getAnimalBO() { ... } 
} 
public interface Action { 
    void visit(DogBO dbo); 
    void visit(CatBO cbo); 
} 
public class Sound implements Action { 
    void visit(DogBO dbo) { ... } 
    void visit(CatBO cbo) { ... } 
} 
public interface AnimalBO { 
    void accept(Sound s); 
} 
public class DogBO implements AnimalBO { 
    Dog d; 
    void accept(Sound s) { 
     s.visit(this); 
    } 
} 
public class CatBO implements AnimalBO { 
    Cat c; 
    void accept(Sound s) { 
     s.visit(this); 
    } 
} 

그럼 난 그냥 보스는 보스의 수-방법 안에이처럼 인스턴스화 작업

pbo.getAnimalBO().accept(new Sound()); 

내가 작업하고있는 getAnimalBO 메소드입니다. 펜의 Animal-instance를 기반으로 BO의 올바른 인스턴스를 반환하고 싶습니다.

"현재 펜의 실제 동물에 대해 instanceof 확인을 사용할 수는 있지만 분명히 좋지는 않습니다. 내가 생각했던 또 다른 대안은 리플렉션을 사용하여 클래스 이름을 얻은 다음 나중에 "BO"를 추가하고 그 인스턴스를 얻는 것이었지만, 또한 꽤 추악합니다.

getAnimalBO 주위에 다른 visitor-pattern을 래핑하려고했지만 캐스팅하지 않고 올바른 visit-method를 선택할 수없고 non-BO 클래스에 accept-methods를 추가하고 싶지 않습니다.

그 방법을 효율적으로 작동시킬 수있는 영리한 방법이 없다면 핵심 문제일까요? 나는 Hibernate에 대한 모범 사례를 찾지 못했다. Hibernate와 visitor 패턴의 몇 가지 예제는 좋은 방법이 될 수없는 매핑 된 클래스에 accept-methods를 추가하기 만하면된다 ...

답변

1

실제로 문제는 상속에 대한 OO 문제이며, 하나의 클래스 계층 구조에서 평행 한 당신은 이미 이것과 Hibernate 매핑에 대한 데이터베이스 모델링을 해결했으며, 방문자 구현에 명백한 문제는 없습니다. 매핑 된 클래스 계층 구조에 방문자 패턴을 적용하지 않으려 고하므로 두 계층 구조간에 변환하는 데 문제가 발생했습니다.

일들이 서로

는 코드의 오메 조각, 그리고 알고에 대한 CatBOCat 등에 해당하는 것을 알고에 대한 책임을해야 할 것됩니다 Pen 개체의 Animal 속성은 다음, 실제로 포함 PenBO 객체의 AnimalBO Cat 경우 그 속성은 실제로 CatBO입니다. 감안할 때 반환 된 인스턴스 Animal의 유형을 결정할 수 있어야하므로 instanceof 또는 리플렉션 중 하나를 사용하는 것을 피할 수는 없습니다. instanceof에 대한 귀하의 반대는 무엇입니까? 클래스 이름을 얻고 "BO"를 추가하는 것은 매우 불쾌하고 추악합니다. 분명히 작동시킬 수는 있지만 동의합니다. 그러나 Animal을 가지고 instanceof을 사용하고 오른쪽 BO 클래스를 선택하여 AnimalBO을 반환하는 책임이있는 단일 메서드는 상황에 따라 나쁜 것은 아닙니다.

내가 묻는 질문은 한 클래스 계층 구조에서 다른 계층 구조로 매핑하는 이유입니다.으로 지정하고 매핑 된 클래스에 accept 메서드를 추가하고 을 "좋을 수 없다"라고 말했습니까?이지만이 방법을 사용한 이유는 정당하지 않습니다. 이미 자신에게 제시 한 옵션보다 더 나쁜가요? 매핑 된 클래스 계층 구조에 방문자 패턴을 추가하면 실제 비즈니스 로직이 포함되지 않으므로 단순히 방문객 패턴을 사용하여 계층 구조 전반에 비즈니스 로직을 적용 할 수 있습니다. 따라서 비즈니스 로직 계층에는 단순한 일반 방문자 구현이 포함되어 있으며, 매핑 된 클래스 또는 도메인 계층은 POJO와 기본 방문자 구현을 포함하며 실제로 원하는대로 분리 할 수 ​​있습니다.

+0

답변 해 주셔서 감사합니다. 나는 instanceof 또는 relfection과 함께 가고 싶지 않은 이유를 제공하지 못해 죄송합니다. 새로운 클래스를 추가하거나 새로운 클래스에 "BO"가 필요하다는 메모를 남겨 두어야 할 때 업데이트 할 장소가 더 필요했습니다. 나는 당신이 매핑 된 클래스에서 accept 메소드를 사용하는 것에 대해 좋은 점을 알았고 아마 그것과 함께 갈 것이라고 생각합니다. 매핑 된 클래스에 getter 및 setter 외에 다른 BO 클래스를 만들고 모든 새 Animal 하위 클래스에 instanceof를 추가하는 것만 큼 많은 부담을 느끼지는 않습니다. – user1540134