도메인 엔터티가 단일 책임 원칙을 위반합니까?


14

실체의 단일 책임 (변경 이유)은 자신을 고유하게 식별해야하며, 다시 말해서 책임을 찾을 수 있어야한다.

에릭 에반의 DDD 서적, 페이지. 93 :

엔티티의 가장 기본적인 책임은 행동을 명확하고 예측할 수 있도록 연속성을 설정하는 것입니다. 그들은 여분을 유지하면 최선을 다합니다. 속성이나 동작에 중점을 두지 않고 Entity 오브젝트의 정의를 가장 본질적인 특성, 특히이를 식별하거나 찾거나 일치시키는 데 주로 사용되는 특성으로 분류하십시오. 해당 동작에 필요한 개념 및 속성에 필수적인 동작 만 추가하십시오.

그 외에도 핵심 개체와 관련된 다른 개체의 동작과 특성을 제거하려고합니다. 개체 문제 외에도, 개체는 소유 한 개체의 작업을 조정하여 책임을 수행하는 경향이 있습니다.

1.

... ENTITY 객체의 정의를 가장 본질적인 특성, 특히이를 식별하거나 찾거나 일치시키는 데 주로 사용되는 특성으로 분류하십시오. 개념에 필수적인 행동 만 추가하십시오 ...

엔터티고유 한 ID 가 할당 되면 해당 엔터티 가 설정되므로 해당 엔터티가 해당 아이덴티티유지 하거나 자신을 식별 하는 아무런 동작이 필요하지 않다고 가정 합니다 . 따라서 저자 가 " 개념에 필수적인 행동 "으로 어떤 행동을 언급하고 있는지 ( find그리고 match 운영 외에 ) 이해하지 못하는가 ?

2.

... ENTITY 객체의 정의를 가장 본질적인 특성, 특히이를 식별하거나 찾거나 일치시키는 데 주로 사용되는 특성으로 분류하십시오. 그 외에도 핵심 ENTITY와 관련된 다른 개체의 동작과 특성을 제거하십시오.

따라서 개체를 식별하는 데 도움이되지 않는 모든 동작은 여전히 ​​해당 동작 을 해당 개체 의 본질적인 특성으로 특성화 합니다 (즉, 짖는 소리는 개에게는 고유하고, 비행은 비행기에는 고유하고, 알을 낳는 것은 조류에 고유합니다.) ), 해당 개체와 관련된 다른 개체에 넣어야합니까 (예 : 개 개체와 관련된 개체에 짖는 동작을 넣어야합니까?)

삼.

그 외에도 핵심 ENTITY와 관련된 다른 개체의 동작과 특성을 제거하십시오.

A) MyEntity대표의 책임 A_respB_resp객체 ab각각.

대부분의에도 불구 A_resp하고 B_resp작업이 수행됩니다 ab경우, 클라이언트는 여전히 제공됩니다 A_respB_resp를 통해 MyEntity클라이언트의 관점에서 두 가지 책임에 속하는지, 어떤 수단 MyEntity. 따라서, 의미하지는 않습니다 MyEntity또한이있다 A_respB_resp책임과 같은 위반 SRP를 ?

B)는 우리가 가정해도 A_respB_resp에 속하지 않는 MyEntity, MyEntity여전히 책임이 AB_resp개체의 작업 조정의 ab. 그래서하지 않습니다 MyEntity위반 SRP를 최소로하기 때문에 그것은이 두 가지 책임 고유 또한 자신을 식별하고을을 - AB_resp?

class MyEntity
{
    private A a = ...
    private B b = ...


    public A GetA()
    { ... }

    public B GetB()
    { ... }

    /* coordinates operations of objects a and b */
    public int AworkB()
    { ... }
}

/* A encapsulates a single responsibility resp_A*/
/* A is value object */
class A
{ ... }

/* B encapsulates a single responsibility resp_B*/
/* B is value object */
class B
{ ... }

최신 정보:

1.

이 문맥에서 동작은 의미 적 동작을 나타냅니다. 예를 들어, 클래스를 고유하게 식별하는 데 사용되는 클래스의 속성 (예 : 도메인 개체의 속성)에는 동작이 있습니다. 이것은 코드에서 직접 표현되지는 않습니다. 예상되는 동작은 해당 속성에 대한 중복 값이없는 것입니다.

