GRASP Pattern

우동이·2022년 1월 5일
post-thumbnail
  • General Responsibility Assignment Software Patterns
  • 기본 OOP 디자인의 핵심 문제는 각 객체에 역할(또는 책임)을 부여하는 것입니다.
  • GRASP도 역할 부여의 원칙들을 의미하고 있습니다.
    • 총 9가지로 구성
  • 각각의 여러가지 디자인 패턴들은 GRASP가 제시하는 상황들을 구체적으로 구현한 것이 대부분입니다.

1. Information Expert

  • 역할을 수행할 수 있는 정보를 가지고 있는 객체에 역할을 부여해야 합니다.
    • 객체는 데이터와 처리로직이 함께 묶여 있는 것을 의미
    • 자신의 데이터를 감추고 싶으면 오직 자기 자신의 처리 로직에서만 데이터를 처리
    • 외부에는 그 기능 / 역할만 제공

2. Creator

  • 객체의 생성은 생성되는 객체의 컨텍스트를 알고 있는 다른 객체가 존해한다면 그 객체에 부여해야 합니다.
  • A객체와 B객체의 관계가 다음 중 하나면 A의 생성을 B에게 부여해야 합니다.
    • B객체가 A객체를 포함하고 있습니다.
    • B객체가 A객체의 정보를 기록하고 있습니다.
    • A객체가 B객체의 일부입니다.
    • B객체가 A객체를 긴밀하게 사용하고 있습니다.
    • B객체가 A객체의 생성에 필요한 정보를 가지고 있습니다.

3. Controller

  • 시스템 이벤트 / 사용자 요청을 처리하는 객체를 만들어야 합니다.
  • 하위 서브 시스템으로 들어오는 외부 요청을 처리하는 객체를 만들어서 사용한다는 의미입니다.
  • 서브 시스템에 있는 각 객체의 기능을 사용할 때 직접적으로 객체에 접근하게 된다면 서브 시스템과 외부간의 의존성이 생기게 됩니다.
  • 즉 서브 시스템의 어떤 객체에 대해 수정할 경우 외부와의 의존성 때문에 사이드 이펙트가 발생하게 됩니다.
  • 그래서 중간에 Controller 객체가 이를 처리해주고 서브시스템을 사용하는 주체는 Controller 객체만 알고 있으면 됩니다.

4. Low Coupling

  • 객체 / 서비 시스템들간의 상호 의존성을 낮게 역할을 부여해야 합니다.
  • 각 객체들간의 의존성을 줄이면서 객체들간의 상호작용을 구현하는 방식을 디자인이라고 흔히 말합니다.
  • 각 객체들간의 재사용성을 높일 수 있고 시스템 관리를 효율적으로 할 수 있습니다.

5. High Cohesion

  • 객체들마다 밀접하게 연관된 역할들만 가질 수 있도록 역할을 부여해야 합니다.
  • 한 서브시스템이 자기 자신이 부여받은 역할만 수행하게 된다면 다른 객체나 시스템을 참조할 일이 적어지고 그로 인해 의존성이 낮아지므로 Low Coupling 효과를 가저올 수 있습니다.

6. Polymorphism

  • 객체의 종류에 따라서 행동양식들이 변경된다면 OOP에서 제공하는 상속 / 다형성 기능을 사용해야 합니다.
  • 만약에 객체의 종류에 따라서 행동들이 바뀐다면 객체의 종류를 분기처리 하지말고 다형성 기능을 이용하면 됩니다.

7. Pure Fabrication

  • 앞 서 설명한 Information Expert 패턴을 적용했을때 Low Coupling / High Cohesion 원칙이 깨진다면 기능적인 역할을 별도로 분리해야 합니다.
  • 공통적인 기능을 제공하는 역할을 한 곳으로 모아서 가상의 객체 또는 서브 시스템을 만들어야 합니다.

8. Indirection

  • 두 객체 사이의 직접적인 Couplng을 피하고 싶으면 사이에 다른 객체를 사용해야 합니다.
    • 다른 객체는 대표적으로 인터페이스를 의미합니다.

9. Protected Variations

  • 변경될 여지가 있는 곳에는 안정된 인터페이스를 정의해서 사용해야 합니다.
  • 해당 기능을 사용하는 사용자 입장에서는 내부 구현방식이 변경되더라도 인터페이스만 보고 사용함으로써 자신의 코드를 변경하지 않아도 되고 대응할 필요가 없어집니다.

참고

profile
아직 나는 취해있을 수 없다...

0개의 댓글