8

Getters 및 Setters 사용에 관한 몇 가지 기사/게시물과 도메인 모델 개체에서 캡슐화의 목적을 무력화시키는 방법에 대해 읽었습니다. 나는 setter를 사용하지 않는 논리를 이해한다 - 당신은 클라이언트 코드가 객체 비즈니스 규칙과 불변량의 문맥 밖에서 객체의 속성을 조작하도록 허용하고있다.DDD 및 Getters 및 Setters 사용

이제이 교장이 나를 혼란스럽게합니다. 예를 들어, 객체의 멤버 변수의 값을 변경해야한다면 어떻게됩니까? 예를 들어, 사람의 이름이 변경되면이를 모델에 반영하는 방법은 무엇입니까? 처음에는 'ChangeName'이라는 함수를 사용하지 않았는데 새 이름을 전달하고 차례로 내부 '이름'변수를 변경할 수 있다고 생각했습니다. 음 .... 그저 세터가 아닙니다!

내가 분명히해야 할 것은 - 내가 세터를 완전히 없애고 있다면, 위와 같은 상황에서 나는 생성자 매개 변수에 전적으로 의존해야만 하는가? 생성자를 통해 이전 특성 값 대신 새 특성 값을 전달해야합니까? 그 후에 개체를 모든 지속성 인프라에 전달하여 변경 내용을 유지할 수 있습니까?

이 두 기사는이 토론에 유용합니다

  1. http://kellabyte.com/tag/ddd/
  2. http://typicalprogrammer.com/?p=23

답변

6

음, 이것은 고전적인 토론이다. 이것에 관해서는 Stack Overflow에 여러 다른 스레드가 있습니다.

하지만. Get/Set (자동 속성?)이 모두 나쁜 것은 아닙니다. 그러나 그들은 여러분이 여러분의 엔티티를 메소드가 아닌 소품 만 가지고있는 "죽은"데이터 컨테이너로 만들도록 만드는 경향이 있습니다. 이것의 흔적은 흔히 빈혈 도메인 (Anemic Domain)이라고 불리우며 거의 행동이 없습니다. 내 추천은 다음과 같습니다.

  1. 가능한 한 소품을 사용하십시오.
  2. 같이 속한 데이터 그룹을 찾으십시오. 예 : 함께해야합니다. 이름 성 및 성. 또 다른 예로 은 Zipcode, City, Street입니다. 이 데이터는 메소드를 통해 설정하는 것이 좋습니다. 엔티티가 무효화 될 가능성은 최소화됩니다.
  3. 종종 함께있는 데이터는 값 개체로 그룹화 할 수 있습니다.
  4. 더 많은 값 개체는 일반적으로 "명사" 엔티티가 아닌 "동사"인 엔티티에서 더 많은 설명 메서드 을 가져 오는 경향이 있습니다.
  5. 값 개체에 대한 더 많은 메서드는 동작을 추가하고 아마도 "지방"서비스를 줄이는 데 도움이됩니다 (어쩌면 에는 너무 많은 유출 비즈니스 논리가있는 서비스가있을 수 있습니다 ...).

여기에 더 많은 내용이 있지만 ... 짧은 대답입니다. 생성자에서 데이터 설정 :이 엔터티가 해당 데이터없이 "살"수 없으면 존재할 때만 수행합니다. 엔티티 Person의 경우 이름이 그처럼 중요하지 않을 수도 있습니다. 그러나 사회 보장 번호는 생성자 데이터의 후보가 될 수 있습니다. 또는 법인 직원은 반드시 회사에 속해야하기 때문에 건설 회사에 회사를 보유해야합니다.