-
[Design Pattern] GRASP PrincipleLearn/Architecture 2022. 8. 24. 00:22
General Responsibility Assignment Software Patterns
어떤 클래스에게 어떤 책임을 줘야하는지에 대한 가이드를 제시
# Modularity
좋은 디자인이란 시스템을 모듈별로 잘 나누고 적절한 책임을 부여한 것.
모듈성을 높이려면
1. 비슷한 기능들끼리 잘 묶고 (Sereration of Concerns)
2. 작고 잘 정의된 인터페이스로 서로 잘 연동되지만 내부 내용은 모르게 한다. (Information Hiding)
모듈성을 측정하는 방법은 coupling, cohesion이 많이 쓰인다.
Coupling
- 모듈간의 상호 의존성 측정
- 낮을수록 좋음
- 높으면 변경에 영향을 받는게 많고 이해가 어려우며 재사용도 어렵다.
Cohesion
- 하나의 모듈안에 있는 element들이 얼마나 관련이 되었는가를 측정
- 높을수록 좋음
- SRP와 관련 깊음
1. Creator Pattern
클래스 A의 인스턴스를 만들 때 아래의 경우에 해당하면 클래스 B에게 책임을 준다.
- B가 A를 포함할 때
- B가 A를 기록할 때
- B가 A를 밀접하게 사용할 때
- B가 A를 초기화할 때 필요한 데이터를 가지고 있을 때
따를 경우 커플링을 줄여준다. 다만 무조건 따라야만 하는건 아니다.
2. Information Expert Pattern
하려고 하는 일을 하기 위한 정보를 가진 객체에게 책임을 부여하는게 좋다.
Speration of Concerns와 충돌을 일으키기도 한다. (위의 Modularity에 있음)
[예시]
판매에 대한 정보를 DB에 저장하는 책임은 어떤 오브젝트에게 줘야 할까?
- Information Expert만 고려하면 Sale 클래스가 맞을 것 같다. (정보를 가지고 있음)
- 그러나 이 기능은 여러 클래스가 관심있으므로 Sale 클래스에 주면 오히려 분산되어 Cohesion이 낮아진다.
(솔직히 잘 이해안되는데 설명을 안해줌...)
이 패턴을 잘 쓰면 Information Encapsulation을 통해 커플링을 낮춘다.
3. Control Pattern
UI에서 오는 Request를 받는 오브젝트는 어떤 것이여야 하는가?
1. 전체 시스템을 나타나는 객체를 만들어서 책임을 줌. (facade controller)
2. 시스템이 너무 커서 책임이 많은 경우 유스케이스나 세션 컨트롤러를 만들어서 책임을 줌
컨트롤러에 너무 많은 책임이 부여될 경우
- 더 많은 컨트롤러를 만든다. (facade -> use-case controller)
- 다른 객체에게 위임한다.
잘 쓰면 로직이 GUI에 있는게 아니므로 컴포넌트 재사용성이 올라간다.
4. Low Coupling Pattern
변경의 영향이 적고 불필요한 커플링을 낮출 수 있는 방법을 선택해라.
단, 전역 오브젝트간의 커플링은 큰 문제가 되지 않는다.
우리가 만든 객체끼리의 커플링을 더 신경써야한다.
5. High Cohesion Pattern
말그대로 cohesion을 높일 수 있는 패턴을 택해라.
교수님 수업 너무 준비 안하셨는데..6. Pure Fabrication Pattern
cohesion, coupling, separation of concerns 등을 신경쓰다보면
기존의 클래스에 디자인을 반영하는 것 보다 새로운 디자인 클래스를 만드는게 더 나은 경우가 있다.
완전히 없던 새로운 것이 나오므로 pure fabrication이라고 부른다.
7. Polymorphism Pattern
앞 강의에서 다뤘던 Polymorphism (override)
클래스 개수가 많아지고 이해가 쉽지 않아 지는 것에 유의해야 한다.
8. Indirection Pattern
커플링을 피하기 위해 중재할 수 있는 오브젝트를 만드는 것.
예시: Adapter, Facade, Proxy, Mediator ...
9. Protected Variations Pattern
앞의 것들을 종합한 패턴
잘 변하지 않는 안정적인 인터페이스를 만들어서 그것을 중심으로 책임을 할당한다.
# QUIZ
Q. 학생의 최종 학점을 주는 역할은 어디에 줘야할까? GRASP 패턴 중 어떤 것이 여기에 해당할까?
A. Information Expert Pattern.
Student 클래스가 모든 정보를 가지고 있으므로 여기에 책임이 있어야 한다.
아..........강의 너무 별로다'Learn > Architecture' 카테고리의 다른 글
[Design Pattern] Observer Pattern (0) 2022.08.27 [Design Pattern] Strategy Pattern (0) 2022.08.26 [Design Pattern] SOLID Principle (0) 2022.08.21 [Design Pattern] Object Oriented Paradigm (0) 2022.08.20 [Design Pattern] Introduction (0) 2022.08.17