따라서 코드에서 엔티티의 ID를 유지하는 동작 (즉, 작업)을 실제로 구현할 필요는 거의 없습니다. 엔티티), 그러나 우리가이 ID 속성을 코드로 변환 할 때, 그 의미론의 일부가 손실됩니다 (즉, ID 값을 고유하게 확인하는 부분이 손실 됨)?

2.

Furthmore, Age와 같은 속성은 Person 엔터티 외부에 컨텍스트가 없으므로 다른 객체로 이동하는 것이 의미가 없습니다 ... 그러나 그 정보는 고유 식별자와 다른 위치에 쉽게 저장 될 수 있습니다. 행동에 대한 혼란스러운 참조. 나이는 게으른로드 값일 수 있습니다.

a) Age속성이 게으르게로드 된 경우 의미 적 Age으로 속성 일지라도 동작이라고 부를 수 있습니까?

삼.

유효한 주소인지 확인하는 등 주소에 특정한 작업을 쉽게 수행 할 수 있습니다. 디자인 타임에 알지 못할 수도 있지만이 전체 개념은 객체를 가장 작은 부분으로 나누는 것입니다.

Age다른 객체로 이동 하여 컨텍스트를 잃어 버릴 것이라는 데 동의하지만 DateOfBirth속성을 다른 객체로 옮길 경우 컨텍스트가 손실되지 않지만 일반적으로 이동하지는 않습니다.

우리가 Address다른 물체로 옮긴 주된 이유는 무엇입니까 DateOfBirth? 때문에이 DateOfBirth더 본질적이고 Person실체 이하 기회가 있기 때문에 미래의 어딘가에서 우리는에 작업의 특정을 정의해야 할 수도 DateOfBirth?

4. 나는 아직도 여부를 알 수없는 말을해야 MyEntity또한 가지고 A_respB_resp책임과 이유 MyEntity도 한 AB_resp위반으로 간주되지 않습니다 SRP

EULERFX

1)

작성자가 언급 한 동작은 엔터티와 관련된 동작입니다. 엔터티의 상태를 수정하는 동작입니다.

a) 내가 당신을 올바르게 이해한다면, 당신은 엔티티 가 그 속성 (즉, state ) 을 수정 하는 행동 만을 포함해야한다고 말하고 있습니까?

B) 그리고 무엇에 대해 행동을 반드시 수정하지 않는 엔티티의 상태를 하지만 여전히 것으로 간주 고유 그 특성 엔티티 (예 : 짖는 소리가 될 것이다 고유 의 특성 Dog이 수정하지 않은 경우에도 실체 개의 상태 )? 이러한 행동을 엔티티 에 포함시켜야합니까 아니면 다른 객체로 옮겨야합니까?

2)

행동을 다른 물체로 옮기는 한, 저자는 가치있는 물체를 구체적으로 언급하고 있습니다.

내 인용문에는 포함되어 있지 않지만 저자는 같은 단락에서 행동 (및 속성 )이 다른 엔티티 로 옮겨 질 것이라고 언급했습니다 ( 동작 을 VO 로 옮기면 얻을 수있는 이점을 이해하지만 )

3) 가정 MyEntity(질문 참조 3. 내 원래의 게시물을) 우리가 말할 것, SRP를 위반하지 않는 책임 의는 MyEntity또한 구성 다른 것들 중 하나입니다 :

ㅏ. A_resp + B_resp + AB_resp ( AB_resp객체를 조정 a하고 b)

또는

비. AB_resp + 위임 A_respB_resp개체 ( ab)과 연관 MyEntity?

4) Eric Evan의 DDD 서적, pg. 94 :

CustomerID는 Customer ENTITY의 유일한 유일한 식별자이지만 (그림 5.5) 전화 번호와 주소는 종종 고객을 찾거나 일치시키는 데 사용됩니다. 이름은 개인의 신원을 정의하지 않지만, 종종 신원을 결정하는 수단의 일부로 사용됩니다.

이 예에서 전화 및 주소 속성은 고객으로 이동했지만 실제 프로젝트에서는 해당 선택이 도메인 고객이 일반적으로 일치하거나 구별되는 방식에 따라 다릅니다. 예를 들어, 고객에게 다른 목적으로 많은 연락처 전화 번호가있는 경우 전화 번호는 ID와 관련이 없으며 영업 담당자와 연락해야합니다.

ㅏ)

CustomerID는 Customer ENTITY의 유일한 유일한 식별자이지만 (그림 5.5) 전화 번호와 주소는 종종 고객을 찾거나 일치시키는 데 사용됩니다. 이름은 개인의 신원을 정의하지 않지만, 종종 신원을 결정하는 수단의 일부로 사용됩니다.

