•
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 원칙을 숙달하는 것은 잘 구조화되고 확장 가능한 객체지향 시스템을 창조하려는 모든 소프트웨어 디자이너에게 중요하다.