GRASP Pattern이란?

NO Image

GRASP Pattern이란?

  • General Responsibility Assignment Software Patterns
  • Object-Oriented 디자인의 핵심은 각 객체에 책임을 부여하는 것.
  • 책임을 부여하는 원칙들을 말하고 있는 패턴.
  • 구체적인 구조는 없지만, 철학을 배울 수 있다.
  • 총 9가지의 원칙을 가지고 있다.

Information Expert

  • 책임을 수행할 수 있는 데이터를 가지고 있는 객체에 책임을 부여하는 것.
  • 객체는 데이터와 처리로직이 함께 묶여 있는 것.
  • 정보 은닉을 통해 자신의 데이터를 감추고 오직 Method로만 데이터를 처리하고, 외부에는 그 기능(책임)만을 제공한다.

Creator

  • 객체의 생성은 생성되는 객체의 컨텍스트를 알고 있는 다른 객체가 있다면, 컨텍스트를 알고 있는 객체에 부여.
  • A 객체와 B 객체의 관계의 관계가 다음 중 하나라면 A의 생성을 B의 책임로 부여.
    • B 객체가 A 객체를 포함하고 있다.
    • B 객체가 A 객체의 정보를 기록하고 있다.
    • A 객체가 B 객체의 일부이다.
    • B 객체가 A 객체를 긴밀하게 사용하고 있다.
    • B 객체가 A 객체의 생성에 필요한 정보를 가지고 있다.
  • Factory Pattern

Controller

  • 시스템 이벤트(사용자의 요청)를 처리할 객체를 만들자.
  • 만약 어떤 서브시스템안에 있는 각 객체의 기능을 직접 사용한다면?
    • 직접적으로 각 객체에 접근하게 된다면 서브시스템과 외부간의 Coupling이 증가되고
    • 서브시스템의 어떤 객체를 수정할 경우, 외부에 주는 충격이 크게 된다.
    • 서브시스템을 사용하는 입장에서 보면, 이 Controller 객체만 알고 있으면 되므로 사용하기 쉽다.

Low Coupling

  • 객체들간, 서브 시스템들간의 상호의존도가 낮게 책임을 부여.
  • Low Coupling은 각 객체, 서브시스템의 재 사용성을 높이고, 시스템 관리에 편하게 한다.
  • Object-Oriented 시스템은 각 객체들간의 Communication을 통하여 비즈니스를 완성시킴.
    • 각 객체들 사이에 Coupling이 존재하지 않을 수는 없다.

이 패턴은 요구사항은 충족시키면서도 각 객체들, 각 서브시스템 간의 Coupling를 낮은 수준으로 유지하는 방향으로 디자인.

High Cohesion

  • 각 객체가 밀접하게 연관된 책임들만 가지도록 구성.
  • 한 객체, 한 시스템이 자기 자신이 부여받은 책임만을 수행하도록 짜임새 있게 구성되어 있다면?
    • 자신이 부여 받은 책임을 충족시키기 위해 다른 객체나 시스템을 참조하는 일이 적으며 자연스럽게 Low Coupling이 된다.

Polymorphism

  • 객체의 종류에 따라 행동양식이 바뀐다면, Polymorphism 기능을 사용하자.
  • 만약 객체의 종류에 따라 행동이 바뀐다면 객체의 종류를 체크하는 조건문을 사용하지 말고
    • Object-Oriented 시스템의 Polymorphism 기능을 사용하라.

Pure Fabrication

  • 도메인에 관련된 문제를 대표하는 것이 아니라면 기능적인 책임을 별도로 한 곳으로 관리하는 객체를 만들자.
    • 데이터베이스 정보를 저장하거나, 로그 정보를 기록하는 책임에 대해 생각해 보자. 각 정보는 각각의 객체들이 가지고 있을 것이다.
    • Information Expert 패턴을 적용하면?
      • 각 객체들이 정보를 저장하고, 로그를 기록하는 책임을 담당해야 하지만, 실제로 그렇게 사용하는 사람들은 없다.
  • 시스템 전반적으로 사용하고 있는 기능을 변경한다면?
    • 모든 객체를 수정해야 하는 결과를 가져온다.
    • 즉 Low Coupling의 원칙이 깨어지게 된다.
      • 이럴 경우에는 공통적인 기능을 제공하는 책임을 한 곳으로 모아서 가상의 객체, 서브시스템을 만들어라.

Indirection

  • 두 객체 사이의 직접적인 Coupling을 피하고 싶으면, 그 사이에 다른 매개체를 통해 전달하는 것.
  • 주로 다른 매개체는 인터페이스인 경우가 많다.
    • 그런 특별한 경우는 아래에 설명된 Protected Variations 패턴이라고 부를 수 있다.

Protected Variations

  • 변경될 여지가 있는 곳에 안정된 인터페이스를 정의해서 사용하자.

생각 정리

  • Refactoring에서 많이 배운 기법들이 GRASP Pattern을 잘 지키기 위한 방법으로 보인다.

Reference

0%