인용문은 정체성 과 관련된 속성 만 이 엔티티에 남아 있어야한다고 언급한다 . 저자는 엔티티 가이 엔티티찾거나 일치시키는 데 자주 사용되는 속성 만 포함해야 하지만 다른 모든 속성 은 이동해야한다고 가정합니다.

b) 그러나 다른 속성 은 어떻게 / 어디로 옮겨야합니까? 예를 들어 (여기서 주소 속성찾거나 일치 하는 데 사용되지 않으므로 주소 속성을 외부 Customer로 옮기고 싶다고 가정 ) :Customer

Customer.Address(유형 string) 대신 유형 의 속성 Customer.Address을 생성하는 Address경우 주소 속성 을 관련 VO 객체 (유형 Address)로 이동 했습니까? 아니면 Customer여전히 주소 속성이 포함되어 있다고 말 합니까?

씨)

이 예에서 전화 및 주소 속성은 고객으로 이동했지만 실제 프로젝트에서는 해당 선택이 도메인 고객이 일반적으로 일치하거나 구별되는 방식에 따라 다릅니다. 예를 들어, 고객에게 다른 목적으로 많은 연락처 전화 번호가있는 경우 전화 번호는 ID와 관련이 없으며 영업 담당자와 연락해야합니다.

우리 가 그 특정에 속하는 많은 연락처 전화 번호 를 각각 가정한다고 가정하면 ,이 전화 번호전화 번호하나 때 와 마찬가지로 신원 과 관련 이 있다고 말할 수 있기 때문에 여기에서 잘못된 저자 Customer가 아닙니다. ?CustomerCustomer

5)

저자가 엔티티를 제거한다고 제안하는 이유는 고객 엔티티를 처음 작성할 때 고객과 ​​연관 될 것으로 생각할 수있는 속성으로 엔티티를 채우는 경향이 있기 때문입니다. 이것은 궁극적으로 빈혈 도메인 모델로 이어지는 행동을 간과하는 데이터 중심 접근 방식입니다.

주제 끄기,하지만 난 생각 빈혈 도메인 모델의 이동 결과를 행동을 에서 엔티티 귀하의 예제가 채우는 동안, 기업 의 많은 속성 을 초래할 것, Customer너무 많이 가지고 행동을 우리는 아마도에 포함 것 때문에 ( 행동 하는 이러한 추가 속성을 수정하여 SRP를 위반합니까?Customer

감사


2
나는 로버트 마틴의 클린 코드 비디오 시리즈 인 cleancoders.com을 강력히 추천한다. 그는 다른 원칙들이 어떻게 문제를 야기하거나 서로 균형을 잡을 수 있는지에 대해 자세히 설명한다. 그렇지 않으면 귀하의 예에 대한 공식의 일부가 Person 객체가 관련된 시간 범위를 보고 있다고 생각합니다 . 구매와 같은 짧은 기간 동안 구매에 사용 된 청구서 수신 주소는 그 일부이며 변경 불가능합니다. 라이브러리 계정의 경우 주소를 변경할 수 있어야합니다.
cartalot

2
이 질문이 SRP를 위반 한 것 같습니다 ...;)
IntelliData

답변:


7

이 문맥에서 동작은 의미 적 동작을 나타냅니다. 예를 들어, 클래스를 고유하게 식별하는 데 사용되는 클래스의 속성 (예 : 도메인 개체의 속성)에는 동작이 있습니다. 이것은 코드에서 직접 표현되지는 않습니다. 예상되는 동작 은 해당 속성에 대한 중복 값이없는 것입니다. 고유 한 ID를 가질 수 있지만 개인 엔티티의 컨텍스트 외부에 존재하지 않는 주소 와 같은 것은 여전히 자체 오브젝트로 이동되어야합니다. 따라서 엔티티를 집계 루트로 승격시킵니다.

또한 나이와 같은 속성에는 개인 개체 외부의 컨텍스트가 없으므로 다른 개체로 이동하는 것은 의미가 없습니다. 컨텍스트가 손실되므로이를 개인 엔티티에 필수적인 값으로 안전하게 결정할 수 있습니다. 그렇지 않으면 값을 찾을 수 없습니다. 그러나이 정보는 고유 식별자와는 별도로 별도의 위치에 쉽게 저장 될 수 있으므로 행동에 대한 혼란스러운 참조 입니다. 나이는 게으른로드 값일 수 있습니다.

