Eternity's Chit-Chat

aeternum.egloos.com



유연한 설계를 위한 패턴과 원리 - 2.의도를 명확하게 4부 Supple Design

PATTERNS & PRINCIPLES

CLOSURE OF OPERATIONS

STANDALONE CLASS 불필요한 의존성을 제거하고 가능하면 원시 타입과 표준 라이브러리 클래스에만 의존하도록 함으로써 인지 과부하를 줄이도록 한다. 그러나 인터페이스에 나타날 있는 타입에 제약을 받기 때문에 상대적으로 인터페이스가 빈약해질 밖에 없다. 정신적 부담을 증가시키지 않으면서도 인터페이스를 풍부하게 만들 있는 방법이 없을까?

수학은 단순함과 풍부함이라는 상대적인 개념이 얼마나 커다란 힘을 발휘할 있는 지를 가장 극적으로 보여주는 학문이다. 어릴 수학 시간에 연산의 닫혀 있음 관해 배웠을 것이다. 정수 집합에서 임의의 수를 골라 더한 결과는 정수 집합에 포함된다. , 정수는 덧셈 연산에 대해서 닫혀 있다라고 한다. 정수의 사칙연산은 닫혀 있음이라는 개념을 통해 추가적인 개념의 도입 없이도 단순하면서도 풍부한 수식을 표현 있다.

여러분이 VALUE OBJECT 사용하고 있다면 대부분의 경우 닫혀 있음 개념을 적용할 있을 것이다. Money Money 더하면 결과는 Money . 어떤 시점을 의미하는 TimePoint TimePoint 더하면 미래의 어떤 시점을 의미하는 TimePoint 구할 있다. “닫혀 있음 개념은 불필요한 의존성을 추가하지 않으면서도 다양한 표현식을 객체에 추가할 있는 수단을 제공한다.

적절한 위치에 반환 타입과 인자 타입이 동일한 오퍼레이션을 정의하라. 구현자implementer 연산에 사용되는 상태를 포함하고 있다면 오퍼레이션의 인자로 구현자를 사용하는 것이 효과적이므로 인자의 타입과 반환 타입을 구현자의 타입과 동일하게 정의한다. 이런 방식으로 정의된 오퍼레이션은 해당 타입의 인스턴스 집합에 대해 닫혀 있다. 닫힌 오퍼레이션은 부차적인 개념을 사용하지 않고도 고수준의 인터페이스를 제공한다.

Money VALUE OBJECT이며 STANDALONE CLASS이다. Money times() 매소드는 기본타입인 double 인자로 취해 자신과 동일한 타입인 Money 반환하는 CLOSURE OF OPERATION 예이다. 완전한 형태의 CLOSURE 원한다면 Money plus() 시그니처를 상상하면 된다. Money Money 더하면 Money 된다.


class
Money {

Money plus(Money amount) {

...       

}

} 


Money
사용하기 위해 Money 외의 다른 개념에 억눌릴 필요가 없다. 가능한 많은 오퍼레이션을 CLOSURE 만든다면 인지 과부화를 방지하면서도 인터페이스를 풍성하게 만들 있을 것이다.

CLOSURE OF OPERATION 주로 VALUE OBJECT 사용된다. 그러나 추적성이 중요한 ENTITY[Evans DDD]에도 사용할 있다. 만약 어떤 사람의 아버지가 누구인지 찾고 싶다면 CLOSURE 사용함으로써 인터페이스를 단순하게 만들 있다.

 

class Person {

Person father() {

...

}

}

그러나
일반적으로 ENTITY 연산의 결과로 새로운 인스턴스를 반환하지는 않기 때문에 대부분의 경우 VALUE OBJECT에서 패턴을 발견하게 것이다. 앞으로 살펴 보게될 시간 GENERIC SUBDOMAIN 역시 CLOSURE OF OPERATION 광범위하게 사용하고 있다.