[인프런 워밍업 클럽 2기 클린코드 & 테스트 코드] 1주차 발자국

[인프런 워밍업 클럽 2기 클린코드 & 테스트 코드] 1주차 발자국

해당 글은 [인프런 워밍업 클럽 2기 클린 코드 & 테스트 코드]에 참가하여 박우빈님<Readable Code: 읽기 좋은 코드를 작성하는 사고법> 강의를 듣고 작성한 글입니다.

이번주 강의 요약

  1. 추상

    1. 외부 세계는 추상화 레벨이 높고, 내부 세계는 추상화 레벨이 낮다.

    2. 추상화 레벨이 높다! -> 좀 더 포괄적임.

    3. 추상화 레벨이 낮다! -> 좀 더 구체적임.

    4. 추상화 레벨은 주변과 맞춰줘야 한다.

     

  2. 논리, 사고의 흐름

    1. else 대신 early return 을 쓰자! -> 이전 것들을 신경쓰지 않고 사고의 깊이를 줄일 수 있음.

    2. 부정어 대신 의미가 명확한 메소드를 쓰자!

     

  3. 객체 지향 패러다임

    1. 객체 지향이란 곧, 관심사를 분리하여 캡슐화를 잘하는 것.

    2. solid 규칙을 명시하자.

    3. 결합도를 낮추고 응집도를 높이기

     

🏃 미션

  1. Day2

일상생활에서 쉽게 찾을 수 있는 추상과 구체를 생각하려고 했다. '음식을 먹다' 라는 추상을 음식을 입에 넣는 과정, 씹는 과정, 삼키는 과정으로 구체화하여 적으려고 했다.

 

  1. Day4

먼저 해당 메서드의 요구사항이 무엇인지 파악하려고 했다. 이 주문 검증 메서드의 요구사항은 아래와 같았다.

  • 주문 항목이 0 이상이어야 한다.

  • 총 주문 금액이 0 이상이어야 한다.

  • 주문을 하는 사용자 정보가 있어야 한다.

기존 메서드는 2번째 요구사항과 3번째 요구사항이 합쳐서 구현되어 있었으므로 일단 각 요구사항을 기능별로 분리하였다. 그 다음, early return을 이용하여 불필요한 else 메서드를 지웠다.

 

public boolean validateOrder(Order order) {
        if (order.getItems().size() == 0) {
            log.info("주문 항목이 없습니다.");
            return false;
        }

        if (!order.hasCustomerInfo()) {
            log.info("사용자 정보가 없습니다.");
            return false;
        }

        if (!(order.getTotalPrice() > 0)) {
            log.info("올바르지 않은 총 가격입니다.");
            return false;

        }
        return true;
}

 

가독성을 위해 각 기능별로 메서드를 추출했다.

public boolean validateOrder(Order order) {
        if (hasItems(order)) return false;

        if (hasCustomerInfo(order)) return false;

        if (isTotalPriceInvalid(order)) return false;
        return true;
    }

private static boolean isTotalPriceInvalid(Order order) {
        if (!(order.getTotalPrice() > 0)) {
            log.info("올바르지 않은 총 가격입니다.");
            return true;
        }
        return false;
}

private static boolean hasCustomerInfo(Order order) {
        if (!order.hasCustomerInfo()) {
            log.info("사용자 정보가 없습니다.");
            return true;
        }
        return false;
}

private static boolean hasItems(Order order) {
        if (order.getItems().size() == 0) {
            log.info("주문 항목이 없습니다.");
            return true;
        }
        return false;
}

 

부정어를 지우고 각각의 기능을 만족했을 때만 true가 되도록 했다.

public boolean validateOrder(Order order) {
        return hasItems(order) && hasCustomerInfo(order) && isTotalPriceInvalid(order);
    }

private static boolean hasItems(Order order) {
        if (order.getItems().size() > 0) {
            return true;
        }
        log.info("주문 항목이 없습니다.");
        return false;
}

private static boolean isTotalPriceInvalid(Order order) {
        if (order.getTotalPrice() > 0) {
            return true;
        }
        log.info("올바르지 않은 총 가격입니다.");
        return false;
}

private static boolean hasCustomerInfo(Order order) {
        if (order.hasCustomerInfo()) {
            return true;
        }
        log.info("사용자 정보가 없습니다.");
        return false;
}

 

🗒️ 회고

  1. 현재 공채 시즌이라 진도를 빨리 나가지 못해서 아쉬웠다.

  2. 그래도 어찌저찌 미션도 제출하고 회고도 적어서 뿌듯했다.

  3. 첫 번째 미션은 쉬웠는데 두 번째 리팩토링 미션이 꽤 오래 걸렸다. 대신 좋은 코드, 읽기 쉬운 코드... 가독성이 좋은 코드에 대해 오랫동안 생각할 수 있어서 좋았다. 내 코드가 맞는 건지는 잘 모르겠지만ㅎㅎ.. 앞으로 강의를 들으면서 더 깊고 넓게 생각할 수 있는 능력을 기르고 싶다!

 

 

댓글을 작성해보세요.

채널톡 아이콘