따라서 귀하의 질문에 대답하십시오. 아니요, 단일 책임 원칙을 위반하지 않습니다. 사람이 사람과 물건 만 가지고 있어야하며 주소와 같이 더 복잡하고 사람과 관련되어서는 안된다고 말하고있다.

유효한 주소인지 확인하는 등 주소에 특정한 작업을 쉽게 수행 할 수 있습니다. 디자인 타임에 알지 못할 수도 있지만이 전체 개념은 객체를 가장 작은 부분으로 분해하여 사실 후에 수행 할 때 이와 같은 것을 비교적 간단하게하는 것입니다.

업데이트 : 1) 대부분의 경우이 ID 유효성 검사는 개체를 데이터 저장소에 저장할 때 수행됩니다. 이는 엔터티 유효성 검사를 나타내는 코드가 존재하지만 다른 곳에 존재한다는 것을 의미합니다. 일반적으로 ID 값을 발행하는 코드와 함께 존재합니다. 그렇기 때문에 고유성이 엔터티 코드에서 직접 표현되지 않는다고 진술 합니다 .

2) 올바른 진술 Age은 행동을 취하는 속성입니다. 해당 자산을 소비하는 개발자가 해당 자산을 소비하는 방법에 대한 정확한 결정을 내릴 수 있도록 Age에 게으른로드 사실을 문서화해야합니다.

3) DateOfBirth일반적으로 다른 대상이다. 이미 사전 정의 된 조작이있는 날짜 오브젝트입니다. 일부 언어에서는 날짜 개체에 이미 전체 도메인 모델이 정의되어 있습니다. 예를 들어 c #에서 시간대를 지정하고 날짜가 UTC 인 경우 날짜를 더하고 빼서 시간 범위를 얻습니다. 따라서 이동에 대한 가정은 DateOfBirth정확합니다.

4) MyEntity위임과 조정 만하는 것이 SRP를 위반하지 않는 것입니다. 단일 책임은 위임하고 조정하는 것이며 Facade 패턴이라고합니다.


내가 만든 업데이트를 볼 수 있습니까?
EdvRusj

내 답변을 업데이트
Charles Lambert

4

아주 좋은 질문입니다. SRP를 너무 간결하게 받아 들여서는 안됩니다. SRP와 관련하여 식별 / 조회는 기업의 책임이 아닙니다. 다른 사람은 ID (즉, 상점)를 제공하고이를 찾아야합니다 (즉, 저장소 ).

엔터티의 기본 목적은 모델에서 발견 한 개념을 나타내는 것입니다. 엔터티와 값 개체의 유일한 차이점은 엔터티가 비 식별 특성 이상의 의미를 갖는다는 것입니다. 예를 들어, 개인이 자신의 이름을 변경하더라도 다른 이름을 가진 동일한 개인입니다.


2

TL; DR : 당신은 이것을 너무 생각하고 있습니다. 그러나 나는 당신과 함께 그것을 지나치게 생각했다. 그래서 버클 ..

실체의 단일 책임 (변경 이유)은 자신을 고유하게 식별해야하며, 다시 말해서 책임을 찾을 수 있어야한다.

아니, 맞지 않아 엔티티의 단일 책임은 연속성입니다.

정체성은 연속성의 출현 결과입니다. 분리 가능한 아이디어로 ID를 모델링하는 것은 성능 최적화입니다.

예를 들면 다음과 같습니다. 고객이 제공하는 식당은 주차 대행입니다. 한 시간 후 식당 고객이 차를 요구합니다. 발렛에서 제공해야합니까?

고객이 "동일한"경우, 주차 대행사가 차량을 제공해야한다고 말하기 쉽습니다. 그러나 이것이 실제로 무엇을 의미합니까? 이를 판단하는 올바른 방법은 "지금"고객으로 시작하여 해당 고객의 이력을 거꾸로 검색하여 차량을 주차 대행에 제공하는 것이 해당 이력의 일부인지 확인하는 것입니다.

물론 우리는 실제로 그렇게 할 수 없습니다. 우리는 우리 자신의 역사를 정확하게 추적하는 데 어려움을 겪고 있습니다. 따라서 고객의 기록을 사용하는 대신 지름길을 사용합니다. 고객이 현재 키에 연결된 태그와 동일한 번호의 티켓 스텁을 보유하고 있습니까? 고객의 지갑에있는 운전 면허증이 DMV 제목의 이름과 일치합니까? 운전 면허증의 그림은 고객의 얼굴과 비슷합니까? 기타.

