Search
Duplicate
📸

GRASP

General Responsibility Assignment Software Patterns의 줄임말이다.
이는 객체지향 개발 프로세스를 진행하는 도중에 설계자로 하여금 정보에 기반하여 결정을 내리는 것에 도움을 줄 수 있는 가이드라인들이다.
GRASP 주요 원칙들을 살펴보고 그들이 어떻게 유연한 소프트웨어를 만드는 데 기여하는 지 알아보자.

Creator

클래스의 생성은 생성되는 클래스의 맥락을 알고 있는 다른 클래스가 있다면 해당 맥락을 알고 있는 클래스에서 해주어야 한다.
Creator 원칙은 객체를 생성할때 책임을 할당하는 것에 도움을 준다.
다음과 같이 예시를 들어볼 수 있겠다.
A 객체와 B 객체의 관계가 다음 중 하나라면 A의 생성을 B에서 수행한다.
B 객체가 A 객체를 조합 중에 하나로 사용한다.
A 객체가 B 객체의 일부이다.
B 객체가 A 객체를 긴밀하게 사용하고 있다.
B 객체가 A 객체의 생성에 필요한 정보를 가지고 있다.
B 객체가 A 객체의 정보를 일부 기록하고 있다.
디자인 패턴 중 추상 팩토리 패턴이 생각났다.

Information Expert

캡슐화를 통해 자신의 정보를 감추고 오직 메소드로만 데이터를 처리하고 외부에는 그것을 호출할 수 있는 기능만을 제공하라.
Information Expert 원칙은 뭔가를 수행하는 데 필요한 가장 많은 정보를 갖고 있는 클래스에 책임을 할당하는 데 초점을 맞춘다.
클래스란 변수와 메소드가 함께 묶여있는 것이다.

Controller

시스템에 의존하는 경우를 대비해서 표현 계층을 두어라.
다음 중 하나의 책임을 가지고 있다면 표현 계층의 역할을 할당하는 것이 좋다.
시스템 전체 또는 최상위 객체다.
시스템 실행을 구성하는 유스케이스 시나리오를 표현한다.

Low Coupling

클래스를 설계할 때 다른 클래스에 대한 의존성을 최소한으로 설계하라는 것이다.
클래스들 간의 연결을 줄임으로써 우리는 더욱 유연하고 잘 모듈화된 시스템을 만들 수 있다.
낮은 결합도를 달성하는 것은 특정한 하나의 클래스의 변경이 다른 클래스에 영향을 미치는 것을 줄여주어 유지보수성을 향상시켜준다.
추상 클래스나 인터페이스를 사용하는 것이 결합도를 최소화시켜주면서도 코드 재사용성을 향상시켜주는 좋은 방법이다.

High Cohesion

높은 응집도 원칙은 분명하고 집중된 목적을 가지고 클래스를 설계하는 것을 강조하라는 것이다.
한 클래스는 하나의 책임을 가져야하고 이 책임에 관련된 메소드와 데이터를 캡슐화해야 한다.
응집력 있는 클래스는 이해하기 쉬우며 테스트, 유지보수하기에도 용이하다. 코드 재사용을 촉진하며 시스템 내의 변경 사항으로부터 발생하는 영향을 최소화한다.

Polymorphism

다형성은 기초적인 객체지향 설계 원칙 중 하나로 공통의 인터페이스를 구현하는 다양한 클래스들의 객체들이 특정한 타입으로 다뤄지도록 하는 것이다.
다형성을 활용하면 우리는 새로운 요구사항에 대해 확장에 용이한 시스템을 설계할 수 있다.
다형성은 재사용성을 높여주고 느슨하게 결합된 시스템을 촉진한다.

Pure Fabrication

Pure Fabrication 원칙은 시스템 설계를 향상시키기 위해 가상의 클래스들을 생성하는 것을 추천한다.
이러한 클래스들은 해결해야 하는 도메인이나 문제와 직접적으로 연결되어 있지 않지만 다른 클래스들 사이에서 연결 요소로 작용한다.
Pure Fabrication은 복잡한 작업을 캡슐화하거나 외부 시스템과의 인터페이스를 제공함으로써 낮은 결합도와 높은 응집도를 달성하는 데 도움을 준다.

Protected Variations

Protected Variations 패턴은 변경될 가능성이 있는 경우 추상적으로 정의하여 사용하라는 것이다.
인터페이스로 감싸고 다형성을 사용하여 이 인터페이스의 다양한 구현을 이용하여 다른 요소에 대한 변화로부터 해당 요소를 보호하는 것이다.

Indiection

두 객체 사이의 중간 요소로 하여금 중재의 책임을 할당하여 두 요소 간의 낮은 결합도 및 코드 재사용성을 향상시키는 것이다.
MVC 패턴에서의 모델과 뷰 사이의 컨트롤러를 예시로 들 수 있다.

결론

GRASP 원칙은 객체지향 시스템을 설계할 때 설계자들이 명확한 결정을 내릴 수 있도록 도와주는 일련의 지침을 제공한다.
이러한 원칙을 준수함으로써, 개발자들은 모듈화되고 유연하며 유지보수가 가능한 소프트웨어를 만들 수 있다.
GRASP 원칙을 적용함으로써, 책임의 명확한 분배가 이루어지고 클래스들 간의 낮은 결합도와 높은 응집도를 촉진할 수 있다.
이러한 원칙들은 변화에 적응 가능하고 미래에 확장 가능한 시스템의 개발을 가능하게 한다.
GRASP 원칙을 숙달하는 것은 잘 구조화되고 확장 가능한 객체지향 시스템을 창조하려는 모든 소프트웨어 디자이너에게 중요하다.

참고