2012-02-18 2 views
1

DDD와 집계에 대해 읽은 후에 모든 것을 집계에 적용하려고합니다. 거의 모든 블로그 게시물이나 튜토리얼 등에서 같은 예를 사용하는 것은 도움이되지 않습니다 : 주문과 주문.한 개체가 집계의 일부인지 여부를 결정하는 방법

개체가 자체적으로 살아갈 수 있다는 것은 무엇을 의미합니까? 도메인을 모델링 할 때 자체적으로 살아갈 수 없다는 의미입니까 아니면 실제 세계에서 자체적으로 존재하지 않는다는 것을 의미합니까?

나는 사용자가 운전을 추적 할 수있는 응용 프로그램을 만들고 있습니다. 같은, 기간, 거리 등등.

내가 사람을 모델링의 목적으로 StudentDriver 클래스를 만든

은 "책을"모델링을위한 DrivingLog, 각 "라인"그/그녀가 구동 될 때 사용자가 만드는 것이/기록을 모델링 DrivingRecords. 여기에는 지속 시간, 거리 등이 포함됩니다.

이제 질문은 : StudentDriver이 모든 클래스의 총계 루트로 간주되고 모든 작업이 StudentDriver을 통과해야합니까? 아니면 StudentDriver이 루트이고 DrivingLog이 다른 루트가되어야하고 StudentDriverDrivingLog이 서로 연관되어 있어야합니까?

어떻게 결정 하시겠습니까? 이 예제와 일반적으로 모두.

답변

3

DDD는 훌륭한 책이었으며 Evans가 Aggregate 패턴에 대해 말한 것을 읽는 것을 즐겼습니다. 나는 네가 일을 너무 멀리하고 있다고 생각한다. 내가 알고있는 것처럼

, 집계 패턴의 목적은 : 당신이 어떤을 이해할 수 없기 때문에 프로그램의 모든 부분은 모든 다른 부분과 상호 작용하는 경우가 어려워진다

는 이해 (디버깅)을 고립 된 한 부분; 어떤 부분을 이해하기 위해서는 모든 것을 이해해야합니다.

또한 상호 작용이 모든 방향으로 진행될 때 개체 상태를 손상시키는 버그는 추적하기가 어렵 기 때문에 모든 곳을 살펴 봐야합니다. 특정 객체를 수정할 수있는 코드가 제한적일 경우 해당 객체를 항상 올바른 상태로 유지하는 것이 훨씬 쉽습니다.

집계 패턴에는 집계 "루트"인 하나의 개체와 루트에 포함 된 다른 개체가 있습니다. 루트 만이 포함 된 객체를 "만질"수 있으므로 상호 작용이 통과 할 수있는 경로의 수를 줄일 수 있습니다.

이것은 개념적인 "툴킷"에 포함시키는 것이 유용한 생각이지만 그렇게하기 위해 사용할 필요는 없습니다."개체가 자체적으로 살아갈 수있다"는 것을 의미하는 것이 아니라 실제로 StudentDriverDrivingLog으로 무엇을하고 싶은지 살펴보고 다음과 같이 생각하십시오.

이 코드는 더 간단하고 관리하기 쉽습니다. 다른 클래스가 DrivingLog으로 직접 작업 할 수있게하거나 해당 데이터를 검색하거나 수정하기 위해 StudentDriver에있는 메소드를 호출해야한다면 어떻게해야합니까? 코드가 어떻게 읽히는 지 상상해보십시오. 어떤 경우에는 "외부"수업에서 drivingLog.mileage()을 쓸 수도 있습니다. 다른 쪽은 studentDriver.loggedMileage()이 될 것입니다.

DDD에서 만든 가장 좋은 점 중 하나는 일치 모델과 구현의 중요성이었습니다. 여기에는 실제 용어로 이해할 수있는 (코드에서) 식별자를 선택하는 것까지 포함됩니다. 그것과 조화를 이루면서 코드가 수행하는 작업을 살펴보고 생각할 수 있습니다.이 작업이 실제로 의미하는 바를 생각하면 드라이버 나 로그 북에 대해 수행되는 작업입니까? 실제로 작업이 로그 북을 위해 수행되는 작업 인 경우 집계 패턴을 사용하려는 경우 DrivingLog에 위임하는 메소드를 StudentDriver으로 사용하지 마십시오.

+0

+1 멋진 답변 –

+0

그래서 클라이언트 (사용자 등)가 프로그램의 다양한 부분을 더 쉽게 이해할 수 있도록 단계별 패턴을 적용하는 것이 더 낫습니다. 이 경우 운전 기록은 drivingrecord의 총계 일 수 있지만 학생 드라이버는 세 개의 모든 수업에 대해 집계가 필요하지 않습니까? 이 두 가지 집합 루트를 가질 때 클라이언트는 두 엔티티를 쉽게 이해할 수 있습니다. 이 올바른지? 아니면 그것이 당신이 의미하는 것이 아닌지 설명하려고 할 수 있습니까? – LuckyLuke

+0

@Bob, 특정 디자인 패턴을 사용하는 것이 "더 좋을 때"에 대한 단순하고 컷 앤드 드라이 한 대답은 없습니다. Aggregate 패턴을 사용할지 여부와 같은 디자인 선택 사항에는 장단점이 있으므로 사용자의 특정 상황에 따라 장단점을 고려해야합니다. "A가 현실 세계에서 B 없이는 살 수 없다면, Aggregate로 모델링되어야합니다"와 같은 간단한 규칙은 아무 것도 도움이되지 않습니다. 그러한 규칙을 기계적으로 따르는 것보다 패턴의 * 목적 *을 이해하고 자신이 수행하는 것에 적합한지 판단해야합니다. –

0

집계는 전체/부분 관계가있는 두 클래스 간의 관계입니다. 예 : 자동차는 전체이며 바퀴가 그 부분입니다.

StudentDriver가 소유하고있는 경우 StudentDriver를 DrivingLog의 소유자로 만들 수 있습니다. 기존 학생이 없다면 DrivingLog를 지키지 않아도됩니다. 따라서 DrivingLog는 자체적으로 존재할 수 없습니다.

StudentDriver는 루트가되어야하며 DrivingLog를 알고 있어야합니다. 그러나 DrivingLog는 StudentDriver에 대해 알지 못합니다. (단방향 정렬과 마찬가지로)

관련 문제