오브젝트 - 14. 일관성 있는 협력

강준혁·2022년 9월 20일
0

오브젝트

목록 보기
14/14
post-thumbnail

객체는 협력을 위해 존재한다. 협력은 객체가 존재하는 이유와 문맥을 제공한다. 객체지향 설계의 목표는 적절한 책임을 수행하는 객체들의 협력을 기반으로 결합도가 낮고 재사용 가능한 코드 구조를 창조하는 것이다.

일관성있는 설계의 필요성

유사한 요구사항을 계속 추가해야 하는 상황에서 각 협력이 서로 다른 패턴을 따를 경우에는 전체적인 설계의 일관성이 서서히 무너지게 된다.

객체지향 패러다임의 장점은 설계를 재사용할 수 있다는 것이다.
재사용을 위해서는 객체들의 협력 방식을 일관성 있게 만들어야 한다.

일관성은 설계에 드는 비용을 감소시킨다. 과거의 해결 방법을 반복적으로 사용해서 유사한 기능을 구현하는데 드는 시간과 노력의 절약이 가능하기 때문이다.

또한 일관성있는 설계는 코드를 이해하기 쉽게 만든다.
특정 문제를 유사한 방법으로 해결하고 있다는 사실을 알면 문제를 이해하는 것 만으로도 코드의 구조를 예상할 수 있게 된다.

비일관적인 협력

비일관성은 다음의 두 가지 상황에서 발목을 잡는다.

  • 새로운 구현을 추가해야 하는 상황
  • 기존의 구현을 이해해야 하는 상황

대부분의 사람들은 유사한 요구사항을 구현하는 코드는 유사한 방식으로 구현될 것이라고 예상한다.
하지만 유사한 요구사항이 서로 다른 방식으로 구현되어 있다면 유사하다는 사실 자체도 의심하게 될 것이다.

설계에 일관성 부여하기

다양한 설계 경험을 익혀라

풍부한 경험을 가진 사람은 어떤 변경이 중요한지, 그 변경을 어떻게 다뤄야 하는지에 대한 통찰력을 갖게 된다.
어떤 위치에서 일관성을 보장해야 하고 일관성을 제공하기 위해 어떤 방법을 사용해야 하는지를 직관적으로 결정할 수 있다.

널리 알려진 디자인 패턴을 학습하고 다양한 문맥에서 적용해보라

디자인 패턴은 특정한 변경에 대해 일관성 있는 설계를 만들 수 있는 경험 법칙을 모아놓은 일종의 설계 템플릿이다.
디자인 패턴을 학습하면 빠른 시간안에 전문가의 경험을 흡수할 수 있다.

변하는 개념을 변하지 않는것으로부터 분리하고 캡슐화 하라

캡슐화에는 다양한 종류가 존재한다.

  • 데이터 캡슐화 : 클래스의 인스턴스 변수를 private 으로 제한하는 것 등
  • 메서드 캡슐화 : 클래스의 메서드 가시성을 private 또는 protected로 제한하는 것 등
  • 객체 캡슐화 : 클래스가 의존하는 객체에 대한 접근을 제한하는 것 등
  • 서브타입 캡슐화 : 클래스가 인터페이스 또는 추상 클래스에만 의존하고 그 서브 타입에 대해서는 은닉하는 것 등

서브타입 캡슐화와 객체 캡슐화를 적용하는 방법은 다음과 같다.

  • 변하는 부분을 분리해서 타입 계층을 만든다 : 변하는 부분들의 공통적 행동을 추상클래스 또는 인터페이스로 추상화 한 후 변하는 부분들이 이를 상속받도록 한다.
  • 변하지 않는 부분의 일부로 타입 계층을 합성한다 : 변하지 않는 부분에 대해서는 변하는 구체적인 사항에 결합되어서는 안된다. 의존성 주입과 같이 결합도를 느슨하게 유지할 수 있는 방법을 이용해 오직 추상화에만 의존하게 만든다.

지속적으로 개선하라

처음에는 일관성을 유지하는 것처럼 보이던 협력 패턴이 시간이 흐르면서 새로운 요구사항이 추가되는 과정에서 일관성의 벽이 조금씩 금이 가는 경우를 자주 보게된다.
협력을 설계하는 초기 단계에서 모든 요구사항을 미리 예상할 수 없기 때문에 이것은 잘못이 아니며 꽤나 자연스러운 현상이다.

협력은 고정된 것이 아니다. 만약 현재의 협력 패턴이 변경의 무게를 지탱하기 어렵다면 변경을 수용할 수 있는 협력패턴을 향해 과감하게 리팩터링 하라.
중요한 것은 현재의 설계에 맹목적으로 일관성을 맞추는 것이 아니라 달라지는 변경의 방향에 맞춰 지속적으로 코드를 개선하려는 의지다.

객체지향 설계는 객체의 행동과 그것을 지원하기 위한 구조를 계속 수정해나가는 작업을 반복하며 다듬어진다. 협력자들 간에 부하를 좀 더 균형있게 배분하는 방법을 새로 만들어내면 나눠줄 책임이 바뀌게 된다. 만약 객체들이 서로 통신하는 방법을 개선해냈다면 이들간의 상호작용은 재정의되어야 한다. 이 같은 과정을 거치며 객체들이 자주 통신하는 경로는 더욱 효율적이게 되고 주어진 작업을 수행하는 표준 방안이 정착된다.

profile
백엔드 개발자

0개의 댓글