반응형

클린 코드 TDD 과정을 진행 중 일급 컬렉션에 대해 잘못 이해한 부분이 있어 정리를 하기 위해 작성하는 글 입니다.

먼저 해당 글을 참고 하였습니다.

일급 컬렉션 장점 중 비지니스에 종속적인 자료구조에 대해 추가 설명을 하는 내용이니 이를 모르시는 분은
해당 글을 보고 오시면 좋을 것 같습니다.

비지니스에 종속적인 자료구조


먼저 제가 잘못 생각한 부분은 이렇습니다.

일급 컬렉션은 하나의 컬렉션 인스턴스 변수를 가지고 내부에서 로직을 수행하면 된다!! 라고 이해 하였습니다.
상태와 로직이 한 곳에서 관리된다는 장점을 종속적인 자료구조라고 이해한 것 입니다.
위와 같이만 작성을 해도 외부에서 사용할 때는 일급 컬렉션 내부는 신경 쓸 일이 없고, 작성된 로직을
사용하면 되기 때문에 종속 되었다!! 라고 생각하였습니다.
이것도 맞는 말일 수 있습니다. 하지만 종속적인 자료구조란 검증 로직을 절대 거스를 수 없는 자료구조 입니다.

결국 아래와 같은 의문이 들었습니다.

일급 컬렉션 내부에서 신규 메소드에 로직이 추가 된다면 검증 하던 로직이 동일하게 필요한 것 아닐까?

이 의미는 무엇일까요? 아래 코드로 살펴 보겠습니다.

자동차 경주라는 미션을 수행하며 작성한 코드 입니다. 용도는 자동차의 이동 거리 저장하는 역할입니다.
이전 이동한 거리에 + 1을 하여 다음 거리를 저장하게 됩니다. 여기서 거리는 index입니다.

여기서 중요한 메소드는 getLastIndex() 입니다. 이 메서드는 최종 이동 거리를 가져오는 메소드 입니다.
문제는 CarIndex()가 생성된 시점은 빈 컬렉션이기 때문에 이 시점에 getLastIndex의 return 하는 라인에서
index 초과 런타임 에러가 발생하게 됩니다.
return 하는 라인의 indexes.get(-1)이 되기 때문입니다. 그래서 validateNotMove()메소드를 사용하였습니다.

/* 축약된 소스 입니다. */
public class CarIndex {

    private static final int START_MOVE_INDEX = 1;
    private static final int MINIMUM_MOVE_INDEX = 0;

    private static final int NEXT_MOVE_INDEX = 1;

    private final List<Integer> indexes = new ArrayList<>();

    public CarIndex() {}

    public CarIndex(List<Integer> indexes) {
        this.indexes.addAll(indexes);
    }

    public int getLastIndex() {
        validateNotMove();

        return indexes.get(indexes.size() - 1);
    }

    private void validateNotMove() {
        int index = indexes.size() - 1;

        if (index < 0) {
            throw new IllegalArgumentException("자동차가 이동한 기록이 없습니다.");
        }
    }
}

그런데 만약 여기서 또 다른 메소드를 생성하여 indexes.size() - 1을 필요로 하는 로직이 들어간다고 하면 동일하게
validateNotMove()메소드가 필요하게 됩니다. 물론 추가하면 됩니다. 하지만 이 부분 역시 외부에서
사용하지 않는다 뿐이지 내부에서 잘 모르는 개발자가 로직을 추가할 경우 validateNotMove을 빼 먹을 수 있습니다.
결국 완벽하게 비지니스에 종속적인 자료구조라고 볼 수 없다는 것 입니다. 그럼 신규 추가된 메소드를 사용하는
코드들은 필수 검증 로직을 무시하게 되는 것입니다.
즉, 생성 시점에 필수 검증 로직을 처리할 수 있도록 해야 비지니스에 종속적인 자료구조의 장점을 살린다고 볼 수 있습니다.

 

p.s 해결하는 코드가 없습니다. 다음 미션에서 참고하여 진행해도 되는 부분이라고 생각하기 때문입니다.

반응형
복사했습니다!