ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 도메인 주도 설계 - 10. 유연한 설계
    디자인 패턴 2024. 5. 10. 10:50

    본 내용은 에릭 에반스의 도메인 주도 설계를 공부하면서 제 나름대로 이해하기 쉽게 정리한 글입니다.

    이해가 어려우시다면 댓글 부탁드립니다.


    INTENTION-REVEALING INTERFACE(의도를 드러내는 인터페이스)

     객체를 효과적으로 사용하는데 알아야할 정보를 구현 로직의 이해 필요없이 인터페이스로만 얻을 수 있게 설계한 인터페이스를 뜻한다. 컴포넌트의 구현 세부사항을 고려해야 한다면 캡슐의 가치는 사라진다. 설계에 포함된 모든 공개 요소가 조화를 이뤄 인터페이스를 구성하고 각 요소의 이름을 토대로 설계 의도를 드러낼수 있어야 한다.

     오직 결과와 목적만을 표현하도록 클래스의 연산의 이름을 부여해야 한다. 이렇게하면 클라이언트 개발자가 내부를 이해할 필요성이 줄어든다. 그 의미를 쉽게 추측하기 위해 UBIQUITOUS LANGUAGE에 포함된 용어를 따라하 한다.

    SIDE-EFFECT-FREE FUNCTION(부수효과가 없는 함수)

     여기서 SIDE-EFFECT(부수효과)라는 의미는 의도하지 않은 시스템의 상태에 대한 영향력을 의미한다. SIDE-EFFECT-FREE FUNCTION는 위의 의미대로 부수효과가 없는 함수이다.

    다수의 규칙에 따라 상호작용하거나 여러 가지 계산을 조합하면 예측하기가 어려워지고 연산을 호출하는 개발자가 결과를 예상하려면 연산  자체 뿐만 아니라 연산이 호출하는 다른 연산의 구현도 이해해야 한다. 이렇게 안전하게 예측할 수 없다면 개발자가 연산을 조합해서 사용하는 데 제약이 따르고 행위가 풍부해지지 않는다.

    함수에 부수 효과를 없애는 두 가지 방법

    1. 명령과 질의를 엄격하게 분리된 다른 연산으로 분리한다. 변경을 발생시키는 메서드는 도메인 데이터를 반환하지 않고 가능한 한 단순하게 유지한다.
    2. 연산의 결과를 표현하는 새로운 VALUE OBJECT를 생성하서 반환한다. 생명주기를 신중하게 통제해야 하는 ENTITY와 달리 VALUE OBJECT는 그럴 필요가 없다

    ASSERTION(단언)

     ASSERTION은  SIDE-EFFECT-FREE FUNCTION으로 분리 후에도 ENTITY에 남아있는 부수효과를 초래하는 명령을 명확하고 다루기 쉽게 설계하는 방식이다. 연산의 부수효과가 구현에 의해서만 함축적으로 정의되는 혼란스러운 부분을 해결하고 프로그램을 이해하려면 분기 경로를 따라 실행 경로를 추적해야하는 복잡함을 해결한다. 

    ASSERTION을 설계하는 방법은  연산의 사후조건과 클래스 및 AGGREGATE에 불변식을 명시한다. 프로그래밍 언어를 사용해서 ASSERTION을 명시할 수 없다면 자동화된 단위 테스트를 작성해서 ASSERTION의 내용을 표현한다.

    CONCEPTUAL CONTOUR(개념적 윤곽)

     유연하게 조합하기 위해 작은 크기로 나눌떄가 있고 복잡성을 캡슐화하기 위해 기능을 더 큰 단위로 통합할 때가 있는데 그 기준을 도메인 의미 수준으로 명확하게 설계하는 방식이다. "합(addition)"이 도메인에서 의미를 가진다면 그 수준에서 메서드를 구현한다. 딱 도메인 의미 단위 수준에서 메서드를 구현해야 한다. 을 더이상 나누거나 의미를 넘는 수준까지 처리하려고 하면 안된다.

     도메인을 중요 영역을 나누는 것과 관련한 직관을 감안해서 설계요소를 응집력 있는 단위로 분해해야 한다. 계속적인 리팩터링을 토대로 변경되는 부분과 변경되지 않는 부분을 나누는 축을 식별하고 변경되는 부분을 분리하기 위한 패턴을 명확하게 표현하는 CONCEPTUAL CONTOUR을 찾아야 한다.

    STANDALONE  CLASS(독립형 클래스)

     STANDALONE CLASS란 클래스의 결합도를 낮춰서 현재 클래스의 도메인 개념과 상관없는 것들을 없애는 설계 방식이다. 

     객체의 설계의 기본원리중 하나인 낮은 결합도를 갖추고자 노력해야 한다. 현재 도메인과 무관한 모든 개념을 제거해서 클래스가 완전히 독립적(self-ccontained)로 바뀌고 단독적으로 이해할 수 있다. 독립적인 클래스는 MODULE을 이해하는데 따르는 부담을 상당히 덜어준다. 낮은 결합도는 개념적 과부화를 줄여준다.

    CLOSURE OF OPERATION(연산의 닫힘)

     CLOSURE OF OPERATION는 반환 타입과 인자 타입이 동일하게 연산을 정의하는 설계 방식이다. 닫힌 연산은 부차적인 개념을 사용하지 않고도 고수준의 인터페이스를 제공한다. 이 패턴은 VALUE OBJECT의 연산을 정의하는 데 주로 사용된다. 연산시 VO를 인자로 받고 새로운 VO를 반환한다. ENTITY는 생명주기가 매우 중요하므로 연산의 결과로 새로운 ENTITY를 반환하는 경우는 잘 없다.

    댓글