[개발 기록] GRASP
General Responsibility Assignment Software Patterns
일반 책임 할당 소프트웨어 패턴
객체가 가져야 하는 책임의 패턴을 정리
Information Expert ( 정보 전문가 )
객체가 역할을 수행할 때 필요한 정보를 가지고 있도록 한다.
Creator ( 생성자 )
컨텍스트를 알고있는 객체가 인스턴스를 생성하도록 한다.
Problem: 누가 A란 객체를 생성 해야하는가? Solution: 다음 중 하나가 참인 경우 클래스 B에 객체 A를 생성할 책임을 할당합니다.
- B는 A를 포함.
- B가 A를 기록.
- B가 A를 사용.
- B가 A를 초기화 할 수 있는 데이터를 가짐.
Controller ( 사용자의 요청 처리용 클래스 )
Low Coupling ( 약한 결합도 )
High Cohesion ( 강한 응집도 )
Indirection ( 직접 참조를 피하라 )
Polymorphism ( 다양성 )
Pure Fabrication ( 유틸 클래스 )
Information Expert 패턴을 적용했더니 Low Coupling과 High Cohesion의 원칙이 깨어진다면, 기능적인 역할을 별도로 한 곳으로 모으자.
Protected Variations
변경될 여지가 있는 곳에 안정된 인터페이스를 정의해서 사용하자.
@DisplayName("2명이 최대 정원인 유료 강의는 최대 수강 인원을 초과할 수 없습니다.")
@Test
void CanNotSignUpForPaidSessionThatMaximumIs2CannotExceedMaximum() {
long pirce = 10_000;
PricingPolicy pricingPolicy = new PricingPolicy(PricingType.PAID_SESSION, pirce);
assertThatNoException().isThrownBy(() -> paidSessionType.registered(pirce, 99));
assertThatIllegalArgumentException().isThrownBy(() -> paidSessionType.registered(pirce, 100));
assertThatIllegalArgumentException().isThrownBy(() -> paidSessionType.registered(pirce, 101));
}
@DisplayName("유료 강의는 결제금이 강의료와 같아야 수강신청이 가능합니다.")
@Test
void CanSignUpForPaidSessionIfPaymentAmountEqualToTheSessionAmount() {
long pirce = 10_000;
int maximumHeadCount = 2;
PaidSessionType paidSessionType = new PaidSessionType(maximumHeadCount, pirce);
assertThatNoException().isThrownBy(() -> paidSessionType.registered(pirce, 1));
assertThatIllegalArgumentException().isThrownBy(() -> paidSessionType.registered(1000, 1));
}
댓글남기기