2017-02-04 2 views
1

도메인 기반 디자인 접근법에 대해 혼란스러워합니다. 그물에 근원에서 나는 당신의 Domain ObjectsDatabase Objects를 분리하는 방법다는 것을 이해했다 그러나 나는 2 사이 다름을 이해하지 않는다.장고 및 도메인 기반 디자인

예를 들어 django 튜토리얼에서 Polls 예제의 code을 사용하면 두 모델 PollsChoice이 있습니다.

이 있습니까 domain level objects 또는 database level objects입니까?

ORM이있는 DDD가 필요합니까? 그래, 당신은 당신이 ORM 예를 들어

와 DDD 접근 방식을 사용할 필요가 좋은 상황을 제공 할 수있는 경우

,이

class Polls(models.Model): 
    question = models.CharField(max_length=200) 
    pub_date = models.DateTimeField('date published') 

DDD 접근 코드 나는 사람들이

를 작성 본 모델입니다
class PollService(object): 
    def __init__(self, poll_repository): 
     self.poll_respository = poll_respository 

    def update(self, poll_id): 
     poll = self.poll_respository.fetch_by_id(poll_id) 
     poll.question += '?' 
     self.poll_respository.update(poll) 

#assume that the following code works? 
class PollRepository(): 

    def __init__(self, db): 
     self.db = db 

    def update(self, poll): 
     try: 
      self.db.session().add(poll) 
      self.db.session.commit() 
     except Exception: 
      self.db.session.rollback() 

올바른 방법입니까? 여기에 많은 중복 코드가 있지만 사람들은 Polls이 도메인 수준 개체이며 데이터베이스와 직접적으로 관련이 없다고 말합니다.

DDD에는 항상 DDD- 리포지토리가 있습니까? 우리는 ORM이 있다면 왜 우리는 DDD 저장소를 필요

또 다른 방법

views.py 
def update_poll(poll_id): 
    poll = models.Polls.objects.get(poll_id) 
    poll.question += '?' 
    poll.save() 

이 방법에 문제가 있나요? 이 Django Design Philosophy 페이지에 설명

+0

"DDD에는 항상 DDD- 리포지토리가 있습니까?"- 아니요. CQRS와 이벤트 소싱 –

답변

4

액티브 레코드 패턴

장고는 Active Record Pattern 사용 향해 맞게된다.

두 번째 예제는이 패턴을 따릅니다. 모델 자체는 속성, 동작 및 데이터 액세스를 포함합니다.

더 많은 동작을 모델에 푸시면이 패턴을 DDD와 같은 방식으로 계속 사용할 수 있습니다. 예 :

views.py 
def update_poll(poll_id): 
    poll = models.Polls.objects.get(poll_id) 
    poll.add_question() 
    poll.save() 

는이있다 : 당신의 예에서, 패턴의보다 효과적인 사용은 update_poll 방법이 될 수 있도록, 설문 조사 개체의 의도 드러내는 방법으로 라인을

poll.question += '?' 

를 포장하는 것 응용 프로그램 흐름 논리 (update_poll 메서드)에서 비즈니스 논리를 분리하는 이점 (update_poll 메서드)

실제로 방법의 의도 또는 목적을 실제로 보여주는 이름을 사용하는 것이 좋지만 add_question.

그러나 이렇게해도 순수한 DDD가 아닌 활성 레코드 패턴을 계속 사용하고 있습니다.

"당신은 ORM이있는 DDD가 필요합니까?"

DDD와 ORM 다른 문제를 해결하려고합니다. ORM들을 좀 더 객체 지향 방식으로 데이터베이스의 설정과 같은 기록 중심의 세계를 추출하는 편리한 방법을 제공합니다.

DDD는 지원하는 방법이다

많은 DDD 시스템은 ORM을 사용하여 데이터베이스에서 검색 및 지속 (여러 가지 이유로 ORM을 리포지토리에 포장하는 경우가 있음)의 인프라 문제를 해결하지만 DDD 포커스는 다음과 같습니다. 고려중인 도메인을 얼마나 적절하게 모델링하는지에 대한 정보를 제공합니다.

예를 들어 비즈니스 로직이 비교적 간단하기 때문에 DDD의 이점을보기가 어렵습니다.

DDD - Domain Driven Design by Eric Evans의 공식 출처를 통해 접근 방식 및 가치를 추가하는 상황에 대한 언어 불가 지론 개요를 읽어 보는 것이 좋습니다.

업데이트

당신은 질문 :

는 당신이 ORM에 DDD를 사용하여 하나의 좋은 예 저를 업데이트 할 수는 의미를

우리가 사용하는 경우를 만든다 ORM DDD 저장소가 필요 없다고 생각합니다.

내가 생각하기에 더 좋은 방법은 ORM을 사용할 때 ORM 저장소입니다. 모델을 요청하면 모델을 반환합니다. 이것이 저장소의 목적입니다.

  1. 가 쉽게 특정
  2. 추상적 인 단위 테스트를 단순화하기 위해 모의 저장소를 주입 할 수 있도록 : 사람들이 '저장소'라는 클래스에 포장하는 경우가 몇 가지 중 하나를 원하기 때문에 보통이다 ORM 기술은 나중에 서비스 또는 도메인

overview of the repository pattern는 DDD 저장소 패턴의 또 다른 좋은 작성자을 제공을 터치하지 않고 ORM을 변경할 수있는 유연성을 제공하는 데 사용됩니다.

+0

Chris에게 감사드립니다. ORM과 함께 DDD를 사용하는 것이 바람직한 한 가지 좋은 예를 통해 나를 업데이트 할 수 있습니까? –

+0

ORM과 함께 ddd-repositories를 사용해야합니까? ORM을 사용한다면 DDD 저장소가 필요 없다고 생각합니까? –

+1

DDD의 '모델'은 엔티티, 값 객체, 서비스, 저장소, 집계, 골재 및 기타 도메인을 나타내는 데 필요한 기타로 구성된 '도메인 모델'입니다. django 모델의 모델은 엔티티입니다. 즉, DDD에서 model은 도메인 모델입니다. – andho

관련 문제