PCB라는 도메인에 관한 지식 내용
프로로타입이 구체적일 경우 도메인 전문가는 모델이 의미하는 바와 동작하는 소프트웨어와 모델 간의 관계를 좀더 명확하게 이해할 수 있었다.
새 기능을 설명할 때면 PCB 엔지니어에게 객체의 상호작용 방식에 관한 시나리오를 설명하게 했다.
효과적인 모델링의 요소
지식 탐구
지식 탐구는 혼자서 하는 활동이 아니다. 개발자와 도메인 전문가로 구성된 팀은 대체로 개발자가 이끄는 가운데 협업한다.
과거의 폭포수 개발 방식에서는 업무 전문가가 분석가에게 설명하고 다시 분석가는 업무 전문가가 설명한 내용을 이해하고 추상화해서 소프트웨어를 코드로 작성하는 프로그래머에게 넘긴다.
모델을 만들어 내는 데 따르는 모든 책임이 분석가에게 있으며, 이러한 모델은 오로지 업무 전문가가 알려주는 사항에만 근거한다.
프로그래머가 도메인에 관심이 없다면 그 이면에 숨겨진 원리는 알지 못한 채 애플리케이션에서 수행해야 할 사항만 습득한다.
애초부터 추상화를 시작해서 더욱 많은 일을 해낼 수 있는 모델로 발전시킬 것이다.
도메인 전문가의 지속적인 관여로 모델은 심층적인 업무 지식을 반영하고, 추상화된 개념은 참된 업무 원칙에 해당한다.
지속적인 학습
풍부한 지식이 담긴 설계
도메인에 관련된 엔티티만큼 업무 활동과 규칙도 도메인에 중요한데, 어떠한 도메인에도 다양한 범주의 개념이 존재한다.
개발자는 모델의 변경에 맞춰 구현을 리팩터링해서 모델의 변경된 사항을 표현하고, 애플리케이션에서는 그러한 지식을 활용한다.
선박 화물 운송 예약 애플리케이션
fun makeBooking(cargo : Cargo, voyage : Voyage) : Int {
val confirmation : Int = orderConfirmationSequence.next()
voyage.addCargo(cargo, confirmation)
return confirmation
}
선박이 운항 중에 나를 수 있는 화물의 최대치보다 예약을 더 받아들이는 것이 해운 산업의 관행이다. 이를 초과예약이라고 한다. 간혹 110% 예약과 같이 용적을 나타낼 때 퍼센트를 쓰기도 한다.
fun makeBooking(cargo : Cargo, voyage : Voyage) : Int {
val maxBooking = voyage.capacity() * 1.1
if((voyage.bookedCargoSize() + cargo.size) > maxBooking){
return -1
}
val confirmation = orderConfirmationSequence.next()
voyage.addCargo(cargo, confirmation)
return confirmation
}
정책
정책이란 잘 알려진 strategy 디자인 패턴의 또 다른 이름이다.
우리가 담고자 하는 개념은 정책이라는 의미와 잘 맞아 떨어지며, 이러한 정책도 똑같이 도메인 주도 설계의 중요한 동기에 해당한다.
fun makeBooking(cargo : Cargo, voyage : Voyage) : Int {
if(!overBookingPolicy.isAllowed(cargo, voyage)){
return -1
}
val confirmation = orderConfirmationSequence.next()
voyage.addCargo(cargo, confirmation)
return confirmation
}
fun isAllowed(cargo : Cargo, voyage : Voyage) : Boolean{
return (cargo.size + voyage.bookedCargoSize()) <= (voyage.capacity * 1.1)
}
이렇게 하면 초과예약이 별개의 정책이라는 사실을 모든 이가 분명히 알게 될 것이며, 이 규칙의 구현 또한 명시적으로 드러나고 다른 구현과 분리된다.
심층 모델
유용한 모델은 겉으로 드러나 있는 경우가 거의 없다.
해운 업무를 바라보는 시각이 장소 간 컨테이너의 이동에서 엔티티와 엔티티 사이의 화물에 대한 책임 이동으로 바뀐 것이다. 아울러 이러한 책임 이동을 취급하는 것과 관련된 기능이 더는 선적 작업에 부자연스럽게 붙어 있는 것이 아니라 작업과 책임 간의 중요한 관계를 토대로 만들어진 모델의 중심에 자리잡았다.
지식 탐구는 탐험과도 같아서 어디서 끝나게 될지 알지 못한다.