2009-10-06 3 views
0

최근에 C++ DLL에서 'loadCar'메소드를 설계하는 최선의 방법에 대해이 C++ DAL이 게시되었습니다. 'bool DAL :: loadCar (int id, Car &) {} '이 (가) 사용할 최고의 서명이됩니다.C++ DAL 디자인 - 복합 객체로 외래 키 테이블 포함

이제는 많은 유스 케이스에서 클라이언트 코드가 종종 car 객체로 자동차 제조업체를 검색하려고합니다. 데이터베이스의 'car'테이블에는 제조업체 테이블에 대한 외래 키 (MANUFACTURER_ID)가 있습니다. 지금 Car 클래스에서 선택 필드를 가지고 생각하고, 무엇인가 :

class Car 
{ 
    public: 
    void setModel(...); 
    void setEngineSize(...); 
    Manufactuer getManufacturer(); 

    private: 
    Manufactuer /* Reference, Pointer or Value - TBD */ manufacturer_; 

    // etc. 
}; 

문제는 당신이 즉, 포인터, 참조 또는 간단한 값 유형 중 하나로서 제조 업체 개인 회원있을 것입니다 :

Manufactuer *manufacturuer; 
Manufactuer &manufacturuer; // Illegal - needs to be initialised, so use Null Obj Pattern? 
Manufactuer manufacturuer; 

이제 loadCar 메서드에는 bool loadManufactuer 매개 변수 (기본값은 false)가 있습니다. 나는. 우리는 단지 제조사에 로딩의 비용과 저장 오버 헤드를 필요로한다. 이렇게하면 제조업체를 포인터로 저장해야한다고 생각합니다 (첫 번째 옵션).

필자가 구성을 한 레벨 위로 올려 놓지 않는 이유는 DAL이 단일 데이터베이스 쿼리를 사용하여 Car + Manufacturer를 작성할 수 있기를 바랍니다. 여기에 표시되지 않았지만 사용자는 Car 객체 컬렉션을 쿼리 할 수 ​​있습니다.

포인터를 사용하여 레퍼런스와 포인터가 섞여있는 것처럼 느껴졌지만 임시 변수가 많이 도입되지 않으면 어떻게 수행되는지 알 수 없습니다. 아마도 Singleton Null Object가 도움이 될까요?

희망이 있습니다.

+0

Btw, 합의점은 사용하는 WORST 서명이었습니다.) – Goz

+0

당신이 옳았는데, 어떻게 입력했는지 알 수 있습니다. – ng5000

답변

1

약간 다른 접근 방식을 취해야합니다. Car 객체에 제조업체 ID가없는 이유는 무엇입니까? 어떤 점에서 제조업체가 필요한 경우 id를 통해로드하십시오. 게으른로드로 숨길 수 있습니다.

기본적으로 해당 필드에 액세스하는 경우에만 필드를 채우는 제조업체 개체가 있습니다.

+0

많은 수의로드가 제조업체를 필요로하기 때문에 . 실제 응용 프로그램에서 제조업체 데이터가 필요할 때 데이터베이스로 다시 이동하는 것은 엄청나게 비쌉니다. – ng5000

1

제조사가 여러 자동차에서 동일 할 수 있으므로 제조업체 컬렉션을 포인터 모음으로 관리하는 제조업체 서비스를 만듭니다. 이 서비스는 제조업체를 생성하고 제조업체를 삭제하며 제조업체를 검색하고 제공 할 수 있습니다.이 Singleton 클래스에는 데이터베이스에서 데이터를 가져 와서 모든 제조업체를 생성하는로드 함수가 있습니다.

그러면 Car 개체가 제조업체에 서비스를 요청하고 포인터를 저장할 수 있습니다. 이 방법을 사용하면 Car 클래스는 Manufacturer 포인터 만 사용하지만 Manufacturer 포인터 관리는 서비스의 사실이됩니다.

+0

나는이 아이디어를 좋아한다. 제조업체 오브젝트의 캐시는 좋은 계획 일 것이다. 특히 preet의 아이디어와 결합하면. – Goz

+0

자동차 또는 제조업체의 캐싱 전략을 외부화하는 것을 잊지 마십시오. 이를 통해보다 통제 된 방법으로 더 유연하게 관리 할 수 ​​있습니다. –

+0

실제 응용 프로그램에서 이러한 객체는 매우 자주 변경되는 데이터 테이블을 나타냅니다. 따라서 캐쉬 TTL은 가치가 없을 정도로 낮아야합니다.또한 현실 세계에서 "제조사"의 크기와 수는 우리가 모두 캐시하면 실제 메모리 부담이됩니다. – ng5000