GRASP (object-oriented design)

Ssabae·2020년 4월 10일
3

OOP

목록 보기
2/2
post-thumbnail

What is GRASP?

GRASP는 객체 지향 디자인의 클래스 및 객체에 책임을 할당하기위한 지침으로 구성됩니다.
SOLID 설계 원칙과 관련이 없다고는 하지만 서로 엮여있는 부분이 조금씩은 있습니다.

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

"After identifying your requirements and creating a domain model, then add methods to the appropriate classes, and define the messaging between the objects to fulfill the requirements"
"요구 사항을 식별하고 도메인 모델을 작성한 후 적절한 클래스에 메소드를 추가하고 요구 사항을 충족시키기 위해 오브젝트 간 메시징을 정의하십시오."
- Craig Larman

Controller

컨트롤러 패턴은 시스템 이벤트를 처리하는 책임을 전체 시스템 또는 사용 사례 시나리오를 나타내는 non-UI 클래스에 할당합니다. 컨트롤러 개체는 시스템 이벤트를 받거나 처리하는 non-User Interface 개체입니다.

컨트롤러는 모든 시스템 이벤트를 처리하는 데 사용되어야 하며 둘 이상의 use case에서도 사용 가능합니다. 예를들어 사용자 생성 및 사용자 삭제의 경우 두 개의 개별 컨트롤러 대신 UserController라는 단일 클래스로 구성할 수 있습니다.

컨트롤러는 시스템 작동을 수신하고 제어하는 UI 계층을 이외의 첫 번째 개체로 정의됩니다. 컨트롤러는 수행해야 할 작업을 다른 개체에 위임해야 하며, 활동을 조정하거나 통제해야 하지만 컨트롤러 자체가 많은 일을 해서는 안 됩니다. GRASP 컨트롤러는 정보 시스템 논리 아키텍처에 공통 계층이 있는 객체 지향 시스템에서 애플리케이션/서비스 계층(애플리케이션/서비스 계층과 도메인 계층을 명시적으로 구별했다고 가정)의 일부라고 생각할 수 있습니다.

Creator

객체 생성은 객체 지향 시스템에서 가장 일반적인 활동 중 하나입니다. 객체 생성을 담당하는 클래스는 특정 클래스의 객체 간 관계에 대한 기본 속성입니다.

일반적으로, 클래스 B는 다음 중 하나 또는 그 이상이 적용되는 경우 클래스 A의 인스턴스를 생성할 책임이 있습니다.

  • B 객체가 A 객체를 포함하고 있다.
  • B 객체가 A 객체의 정보를 기록하고 있다.
  • A 객체가 B 객체의 일부이다.
  • B 객체가 A 객체를 긴밀하게 사용하고 있다.
  • B 객체가 A 객체의 생성에 필요한 정보를 가지고 있다.

Factory Pattern

Indirection

두 객체 사이의 중간 요소에 중재 책임을 할당하여 두 요소 간의 낮은 결합 및 재사용 가능성을 지원합니다. 이에 대한 예로는 Model-View Controll(MVC) 패턴에서 데이터(모델)와 표현(뷰) 사이의 중개를위한 컨트롤러 구성 요소를 도입합니다. 이것은 그들 사이의 낮은 결합 상태를 유지하도록 보장합니다.

Information expert

Information expert는 역할을 수행할 수 있는 정보, 계산 된 필드 등의 책임을 위임 할 위치를 결정하는데 사용되는 원칙입니다.

Information expert를 이용하여, 책임을 할당하는 일반적인 방법은 주어진 책임을 확인하고 그 책임을 이행하는 데 필요한 정보를 결정한 다음 해당 정보가 저장되는 위치를 결정하는 것입니다.
그리고 그것을 이행하는 데 필요한 가장 많은 정보를 가지고 있는 Class가 책임을지게됩니다.

객체는 데이터와 처리로직이 함께 묶여 있으며 자신의 데이터를 감추고자 하면 오직 자기 자신의 처리 로직에서만 데이터를 처리하고, 외부에는 그 기능(역할)만을 제공하게합니다.