요컨대, 고객의 이력을 확인하는 대신 고객의 현재 상태를 확인하여 현재 상태가 자동차 도착과 반환 요청 사이의 기간에 해당하는 이력과 일치하는지 확인합니다.

엔티티를 모델링 할 때 유사한 최적화를 사용합니다. 우리는 모든 실체에게

  1. 히스토리의 시작에 불변의 식별자가 객체의 상태에 할당되어 있는지 확인
  2. 다음 주에는 항상 이전 주 식별자의 충실한 사본이 포함되어야합니다.

나는 여기서 실체의 두 번째 책임을 설명하지는 않는다. 기업은 여전히 ​​연속성을 책임지고 있으며, 역사는 일관된 이야기입니다. 식별자 책임은 모든 엔터티에 공통적 인 하위 집합입니다.

우리는 아직 독창성을 강화하지 못했습니다. 독창성은 모든 엔티티의 상태에 대한 액세스를 요구하기 때문에 단일 엔티티 내에서는 불가능합니다. 단일 엔터티는 자신 만 액세스 할 수 있습니다.

다시 한번, 매번 모든 식별자를 검사하는 것은 실용적이지 않으므로 대신 고유성을 만족시킵니다. 다음 식별자를 생성하는 코드는 반복해서는 안됩니다.

결국 이것은 메모리에서 서로 다른 두 가지 상태의 동등성을 테스트하여 비 연속 그래프를 쿼리하는 데 많은 귀찮은 일을 줄임으로써 연속성을 확인할 수 있음을 의미합니다.

또한 단일 책임 원칙 (정말 좋은 생각)을 원자 책임 원칙과 혼동 한 것 같습니다. 책임을 더 작고 더 쉽게 관리되는 부품으로 분해하는 것은 SRP와 호환됩니다.


1

엔터티에 고유 한 ID가 할당되면 해당 엔터티가 설정되므로 해당 엔터티가 해당 아이덴티티를 유지하거나 자신을 식별하는 데 아무런 동작이 필요하지 않다고 가정합니다. 따라서 저자가 찾기 및 일치 작업 외에 "개념에 필수적인 동작"을 언급하는 동작의 종류를 이해하지 못합니까?

만약 정체성이 확립된다면, 엔티티는 식별 될 다른 것을 필요로하지 않는다. 작성자가 언급 한 동작은 엔터티와 관련된 동작입니다. 엔터티의 상태를 수정하는 동작입니다. 예를 들어 Customer엔터티에 MakePreferred동작 이있을 수 있습니다 . 저자가 엔티티를 제거한다고 제안하는 이유는 엔티티를 처음 생성 할 때 Customer고객과 연관되어 있다고 생각할 수있는 속성 으로 엔티티를 채우는 경향이 있기 때문입니다. 이것은 궁극적으로 빈혈 도메인 모델로 이어지는 행동을 간과하는 데이터 중심 접근 방식입니다.

행동을 다른 물체로 옮기는 한, 저자는 가치있는 물체를 구체적으로 언급하고 있습니다. 행동을 VO로 옮기는 것이 좋은 생각 인 이유는 VO가 일반적으로 엔티티보다 "작게"더 집중되어 있기 때문입니다. 또한 불변성 및 작업 종료와 같은 측면은 코드에 대한 추론을 단순화하는 동시에 코드를 더욱 SOLID로 만듭니다.

VO와 함께 엔터티는 동작을 구현하는 다양한 VO를 조정하는 일종의 앵커 역할을합니다.

SRP와 관련하여 귀하의 혼란은 보증되지 않습니다. 엔터티의 전형적인 OOP 구현의 한 가지 문제는 정체성과 상태의 통합입니다. 실제로 행동의 관점에서 볼 때 정체성은 행동과 관련이 없습니다. 다시 말해서, 실체의 정체성은 그 행동에 필요하지 않다. AggregateSource 또는 여기에 설명하는 기능적 접근 과 같은 이러한 충돌이 제거 된 구현이 있습니다 .

다른 문제는 SRP가 정 성적으로 측정 될 수 있다는 것입니다. 누구나 어떤 클래스가 위반하는 단일 책임에 대한 정의를 내놓을 수 있습니다. 엔티티의 책임은 해당 엔티티에 필요한 동작을 구현하는 것이라고 말할 수 있습니다. 그런 의미에서 단일 책임이 있습니다. 또한 기업이 행동을 구성 VO에 위임 할 때 SRP를 위반하지 않습니다. SRP는 이러한 종류의 구성을 금지하지 않습니다. 객체 간의 커플 링을 최소로 줄이고 인터페이스를 가능한 한 맨손으로 유지하는 등의주의가 필요합니다.

