juniors-dev-study / domain-driven-design

1 stars 0 forks source link

10장 유연한 설계 #11

Closed y2o2u2n closed 3 years ago

y2o2u2n commented 3 years ago

이번 장은...

의도를 드러내는 인터페이스

클래스와 연산의 이름을 지을 때...

테스트 코드 먼저 작성하면, 행위에 먼저 집중할 수 있었던 것 같음

부수효과가 없는 함수

단언

요구사항을 잘 정리해서 모든 케이스를 테스트 코드로 작성해두면 나중에 변경을 대비해서 좋은 준비가 되는 것 같음

개념적 윤곽

뒤죽박죽이면 의미를 파악하기 힘들어서 문제이고, 너무 잘게 쪼개도 복잡해져서 문제이니 적절하게 객체가 협력하도록 해야한다는데,,, 실천적인 내용이 이해가 잘 가지 않음 ㅠ

독립형 클래스

연산의 닫힘

자연수 클래스 NaturalNumber 가 있다고 할 때 덧셈을 구현한다 치면 밖의 클래스에서 NaturalNumber 안의 값을 꺼내서 더하지 않고 NaturalNumber 클래스 내에서 값을 계산해서 새로운 값객체를 반환하는 식?

public class NaturalNumber {
    private final int value;

    private NaturalNumber(int number) {
        this.value = number;
    }

    public static NaturalNumber add(NaturalNumber x, NaturalNumber y) {
        return new NaturalNumber(x.value + y.value);
    }
}

선언적 설계

예시

youngvly commented 3 years ago

IMG_1246

선언적(declarative)

정리잘돼있다

DSL

예시 : SQL, css,,

chanhyeong commented 3 years ago

INTENTION-REVEALING INTERFACE

문제를 내고, 푸는 방법을 표현하면 안됨

SIDE-EFFECT-FREE FUNCTION

command 를 도메인 정보를 반환하지 않는 단순한 연산으로 분리 책임에 적합한 개념이 나타나면 로직을 Value Object 로 옮겨 side effect 를 통제

ASSERTION

기존에 사용하던 requireNonNull, assertEquals 이런 개념인 것 같은데

예시가 이해가 잘 안됨. 갑자기 왜 분리하는지

CONCEPTUAL CONTOUR

새로 알게 된 개념이나 요구사항을 코드에 적용

반복적인 리팩토링으로 유연한 설계

예시에서 나온 CONCEPTUAL CONTOUR 는 Payment 인가? (조기 상환 및 연체 상환 처리 규칙이 추가되는 과정에서 여기에 개념이 들어감)


중간 정리

INTENTION-REVEALING INTERFACE: 클라이언트에 의미 단위로 객체를 제공하게 해줌 SIDE-EFFECT-FREE FUNCTION, ASSERTION: 위를 사용한 복잡한 조합을 만드는 일을 안전하게 CONCEPTUAL CONTOUR: 모델의 각 부분이 안정화되고, 단위를 직관적으로 사용하고 조합할 수 있게 됨

STANDALONE CLASS

CLOSURE OF FUNCTION

return type 과 parameter type 이 동일한 연산 정의

Declarative design

DSL 따로 있는게 아니고 우리가 정의할 수 있음

Angles of Attack (받음각.. ㅋㅋ)


드디어 절반을 넘음 읽으면서 정리가 잘 안되네요....

bearics commented 3 years ago

연산의 닫힘

Class PeopleGroup { private List people;

// 이런 로직들도 닫히도록 짜야할까요?? private List getOlderPeople(Person person) { // 이런것도 닫혔다고 보는건가?? return people.filter(e -> e.age > person.age).collect(); }

private List getOlderPeople(int tagetAge) { return people.filter(e -> e.age > tagetAge).collect(); } }


### COMMAND와 SIDE-EFFECT-FREE FUNCTION의 분리 p304
COMMAND, QUERY를 분리해서 결과적으로

Map distribution = aLoan.calculatePrincipalPaymentShares(paymentAmount); // 배분할 금액 계산 == query aLoan.applyPrincipalPaymentsShares(distribution); // 상태 변경 == command


이렇게 되면 해당 코드 2줄은 어디에 있는게 좋을까요?? 응용 서비스 계층 OR 도메인 서비스 계층.

### Value Object의 역할이 생각보다 크구나라고 느낌
VO는 단순 값객체로 보았는데, 해당 객체에도 로직이 포함되는거를 보고 생각보다 역할이 크다고 느낌.
ENTITY랑 다른 점은 상태가 변경되지 않고 매번 새로운 객체가 생김.