본문 바로가기

: Architecture

[OOAD] GRASP

반응형

GRASP

 

Table of Contents

 

1. What is GRASP?

General Responsibility Assignment Software Patterns(or Principles)

OOD(Object-Oriented Design)에서 사용하는 책임 할당을 위한 9개의 근본적인 원칙을 모은 것이다.

책임 할당이 번역이 되면서 조금 애매하게 해석될 수 있는데,
처음 개념을 정립한 것은 Craig Larman - Applying UML and Patterns 이다.

GRASP은 UML이나 기술 용어는 아니나, OOD를 하기위해 반드시 알아야할 원칙이다. 그리고 디자인 패턴들을 선택의 근거로 기술된다.

 

2. GRASP

2. 1. Creator

  • Class A(생성되어야 할 클래스)의 인스턴스를 생성하려할 때, Class B(클래스 A의 객체를 생성하기 위한 클래스)에게 권한을 부여한다.
  • 만약 여러개의 인스턴스를 생성하려 한다면 더욱 좋다.
  • 다음과 같이 표현한다. (맨 위가 대표적인 표현)
    • B contains A or B aggregates A. (B는 A를 포함한다.)
    • B records A. (B가 A를 기록한다.)
    • B closely uses A. (B가 A를 긴밀하게 사용한다.)
    • B has the initializing data for A. (B는 A 생성 데이터를 가지고 있다.)
  • Low Coupling
  • 관련 패턴: Abstract Factory, Singleton

 

2. 2. Information Expert (정보 전문가)

  • 정보 전문가는 책임을 수행할 수 있는 데이터를 갖고 있는 객체에 책임을 부여하는 것이다. 즉, 클래스는 데이터와 처리로직이 함께 묶여있는 것이다.
  • 정보은닉을 통해 자신의 데이터는 감추고, 외부에는 method만 공개하여 데이터를 처리하게 한다.
  • 금기 사항: SoC(Separation of Concerns) 가 충돌하게 하면 안된다.
  • 정보의 캡슐화로 Low Coupling

 

2. 3. Controller (컨트롤러)

  • 컨트롤러는 루트 객체(system)를 만들어 책임을 할당한다. 이 방법은 다른 컴포넌트들은 컨트롤러만 이용하면 되어 Low Coupling을 얻을 수 있다.
  • 이 방식으로 하면 GUI 레벨에서 앱 로직이 필요 없다.
  • 다른 클래스들이 Controller를 통하지 않으면, 각 서브 컴포넌트들로 직접 접근하게 되어, 외부 시스템과 내부 컴포넌트 사이의 Coupling이 증가하여, 수정이 어려워진다.
  • 관련 패턴: Facade Pattern

 

2. 4. Low Coupling (낮은 커플링)

  • 객체, 컴포넌트 간 상호 의존도를 낮게 한다.
  • Low Coupling은 컴포넌트 간 재사용성을 높이고 시스템 관리를 편하게 만들어 준다.
  • OOAD에서는 각 객체간 Communication을 통해, 동작이 이루어지므로, Coupling이 올라가기 쉽다.

 

2. 5. High Cohesion (높은 응집력)

  • 하나의 객체가 관련된 책임들을 갖도록 하는 것이 높은 응집도(High Cohesion)이다.
  • 책임이 분산되면 필요한 것을 다른 객체에 요청하게 되기 때문에, 다른 객체와 Communication이 증가할 수 밖에 없다.
  • 일반적으로, Coupling 이 낮아지면 보통 Cohesion이 높고, Coupling이 높으면 Cohesion이 낮다. (Cohesion & Coupling 반비례 관계)

 

2. 6. Pure Fabrication (순수 제조)

  • 공통적으로 사용하는 동작이 있다면 관리하는 클래스를 따로 만들어 관리 하는 방법이다.
  • 예시: DB에 데이터를 접근하는 여러 서브 클래스가 있다고 가정한다.
    • Information Expert 관점에서는 각 서브 클래스가 직접 DB 함수를 호출하는 것이 맞다고 생각할 수 있다.
    • 그러나 이 경우, High Coupling과 Low Reusability를 유발한다.
    • 대신, DB와 Object가 상호작용 해주는 클래스를 만든다.
  • High Cohesion, Reusability를 얻는다.

 

2. 7. Polymorphism (다형성)

  • 다형성이란 하나의 객체가 행동 양식이 바뀔 때 추상화하여, 구분없이 사용가능하도록 해주는 방법이다. (interface, abstract를 활용하는 것)
  • 유사한 객체가 여러개가 있다면, 더욱 유용하게 사용할 수 있다.
  • 구체적 로직을 직접부르는 것보다 더욱 쉽고, 신뢰성이 높다.
  • 나중에 행동을 추가하는 것이 쉽다.

 

2. 8. Indirection (간접 참조)

  • 두 객체 사이 직접적인 Coupling을 피하고 싶으면, 그 사이에 중간 오브젝트(intermediate object) 를 통해 전달하는 방법이다.

 

2. 9. Protected Variations (변경 보호)

  • 변경될 여지가 있는 곳에 안정된 인터페이스를 정의해서 사용하자.
  • 변경으로부터 유연성과 보호받는다.
  • 구조화 된 디자인을 제공한다.
  • SOLID의 OCP와 같은 의미이다.
반응형

': Architecture' 카테고리의 다른 글

[OOAD] SOLID  (0) 2022.06.23
[UML] Sequence Diagrams  (0) 2022.06.17
[UML] Class Diagram  (0) 2022.06.17
[UML] Use Case Diagram  (0) 2022.06.17