엔터프라이즈 애플리케이션 아키텍처 패턴에서 Martin Fowler는 도메인 논리 구성을위한 두 가지 패턴 인 Domain Model 및 Service Layer에 대해 설명합니다. 도메인 모델 패턴은 모델 (ORM을 사용하여 데이터베이스에서 조회 한 객체)이 비즈니스 로직을 포함하는 "순수 OOP"접근 방식입니다 (하지만 다른 클래스의 로직에만 위임 한 경우 일 수도 있음).EA의 P에있는 도메인 모델 및 서비스 계층 패턴
서비스 계층 패턴은 도메인 모델 패턴 같지만 수행 할 수있는 사업 운영을 포함하는 앞의 얇은 층. MVC에서 컨트롤러는 대부분 서비스 레이어와 상호 작용합니다. 가장 잘 설계된 MVC 웹 애플리케이션이이 패턴을 사용한다고 생각합니다.
이제 내 질문에. Martin은 도메인 모델 접근 방식이 객체 지향 접근 방식이 더 좋으므로 더 좋습니다. 내 경험상, 실제로 구현하는 것은 매우 어렵습니다 (보기 : 불가능).
위의 첫 번째 다이어그램에서 주어진 예를 선택하십시오. 두 개의 '개체'Contract
및 Product
이 있습니다. 이들은 mapper를 사용하여 데이터베이스에 유지됩니다. 이 예에는 RecognitionStrategy
이 있습니다. Martin은 실제 비즈니스 로직을 포함하는이 전략에 위임하는 방법을 엔터티 자체에 두었습니다. 클라이언트는 contract.calculateRecognitions
또는 contract.recognizedRevenue(someDate)
을 사용하여이 계산을 수행합니다. 비슷한 디자인을 구현할 때는 보통 클라이언트 인터페이스를 strategy.calculateRecognitions(contract)
및 strategy.recognizedRevenue(contract, someDate)
으로 작성합니다. 이로 인해 전략과 계약을 조정하는 데 필요한 서비스 계층이 만들어집니다. 사용 된 구체적인 전략이 서비스에 주입됩니다.
마틴의 접근 방식은 확실히 디자인의 관점에서 더 매력적이지만, 설치 주위의 작업은 훨씬 더 어렵다하십시오 Product
이 고통 인스턴스화 할 때
- 이 전략에 전달. 사용할 구체적인 서비스로 카레트 된 팩토리를 통해
Product
을 생성해야하며,이를 생성 할 때 엔터티로 전달합니다. - 데이터베이스 액세스에 대한 세밀한 제어가 덜합니다. ORM 설정에 따라
Product
에 위임 한Contract
은Product
에 대한 쿼리를 수행 할 수 있습니다. 을로드했지만contract.calculateRecognitions()
을 호출 할 의도가 없으면 매퍼 (또는 ORM)에Product
을로드하는 것이 지나치게 위태로울 수 있습니다. 내 접근 방식은 엔티티가해서는 안되는 데이터베이스 추상화 계층에 대한 지식을 가지고 있기 때문에보다 세분화 된 제어를 제공합니다.
실제로 여기에 열거되지 않은 더 많은 고통 점이 있다고 확신합니다.
순수 데이터 모델 패턴을 사용하도록 확신 할 수있는 마틴의 접근법에는 어떤 이점이 있습니까?