14 일관성 있는 협력

 

들어가며

 

객체들의 협력이 전체적으로 일관성 있는 유사한 패턴을 따른다면

시스템을 이해하고 확장하기 위해 요구되는 부담을 크게 줄일 수 있다.

 

 

 

설계에 일관성 부여하기

 

협력을 일관성있게 만들기 위해서는 다음과 같은 지침이 도움이 될 것이다.

 

1. 변하는 개념을 변하지 않는 개념으로부터 분리하라.

2. 변하는 개념을 캡슐화하라.

 

첫번째 지침은 다음 예제로 설명된다.

 

 

분기되는 로직에서 'D'라는 타입이 추가된다고 가정하자.

조건문에 새로 'D'타입을 추가해야하기 때문에 기존 코드를 수정해야하는 문제가 발생되며 오류를 발생시킬 확률도 증가한다.

위 로직은 개별적인 변경이 발생하며 변하지 않는 개념으로부터 분리해야한다.

 

Policy를 인터페이스로 두고 이를 상속한 자식클래스들(APolicy, BPolicy ...)을 구현하면 새로운 타입이 추가 될시 기존 코드 수정이 필요 없이 확장만 하면 되기 때문에 객체지향 설계에 맞는 일관성있는 구조로 변경될 수 있다. 

 

 

두번째지침은 위의 코드로 알 수 있다.

Example 클래스는 Policy 클래스만 의존하며  APolicy, BPolicy.. 등 구체클래스는 알 수 없다. 즉 구체적인 내용에 대해서는 캡슐화 되어 있음을 알 수 있다.

 

 

 

 

핵심은 추상화에 의존하는것이다. 클래스는 추상적일수록 변경가능성이 낮으며 런타임에 추상화를 상속한 구체클래스를 결정하기 때문에 추상화에 의존하면 결합도가 낮아지게 된다. 결과적으로 대체 가능한 역할로 구성된 협력을 설계할 수 있게 해준다.

 

 

 

캡슐화 다시 살펴보기

 

캡슐화란 단순히 데이터를 은닉하는것이 아니다.

캡슐화란 변하는 어떤 것이든 감추는 것이다.

 

캡슐화의 종류는 다음과 같이 존재한다.

 

데이터 캡슐화 : 인스터스 변수를 private으로 선언하며 해당 변수에 대한 접근은 pulbic 메서드를 사용한다.

 

메서드 캡슐화 : 추상클래스의 protected으로 선언된 메서드가 존재한다면 추상클래스, 서브클래스에서만 접근이 가능하기 때문에 클래스 외부에 영향을 미치지 않고 메서드 수정이 가능하다. (클래스 내부 행동 캡슐화)

 

객체 캡슐화 : 어떤 클래스가 다른 클래스를 인스턴스변수로 포함(합성)하고 있으면 서로의 관계가 변경되더라도 외부에는 영향을 미치지 않는다. (객체와 객체사이의 관계를 캡슐화)

 

서브타입 캡슐화 : 앞에서 살펴보았던 예제처럼 Example 클래스 입장에서 Policy의 서브타입 클래스의 존재를 감추고 있다. 이는 다형성의 기반이 된다. (서브타입의 종류를 캡슐화)

 

 

 

개념적 무결성

 

유사한 기능에 대해 유사한 협력 패턴을 적용하는 것은 객체지향 시스템에서 개념적 무결성(= 일관성)을 유지할 수 있는 가장 효과적인 방법이다.

좋은 기능들이지만 서로 독립적이고 조화롭지 못한다면 기존의 지식이 유사한 기능을 이해하는데 아무런 도움이 되지 못한다.

개념적 무결성을 유지하게된다면 코드를 한번 이해한 후 이 지식을 다른코드를 이해하는 데 그대로 적용할 수 있다.

 

따라서 협력을 설계하고 있다면 일관성있게 항상 기존의 협력 패턴을 따를 수는 없는지 고민해야한다.

-> 시스템 이해, 수정, 확장하는 데 필요한 시간과 노력을 아낄 수 있다.

 

 

 

 

 

'📚 Book > Object' 카테고리의 다른 글

15 디자인 패턴과 프레임워크  (0) 2020.05.10
13 서브클래싱과 서브타이핑  (0) 2020.04.26
12 다형성  (0) 2020.04.12
11 합성과 유연한 설계  (0) 2020.03.29
10 상속과 코드 재사용  (0) 2020.03.22