우테캠 회고-TDD with 인수 테스트

김병호·2021년 7월 10일
0

이번 미션에서는 복잡한 비지니스 로직 적용하기이다. TDD를 하기 어려운 이유는 무엇일까.
현실세계의 문제는 어렵기 때문이다. 인수테스트를 통해서 요구사항을 좀 더 명확히 할 수 있다.
목표를 정하고 내부에서 TDD를 진행한다.

미션 요구사항이 복잡하고 최단 경로 적용같은 라이브러리를 적용해야했기 때문에 난이도가 이전 미션에 비해 어려웠다. 개발을 하면서 도메인간의 관계를 설정하는게 고민이 많이 필요하였다.
그러다보니 유틸 클래스가 많아졌는데, 몇가지 유틸 클래스를 적절한 도메인으로 두지 못했던 것이 아쉬움으로 남는다.

https://github.com/etff/atdd-subway-service/tree/etff

리뷰 받은 내용

public abstract class DiscountPolicy {
    private List<ExtraFarePolicy> extraFarePolicies;
    protected int age;

    public DiscountPolicy(int age, ExtraFarePolicy... extraFarePolicies) {
        this.age = age;
        this.extraFarePolicies = Arrays.asList(extraFarePolicies);
    }

    public int calculateDiscountAmount(int fare, int extraFare) {
        AtomicInteger result = new AtomicInteger(fare);

        extraFarePolicies.stream()
                .filter(policy -> validateAge(age))
                .findFirst()
                .ifPresent(policy -> {
                    result.set(getDiscountAmount(fare + policy.addExtraFee(extraFare)));
                });
        return result.get();
    }

    protected abstract int getDiscountAmount(int fare);

    protected abstract boolean validateAge(int age);
}
public class ChildPolicy extends DiscountPolicy {
    private static final double DISCOUNT_PERCENT = 50.0 / 100;
    private static final int BASIC_RATE = 350;
    private static final int CHILD_MINIMUM_AGE = 6;
    private static final int CHILD_MAXIMUM_AGE = 13;


    public ChildPolicy(int age, ExtraFarePolicy... extraFarePolicies) {
        super(age, extraFarePolicies);
    }

    @Override
    protected int getDiscountAmount(int fare) {
        return (int) ((fare - BASIC_RATE) * DISCOUNT_PERCENT);
    }

    @Override
    protected boolean validateAge(int age) {
        return age >= CHILD_MINIMUM_AGE && age < CHILD_MAXIMUM_AGE;
    }

}

라이브러리의 적용과 정책적용이 미션 내용이었는데 정책적용은 조용호님의 오브젝트를 참고했다. 객체지향 설계라는 것이 쉽지 않은데 조금이나마 따라해본게 인상에 깊다. 이러한 객체지향 연습을 해보면 좋을 것같다.

조금 아쉬웠던 것

profile
노력하는 개발자입니다!

0개의 댓글