High cohesion

높은 응집력은 객체를 적절하게 집중시키며 관리할 수 있고 이해가능하게 만드는 패턴입니다.
높은 응집력은 일반적으로 낮은 결합을 지원하는데 사용됩니다. 응집력이 높다는것은 주어진 요소의 책임이 밀접하게 관련되어 있고 집중되어 있음을 의미합니다. 프로그램을 클래스와 서브 시스템으로 나누는 것은 시스템의 응집력을 높이는 한 예입니다. 대한적으로, 낮은 응집력은 주어진 요소들이 관련없는 책임을 너무 많이 갖는 상황입니다. 응집력이 낮은 요소들은 종종 이해하기 어렵고 재사용이 어려우며 유지보수를 힘들게 만듭니다.

Low coupling

Object-Oriented 시스템은 각 객체들과 그들 간 상호작용을 통하여 요구사항을 충족시키는 것을 기본으로 합니다. 그러므로 각 객체들 사이에 커플링이 존재하지 않을 수 없습니다.
커플링이란 요소가 다른 요소에 얼마나 강력하게 연결되어있거나 다른 요소에 대해 알고있거나 의존하는지에 대한것을 나타내는 척도입니다. 낮은 결합도는 지원 책임을 할당하는 방법을 결정하는 평가 패턴입니다.

  • 클래스간의 종속성이 낮다
  • 한 클래스의 변화가 다른 클래스에 미치는 영향이 낮다.
  • 높은 재사용 가능성

Polymorphism

다형성 원리에 따르면, 유형에 따른 행동의 변경을 정의하는 책임은 이러한 변형이 발생하는 유형에 할당됩니다. 이것은 다형성 연산을 사용하여 달성됩니다. 객체의 Type으로 분기를 처리하는 영역에서는 명시적인 분기 대신 다형성 연산을 사용해야합니다. Object-Oriented 시스템의 특징이자 장점인 상속과 Polymorphism(다형성)을 아낌없이 사용하길 권장합니다.

Protected variations

Protected variations 패턴은 변경될 여지가 있는곳에 안정된 인터페이스를 정의하여 사용합니다. 인터페이스로 감싸고 다형성을 사용하여 이 인터페이스의 다양한 구현을 생성함으로써 다른 요소(객체, 시스템, 서브시스템)에 대한 변화로부터 요소를 보호합니다.

Pure fabrication

Pure fabrication은 문제 영역의 개념을 나타내지 않는 클래스로 특히 낮은 결합도, 높은 응집력 및 그 재사용 가능성을 달성하기 위해 구성됩니다. (Information expert 패턴 적용 시 Low Coupling과 High Cohesion의 원칙이 깨어진다면, 기능적인 역할을 별도로 한 곳으로 모으도록합니다.)
DB 정보, 로그 정보를 저장하는 기능을 예로들면 각 정보는 객체를 가지고있으며 이때 Information Expert 패턴을 적용하면 각 객체들이 정보를 저장하고 로그를 기록하는 역할을 담당해야 하지만, 실제로 그렇게 사용하는 예는 찾기 힘듭니다.
이것은 그 기능들이 시스템 전반적으로 사용되고 있기 때문에 각 객체에 그 기능을 부여하는 것은 각 객체들이 특정 데이터베이스의 종속을 가져오거나 로그를 기록하는 프로세스를 수정할 경우, 모든 객체를 수정해야 하는 결과를 가져오게됩니다.
이럴때는 공통적인 기능을 제공하는 역할을 한 곳으로 모아서 가상의 객체, 서브시스템을 만들어야합니다.
이러한 종류의 클래스는 도메인 중심 설계에서 (DDD) 서비스라고 불리웁니다.

출처
김대곤 님의 GRASP 패턴
위키피디아 https://en.wikipedia.org/wiki/GRASP_(object-oriented_design)

profile
Front-End 부터 Back-End 까지 잘 하고 싶은 개발자

2개의 댓글

comment-user-thumbnail
2021년 8월 2일

좋은글 감사합니다! TIL작성중 해당글을 인용해도 될까요?

1개의 답글