객체지향 - 응집도 낮은 클래스 특징

dragonappear·2021년 11월 26일
0

OOP

목록 보기
3/3

public class DiscountCondition {
    private DiscountConditionType type;
    private DayOfWeek dayOfWeek;
    private LocalTime startTime;
    private LocalTime endTime;
    private int sequence;

    public boolean isSatisfiedBy(Screening screening) {
        if (type == DiscountConditionType.PERIOD) {
            return isSatisfiedByPeriod(screening);
        }
        return isSatisfiedBySequence(screening);
    }

    private boolean isSatisfiedByPeriod(Screening screening) {
        return dayOfWeek.equals(screening.getWhenScreened().getDayOfWeek()) &&
                startTime.compareTo(screening.getWhenScreened().toLocalTime()) <= 0 &&
                endTime.compareTo(screening.getWhenScreened().toLocalTime())>=0;
    }

    private boolean isSatisfiedBySequence(Screening screening) {
        return this.sequence == screening.getSequence();
    }
}
  • 위 코드는 변경에 취약한 클래스이다.
  • 위 코드에서는 변경의 이유가 다양하다.
  1. 새로운 할인 조건이 추가 될때

    • isSatisfiedBy 메서드 안의 if ~ else 구문을 수정해야 한다. 물론 새로운 할인 조건이 새로운 데이터가 필요하다면 DiscountCondition에 속성을 추가하는 작업도 필요하다.
  2. 순번 조건을 판단하는 로직이 변경될때

    • isSatisfiedBySequence 메서드의 내부 구현을 수정해야 한다. 물론 순번 조건을 판단하는데 필요한 데이터가 변경된다면 DiscountCondition의 sequence 속성 역시 변경해야 한다.
  3. 기간 조건을 판단하는 로직이 변경될때

    • isSatisfiedByPeriod 메서드의 내부 구현을 수정해야 한다. 물론 기간 조건을 판단하는데 필요한 데이터가 변경된다면 DiscountCondition의 시간 속성도 역시 변경해야 한다.

DiscountCondition은 하나 이상의 변경 이유를 가지기 때문에 응집도가 낮다.

응집도가 낮다는 것은 서로 연관성이 없는 기능이나 데이터가 하나의 클래스 안에 뭉쳐져 있다는 것을 의미한다.

따라서 낮은 응집도가 초래하는 문제를 해결하기 위해서는 변경의 이유에 따라 클래스를 분리해야 한다.

따라서 일반적으로 설계를 개선하는 작업은 변경의 이유가 하나 이상인 클래스를 찾는 것으로부터 시작하는 것이 좋다. 또한 변겨으이 이유가 하나 이상인 클래스에서는 위험 징후를 또렷하게 드러내는 몇 가지 패턴이 존재한다.

코드를 통해 변경의 이유를 파악할 수 있는 방법

1. 인스턴스 변수가 초기화되는 시점을 살펴보자.

응집도가 높은 클래스는 인스턴스를 생성할 때 모든 속성을 함께 초기화한다. 반면 응집도가 낮은 클래스는 객체의 속성 중 일부만 초기화하고 일부는 초기화되지 않는 상태로 남겨진다.

위 DiscountCondition 클래스를 살펴보면 순번 조건일때 sequence는 초기화되지만 나머지는 오기화 되지 않는다. 역도 똑같다.

즉, 클래스의 속성이 서로 다른 시점에 초기화되거나 일부만 초기화된다는 것은 응집도가 낮다는 증거이다.

따라서, 함께 초기화되는 속성을 기준으로 코드를 분리해야한다.

2. 메서드들이 인스턴스 변수를 사용하는 방식을 살펴보자.

모든 메서드가 객체의 모든 속성을 사용한다면 클래스의 응집도는 높다고 볼 수 있다. 반면 메서드들이 사용하는 속성에 따라 그룹이 나뉜다면 클래스의 응집도가 낮다고 볼 수 있다.

즉, 클래스의 응집도를 높이기 위해서는 속성그룹과 해당 그룹에 접근하는 메서드 그룹을 기준으로 코드를 분리해야 한다.


정리:

클래스 응집도 판단하기

클래스의 응집도를 판단할 수 있는 세가지 방법이 있다.

  1. 클래스가 하나 이상의 이유로 변경돼야 한다면 응집도가 낮은 것이다.-> 변경의 이유를 기준으로 클래스를 분리하라.

  2. 클래스의 인스턴스를 초기화하는 시점에 경우에 따라 서로 다른 속성들을 초기화하고 있다면 응집도가 낮은 것이다. -> 초기화되는 속성의 그룹을 기준으로 클래스를 분리하라.

  3. 메서드 구립이 속성그룹을 사용하는지 여부로 나뉜다면 응집도가 낮은 것이다. -> 이들 그룹을 기준으로 클래스를 분리하라.

일반적으로 응집도가 낮은 클래스는 위 세가지 문제를 다 가지고 있다.


출처

조용호, 『오브젝트』, 위키북스(2019), p149~153.

0개의 댓글