ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • '오브젝트' 책 보고 공부하기 - ⑭ 일관성 있는 협력
    JAVA공부/JAVA 2023. 7. 5. 22:11

    1) 핸드폰 과금 시스템 변경하기

     

    기본정책을 추가하기 위해 BasicRatePolicy를 추상화(슈퍼타입)하고 

    FixedFeePolicy(고정요금)

    TimeOfDayDiscountPolicy(시간대별 요금)

    DayOfWeekDiscountPolicy(요일별 요금)

    DurationDiscountPolicy(구간별 요금)

    을 서브타입으로 구현화 한다.

     

    이 후 통화기간을 일자별로 정리하는 전문가 DateTimeInterval 와 각 구현된 요금정책 Policy
    그리고 각 요금규칙 Rule이 요금을 계산해준다.

     

    이때, 생겨나는 Rule을 주의해야한다. 
    클라이언트가 요구하는 슈퍼타입과 별개로 사전조건이 계속 추가되고 있다.

    시간대별, 요일별, 구간별 -> 고정요금을 제외한 사전 조건이 다르다.

    결국, 클라이언트는 다양한 요금 정책을 사용하기 위해서 정책별로 알아야하는 사전조건

    많아 지는 것이다. 

     

     


     

    2) 설계에 일관성 부여하기

     

    협력을 일관성 있게 만들기 위해서는 

     

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

    - 변하는 개념을 캡슐화하라

    의 두가지 지침을 따르도록 하자.

     

    타입을 캡슐화하고 낮은 의존성을 유지하기 위해서는

    1. 인터페이스 설계 원칙들을 적용하여 캡슐화

    2. 의존성 관리 기법을 통해 낮은 결합도 유지

    3. 코드 재사용이 아닌 캡슐화를 위한 상속 사용

    4. 리스코프 치환 원칙을 준수하는 타입계층 구현하는 상속

    을 하도록 하자.

     

    캡슐화란 데이터를 감추는 것만이 아닌 소프트웨어 안에서 변할 수 있는 어떤 '개념'을 감추는 것이다.

    이에 대한 여러 캡슐화 종류를 알아보자

     

    - 데이터 캡슐화 : 필드에 private 선언을 통해 필드 접근을 막고 메서드를 이용해서만 접근 가능케 함

    - 메서드 캡슐화:  메서드에 protected를 통해 클래스 내부 혹은 서브 클래스에만 접근 가능하도록 함.

    - 객체 캡슐화: 클래스 내의 인스턴스 변수를 private함으로써 객체와 객체 사이의 관계를 캡슐화 (합성)

    - 서브타입 캡슐화: 추상화된 인터페이스를 통해 구현체들을 숨기고 실행 시점에 협력할 수 있게 하는 것 (다형성의 기반)

    객체 캡슐화는 합성을 사용하고 서브타입 캡슐화는 인터페이스 상속을 이용한다.

     

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

     

    - 변하는 부분을 분리 후 타입 계층 만듦

    변하는 부분들의 공통적인 행동을 추상 클래스나 인터페이스로 추상화 한 후 변하는 부분들이 

    추상 클래스나 인터페이스를 상속받게 만든다.

     

    - 변하지 않는 부분의 일부로 타입 계층을 합성한다.

    앞에서 구현한 타입 계층을 변하지 않는 부분에 합성한다.

    변하지않는 부분에서는 변경되는 구체적인 사항에 결합되서는 안된다.
    의존성 주입과 같이 결합도를 느슨하게 유지할 수 있는 방법을 이용해 추상화에 의존하게 만든다.

     

     

     


     

    3) 일관성 있는 기본 정책 구현하기

    앞서 핸드폰 과금 시스템에서 변하는 부분과 변하지 않는 부분을 나눠 보면 어떨까?

    핸드폰 과금 시스템에서 변하지 않는 부분은 정책이 한 개 이상의 '규칙'으로 되어있고,

    이 하나의 '규칙'은 '적용조건' 그리고 '단위 요금'의 조합이다.

    그리고 자세히 살펴보면 단위요금을 계산하는 방식은 공통화 할 수 있지만

    적용 조건은 세부적인 내용이 다르다. 바로 이부분을 분리하는 것이다.

     

    1. 변하지 않는 규칙 으로 부터 적용 조건을 분리한다.

    2. 분리이후 추상화된 객체 관계를 모델링 하고, 전송할 메시지를 선택하자.

    3. 추상화된 수준에서 협력을 구현하자. 구체적이지 않아도 된다.

    4. 구체적인 협력을 구현하자 (추상화된 인터페이스를 구현하자)

     

    만약 적용조건이 필요하지 않아 코드의 부조화가 조금 일어나더라도, 다른 규칙과 일관성있게

    코드를 작성하는 것이 개념적 무결성을 지킬 수 있다.

     

    협력패턴이 시간이 흐르면서 추가되고 변경되는 과정에서 일관성의 벽이 금이 가는 경우가 갈 수 있기

    때문에 항상 일관성을 지키는 것보다 변경의 방향에 맞춰 지속적으로 개선해야한다.

     

     

Designed by Tistory.