2009-07-18 3 views
3

DDD를 살펴보면서 우리는 데이터베이스를 우리가 운영하는 다양한 모델로 추상화하여 모델이 살아있는 저장소로 간주합니다. 그런 다음 데이터 레이어와 서비스/비즈니스 레이어를 추가합니다. 제 질문은 이렇게함으로써 뚱뚱한 모델을 구축하여 데이터 이전에 비효율을 발생시키는 것입니까?지방 도메인 모델 => 비효율적입니까?

예를 들어 고객에게 화면에 인보이스를 표시하는 시스템이 있다고 가정 해보십시오. 송장 전적으로 필요가 고객 이름을 인쇄 할 수

class Invoice { 
    Customer _customer; 
    OrderItems _orderitems; 
    ShippingInfo _shippingInfo; 
} 

class Customer { 
    string name; 
    int customerID; 
    Address customerAddress; 
    AccountingInfo accountingInfo; 
    ShoppingHistory customerHistory; 
} 
    (for the sake of the question/argument, 
    let's say it was determined that the customer class had to 
    implement AccountingInfo and ShoppingHistory) 

, 왜 우리 모두를 수행 할 것입니다 : OOP의 관점에서 그것의 생각, 우리는 아마 같은 약간 보이는 물체로 끝날 것 다른 수하물이 있습니까? 저장소 유형의 접근 방식을 사용하면 이러한 리소스 (CPU, 메모리, 복잡한 쿼리 조인 등)가 모두 필요한 이러한 복잡한 도메인 개체를 만든 다음이를 통해 클라이언트로 전송할 수 있습니다.

인보이스 클래스에 customerName 속성을 추가하는 것은 추상화에서 벗어나 끔찍한 관행처럼 보입니다. 세 번째 손에서, 고객과 같은 객체를 채우는 절반은 동일한 객체 (예 : 주소가 있지만 ShoppingHistory가없는 인스턴스와 AccountingInfo가없는 객체)의 여러 버전을 만들게되므로 매우 나쁜 아이디어처럼 보입니다 주소 등). 나는 무엇을 놓치고 있는지, 아니면 이해하지 못하고 있는가?

답변

1

좋은 오브젝트 관계형 맵퍼가 관계를 지연시킬 수 있기 때문에 인보이스에 대한 고객을 되돌리고 계정 및 쇼핑 내역은 무시합니다. oject-relational mapper를 사용하지 않는다면 자신 만의 것을 굴릴 수 있습니다.

자주 발생하는 부분은 트랜잭션 처리가 끝났기 때문에 클라이언트에서 수행 할 수 없으므로 올바른 데이터가로드되었는지 확인하는 것이 서비스 계층에 달려 있습니다.

올바른 데이터를 테스트 할 수 있고 너무 많지는 않은 경우 서비스 레이어의 단위 테스트를 수행하는 것이 좋습니다.

+0

좋은 지적. 나는 게으름 짐을 완전히 이해하지 못했음에 틀림 없다고 생각합니다. << – MunkiPhD

0

"고객 클래스가 AccountingInfo 및 ShoppingHistory를 구현해야한다고 판단 했으므로 시스템이 수행하는 유일한 작업이 청구서를 분명하게 표시하는 것은 아닙니다. 고객이 다른 기능을 필요로한다는 것을"결정한 "이유는 무엇입니까? 그렇지 않으면?-).

어쨌든 (다른 기능의 경우) 고객 테이블이 필요합니다. 물론 인보이스 프린터는 다른 기능에서 사용되는 동일한 테이블에서 고객 데이터 (이름 만)를 가져와야합니다. 시스템에서.

"오버 헤드"는 순수하게 환상적입니다. 하나의 기능을 고립 상태로 볼 때 존재하는 것처럼 보이지만 전체 시스템을 전체적으로 볼 때 전혀 존재하지 않습니다.