GRASP (General Responsibility Assignment Software Pattern) 에 관하여..
책임 기반 객체지향 관점에서 객체에 책임을 할당하기 위한 패턴을 정리한 것
책임과 역할 이라는 말을 많이 쓰는데, 이 때 책임의 종류를 나열하고 어떻게 할당할 것인지에 대한 기준 패턴으로 보면 될 것 같다.
Information Expert
- 역할을 수행할 수 있는 정보를 가지고 있는 객체에 역할을 부여한다.
- Problem: What is a basic principle by which to assign responsibilities to objects?
- Solution: Assign a responsibility to the class that has the information needed to fulfill it.
Creator
- 객체의 생성은, 생성되는 객체의 컨텍스트를 알고 있는 다른 객체가 있다면 컨텍스트를 알고 있는 객체 부여한다.
- 포함하거나 라이프사이클을 공유하고 데이터 내용을 알 정도로 가까운 관계인 경우
- Problem: Who creates object A?
- Solution: Assign class B the responsibility to create object A if one of these is true (more is better)
- B contains or compositely aggregates A
- B records A
- B closely uses A
- B has the initializing data for A
Controller
- 시스템 이벤트(사용자의 요청)를 처리할 객체를 만든다. 시스템, 서브시스템으로 들어오는 외부 요청을 처리하는 객체를 만들어 사용한다.
- 돌고 있는 SW, 혹은 주요한 서브시스템의 전체 시스템이나 루트 객체를 표현한다. (퍼사드 컨트롤러의 범주)
- 유즈케이스 시나리오에서 시스템 동작이 발생하는 것을 표현하도록 한다.
- Problem: What first object beyond the UI layer receives and coordinates “controls” a system operation?
- Solution: Assign the responsibility to an object representing one of these choices:
- Represents the overall “system”, “root object”, device that the software is running within, or a major subsystem (these are all variations of a facade controller)
- Represents a use case scenario within which the system operation occurs (a use case or session controller)
Low Coupling
- 객체들간, 서브 시스템들간의 상호의존도가 낮게 역할을 부여한다.
- Problem: How to reduce the impact of change? How to support low dependency and increased reuse?
- Solution: Assign responsibilities so that (unnecessary) coupling remains low. Use this principle to evaluate alternatives.
High Cohesion
- 각 객체가 밀접하게 연관된 역할들만 가지도록 역할을 부여한다.
- Problem: How to keep objects focused, understandable, manageable and as a side effect support Low Coupling?
- Solution: Assign a responsibility so that cohesion remains high. Use this to evaluate alternatives.
Indirection
- 두 객체 사이의 직접적인 Coupling 을 피하고 싶으면, 그 사이에 다른 객체를 사용한다.
- Problem: Where to assign a responsibility to avoid direct coupling between two or more things?
- Solution: Assign the responsibility to an intermediate object to mediate between other components or services so that they are not directly coupled.
Polymorphism
- 객체의 종류에 따라 행동양식이 바뀌면, Polymorphism 을 사용한다.
- Problem: How handle alternatives based on type?
- Solution: When related alternatives or behaviors vary by type (class), assign responsibility for the behavior (using polymorphic operations) to the types for which the behavior varies.
Pure Fabrication
- Information Expert 등의 다른 패턴을 적용 시 Low Coupling 과 High Cohesion 원칙이 깨진다면, 기능적인 역할을 별도의 한 곳으로 모은다.
- Problem: What object should have the responsibility, when you do not want to viloate High Cohesion and Low Coupling but solutions offered by other principles are not appopriate?>
- Solution: Assign a highly cohesive set of responsibilites to an artifical or convenience class that does not represent a problem domain conecept.
Protected Variations
- 변경될 여지가 있는 곳에 안정된 인터페이스를 정의해서 책임을 부여한다.
- Problem: How to design objects, subsystems and systems so that the variations or instability in these elements does not have an undesirable impact on other elements?
- Solution: Identify points of predicted variation or instability, assign responsibilities to create a stable interface around them.
Reference
'Programming' 카테고리의 다른 글
HTTP 2.0 에 관하여... (0) | 2022.08.03 |
---|---|
DispatcherServlet 에 관하여... (스프링 디스패처서블릿) (0) | 2022.07.22 |
HTTPS 에 관하여.. (0) | 2022.07.13 |
[Codility] Chapter 9. Maximum slice problem, 최대 구간 문제 (0) | 2022.04.02 |
DI 와 IoC 에 대한 개념과 스프링 (2) | 2022.04.01 |