5

스마트 개체 나는 속성이 변경된 경우 원래 속성 값을 알고있는 모든 도메인 개체를 고려합니다. 스마트 개체는 일반적으로 기본 클래스를 가지며 GetPropertyValue/SetPropertyValue 메서드를 사용하여 속성을 구현합니다. 한편 POCO 객체는 일반적으로 기본 클래스가없고 간단한 속성을 구현합니다.도메인 개체 - "스마트 개체"vs POCO

public class SmartObject : BaseDomainObject 
{ 
    public int id 
    { 
     get { return (int)this.GetPropertyValue("Id"); } 
     set { this.SetPropertyValue("Id", value); } 
    } 
} 

public class POCO 
{ 
    public int id { get; set; } 
} 

나는 스마트 한 물건을 좋아하는데, 그것은 나를 위해 많은 노력을하기 때문이다. 난 쉽게 내 모든 파생 된 도메인 클래스에서 그들을 BaseDomainObject에 모든 유용한 기능을 추가 할 수 있습니다 :

  • 일반 속성을 (ID, 상태 ... 등) 추적
  • 객체 상태 (신규, 수정, 변경되지 않음)
  • 모든 속성 (INotifyProperyChanged의 구현) 속성 변경에 대한 이벤트를 발생
  • 파생 클래스 수있을 자동으로 내가 도움이 될 수있는 모든이 다른 행동을 할 수 있습니다
  • (나는 거의이 유용 없지만) 직렬화 - 클론/Sync/IsPropertyDirty ...

한편 POCO는 매우 간단하며 기본 클래스에 종속되지 않습니다.

요즘 여기에 내가 있기 때문에 찬양 POCO의 많은 : 그것은 (일반적으로 JSON 등의 웹 브라우저에) 와이어를 통해 전송 될 수있다

  1. 는 다른에

순수 내 생각에 위의 이유는 오류라고 생각합니다.

  1. DTO는 전신환이며 도메인 객체가 아닙니다. 도메인 객체가 JSON으로 직렬화 될 때 손실되는 경우 데이터를 캡슐화하는 동작.
  2. 로직이없고 똑똑한 것도없는 더 많은 빈혈없는 도메인 모델에 대한 추적과 같은 순도 솔기에 대한이 추적.

이 모든 슬픈 표정으로 나는 여전히 그 POCO를 좋아하고 버그가있다. 당신의 의견 것입니다?

+2

리치 도메인 모델을 사용하려는 경우 오염시키지 마십시오 기술 인프라 문제가 있습니다. 언급 한 모든 것들 - 상태 추적, 속성 변경 이벤트, 일련 번호 지정 - 이러한 것들 중 어느 것도 도메인과 관련이 없습니다. 그들은 비즈니스 도메인의 복잡성을 모델로 인코딩 할 수 없습니다. – MattDavey

+0

한편 POCO는 도메인 복잡성을 모델로 인코딩하지 않습니다. DDD 표준에 따르면 두 가지 접근법 모두 매우 열악합니다. – MattDavey

+1

@MattDavey 첫 번째 의견에 동의하지만 후자에 대해서는 잘 모르겠습니다. 포코! = 빈혈, 그게 당신이 암시하는 것이라면. 일반 올드 객체 지향 *에는 데이터 외에 동작 및 해당되는 경우 도메인 동작이 포함됩니다. – guillaume31

답변

4
  • 일반적인 특성은

(ID, 상태 ...처럼) 나는 그냥 상속하는 경우 객체가 아닌 POCO을 할 생각하지 않을 예를 들어, Id 속성을 정의하는 Entity 기본 클래스. 개체는 정의에 따라 SRP를 손상시키지 않으며 제 3 자 행동을 가져 와서 개체의 "순도"를 변경하지 않습니다.

상태는 논쟁의 여지가 있습니다. 그 의미에 따라 실제로는 POCO가 아닌 추가 책임이 생길 수 있습니다.

당신이 언급 한 대부분의 다른 속성들은 도메인 객체 자체가 아닌 외부 객체에 의해 처리되어야한다고 생각합니다.

  • 객체 상태 (신규, 수정, 변경) 추적

도메인 오브젝트의 변경 추적 - 전문 프록시를 가지고 더 나은 것 이것이으로 ORMs이 무엇 일반적으로 (이 문제를 해결할).

  • 모든 속성은 (INotifyProperyChanged의 구현) 내가 볼

속성 변경에 대한 이벤트를 발생과 대부분의 UI 관련 물건 도메인 객체 프레젠테이션 객체로하지만 간다. 엔티티의 모든 속성을 관찰 할 수는 없지만 집계에서 변경 사항을 알리기 위해서는 도메인 이벤트를 사용하십시오. 내가 도움이 될 수있는 모든이 다른 행동을 할 수 있습니다

  • - 복제/동기화/IsPropertyDirty을 ...

복제는 일반적으로 그들 고려되지 않고 값 개체의 기본 동작을 할 수있다 비 POCO. 도메인 엔트리를 필요로하는 경우를 제외하고 엔티티를 복제하는 것이 나에게 덜 유용합니다. Sync/IsPropertyDirty는 버전 관리/변경 추적과 비슷한 것으로 보이며 특수한 객체에 위임해야합니다.

더 많은 빈혈 영역을위한 체이스와 같은 순도 솔기를위한이 체이스는 논리가 없거나 똑똑한 어떤 것도없는 모델입니다.

여기의 문제는 모두 "첨부 된"것입니다. SRP 준수 객체가 똑똑하지 않다는 것이 아니라 자연스러운 책임이 아닌 똑똑한 것을 포함하지 않습니다.. 마찬가지로, POCO는 바보가 아니며 외부 소스 (3D 파티 라이브러리, 프레임 워크 확장 ...)의 동작으로 이식되지 않은 객체 일뿐입니다.

+1

+1 "엔티티의 모든 속성을 관찰 할 수 없기를 원합니다. 집계의 변경을 알리기 위해 대신 도메인 이벤트를 사용하십시오." – MattDavey

+0

나는 특히 ** 용어 **가 ** 첨부 ** ** 문제 자체를 드러내는 것을 좋아합니다. – Vukoje

+0

또한 MSIL 생성으로 복제가 데이터가 객체에 저장되는 방식을 변경하지 않고도 다른 구성 요소에 쉽게 위임 할 수 있다고 생각합니다. 예 : [EmitMapper] (http://emitmapper.codeplex.com/). 또한 개체 내부의 상태 추적이 문제를 일으키는 경향이 있지만 일반적으로 ORM 상태 추적에 대한 완전한 종속성을 좋아하지 않습니다. 대개 일부 극단적 인 기술이 필요하기 때문입니다. 그러나 다행히도 새로운 객체에 대한 0 인 Id 속성은 로그 방식으로 진행됩니다. – Vukoje

1

"스마트 오브젝트"가 너무 복잡하기 때문에 모델 안의 POCO를 사용합니다. 모델은 비즈니스 로직 만 가지고 있으면서도 간단해야하고 일 수있는 기능으로 오염되지 않아야이 유용 할 수 있습니다. 특히 기술 하나 ...