본문 바로가기

TDD, CleanCode

Clean Code - 우아한 테크 코스 코드 시험 리뷰(2) 기능 추가 편

사실 시험장에서 친 코드도 기능을 완성하려고 했는데, 애초에 설계부터 잘못되서 3시간만에 포기했다.

 

Clean Code를 읽고 난 후에 리팩토링한 코드는 아주 간단하게 구현되었다.

 

특히 객체를 여기저기서 꺼내지 않아서 어렵지 않았다.

 

1. 예약 반복

 

예약한 영화들을 담을 List를 생성하고 거기에 담을 함수들을 생성했다. type을 입력받아 계속 예약할지 결제 할지 결정하였다.

    public static void main(String[] args) {
        List<Movie> movies = MovieRepository.getMovies();
        OutputView.printMovies(movies);
        ReservedMovieBundle reservedMovieBundle = loopReserve();
        Payment payment = loopPayment(reservedMovieBundle);
        System.out.println("총 금액" + payment.getTotalPrice());
    }
    private static ReservedMovieBundle loopReserve(){
        int type = PAYMENT_GOTO_INITIAL_NUMBER;
        ReservedMovieBundle reservedMovieBundle = new ReservedMovieBundle();
        while(determineGoTo(type)) {
            addReserve(reservedMovieBundle);
            type = InputView.inputdetermineLoopContinue();
        }
        System.out.println("영화 선택이 모두 완료 되었습니다.");
        return reservedMovieBundle;
    }

    private static boolean determineGoTo(int type){
        return type != PAYMENT_GOTO_NUMBER;
    }

    private static ReservedMovieBundle addReserve(ReservedMovieBundle reservedMovieBundle){
        ReservedMovie reservedMovie = new ReserveSystem().reserve();
        reservedMovieBundle.addReservedMovies(reservedMovie);
        return reservedMovieBundle;
    }

    private static Payment loopPayment(ReservedMovieBundle reservedMovieBundle){
        Payment payment = new Payment();
        for(int i =0; i<reservedMovieBundle.getReservedMoviesSize(); i++){
            payment.payment(reservedMovieBundle.getReservedMovie(i),new User());
        }
        return payment;
    }

다만 main 함수를 담은 클래스에 함수를 생성하는 것이 옳은지 잘 모르겠다.

 

또한 ReservedMovieBundle이 계속 함수의 인자로 사용되는데, 클래스 변수로 바꾸는 것이 더 나은가? 클래스 변수는 도대체 어떨때 써야 하지...?

public class MovieApplication {

    private static final int PAYMENT_GOTO_NUMBER = 0;
    private static final int PAYMENT_GOTO_INITIAL_NUMBER = 1;
    private static ReservedMovieBundle reservedMovieBundle = new ReservedMovieBundle();

    public static void main(String[] args) {
        List<Movie> movies = MovieRepository.getMovies();
        OutputView.printMovies(movies);
        ReservedMovieBundle reservedMovieBundle = loopReserve();
        Payment payment = loopPayment(reservedMovieBundle);
        System.out.println("총 금액" + payment.getTotalPrice());
    }
    private static ReservedMovieBundle loopReserve(){
        int type = PAYMENT_GOTO_INITIAL_NUMBER;
        while(determineGoTo(type)) {
            addReserve();
            type = InputView.inputdetermineLoopContinue();
        }
        System.out.println("영화 선택이 모두 완료 되었습니다.");
        return reservedMovieBundle;
    }

    private static boolean determineGoTo(int type){
        return type != PAYMENT_GOTO_NUMBER;
    }

    private static void addReserve(){
        ReservedMovie reservedMovie = new ReserveSystem().reserve();
        reservedMovieBundle.addReservedMovies(reservedMovie);
    }

    private static Payment loopPayment(ReservedMovieBundle reservedMovieBundle){
        Payment payment = new Payment();
        for(int i =0; i<reservedMovieBundle.getReservedMoviesSize(); i++){
            payment.payment(reservedMovieBundle.getReservedMovie(i),new User());
        }
        return payment;
    }
}

이렇게 하니 함수 자체는 깔끔해 졌지만, addReserve() 같은 경우는 어떻게 어디로 추가한다는지 의미 전달이 안되는 것 같기도 하다.

 

여튼 생각보다 빨리 작성 됬고... 다음 포스팅에서 과연 이렇게 작성한 코드가 얼마나 테스트 코드로 작성될 수 있을지 알아보자