최신 정보

a) 내가 당신을 올바르게 이해한다면, 당신은 엔티티가 그 속성 (즉, state)을 수정하는 행동만을 포함해야한다고 말하고 있습니까?

예, 예외가 있지만 ...

b) 그리고 실체의 상태를 반드시 수정하지는 않지만 여전히 그 실체의 본질적인 특성으로 간주되는 행동은 어떻습니까 (예 : 짖는 소리는 개 실체의 본질적인 특성이 아닙니다. Dog의 상태를 수정 하시겠습니까?) 이러한 행동을 엔티티에 포함시켜야합니까 아니면 다른 객체로 옮겨야합니까?

엔터티가 엔터티 인스턴스를 만들기위한 팩토리 메서드를 포함하는 것은 허용되지만 실제로 자식 엔터티이지만 개체 참조는 순회에 사용되지 않습니다. 이 경우 응용 프로그램 서비스에서 하위 항목을 유지해야합니다. 애플리케이션 서비스는 상위 엔티티를 사용하여 하위 엔티티를 구성합니다.

3) MyEntity (원래 게시물의 질문 3 참조)가 SRP를 위반하지 않는다고 가정하면 MyEntity의 책임이 다음과 같이 구성되어 있다고 말할 수 있습니다.

구현 관점에서 책임을보고 있습니다. 대신, 실체를 책임이있는 일종의 블랙 박스로 생각하십시오. 그것이 외부 사람들을 바라 보는 것처럼 당신이 관심을 갖지 않는 것은 그것을 처리하는 방법입니다. VO 또는 다른 개체간에 책임을 분할하는 것은 구현상의 문제입니다.

인용문은 정체성과 관련된 속성들만 개체에 남아 있어야한다고 명시하고있다. 저자는 엔티티 가이 엔티티를 찾거나 일치시키는 데 자주 사용되는 속성 만 포함해야하지만 다른 모든 속성을 이동해야한다고 가정합니다.

보다 구체적으로, 행동이나 조회에 필요하지 않은 속성은 엔티티의 일부가되어서는 안됩니다. 왜 귀찮게? 또한 읽기 모델 패턴 과 같은 요소를 사용하면 동작에 필요한 속성 이외의 항목이 필요하지 않습니다.

Customer.Address (문자열 유형) 대신 Address 유형의 Customer.Address 특성을 작성하는 경우 address 속성을 연관된 VO 오브젝트 (Address 유형)로 이동했거나 고객이 여전히 주소를 포함하고 있다고 말했습니까? 속성?

실제로, 문자열 주소와 주소 VO 주소 사이에는 차이가 없습니다.

고객이 특정 고객에게만 속한 많은 연락처 전화 번호를 각각 가정한다고 가정 할 경우,이 전화 번호는 고객이 보유한 경우와 마찬가지로 ID와 관련이 있다고 말할 수 있습니다. 하나의 전화 번호?

저자의 의도는 100 %는 아니지만, 그는 엔티티 조회 요구 사항이 엔티티와 해당 VO가 구조를 어떻게 바꾸는지를 설명 할 뿐이라고 생각합니다.

주제를 벗어난 것이지만 빈혈 도메인 모델은 엔티티에서 행동을 옮기는 결과라고 생각했지만, 귀하의 예는 많은 속성을 가진 엔티티를 채우는 것으로 고객이 너무 많은 행동을 초래할 것입니다. 이러한 추가 속성을 수정하여 SRP를 위반하는 행위?

많은 속성이 많은 행동을 의미하지는 않습니다. 실제로, 그것은 일반적으로 반대를 제안합니다. getter 및 setter가 있지만 캡슐화 동작이없는 많은 속성.


나는 업데이트를했다
EdvRusj 16:54에

-3

글쎄, 그것은 당신이 그것을보고 싶어하는 방법에 달려 있습니다.

또 다른 방법은 "단일 책임 원칙이 도메인 엔터티를 위반합니까?"입니다.

둘 다 지침입니다. 소프트웨어 디자인에는 "원칙"이 없습니다. 그러나 좋은 디자인과 나쁜 디자인이 있습니다. 이 두 개념은 서로 다른 방식으로 사용되어 좋은 디자인을 얻을 수 있습니다.


설명 할 수없는 다운 보트 == SRP 팬보이
h bob
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.