워밍업 클럽 3기 BE 클린코드&테스트 - 1주차 발자국

강의 요약

추상

  • 클린 코드를 추구해야 하는 이유는 읽기 좋은 코드를 만들기 위해서다.

  • 적절한 추상화는 도메인 문맥 안에서 가장 중요한 정보만 남기는 것이다.

     

논리, 사고의 흐름

  • Early return 으로 else의 사용 지양

  • 중첩 분기문, 중첩 반복문 줄이기

  • 부정 연산자(!)는 대체하는 단어나 부정어구의 메서드로 바꾼다.

     

객체 지향 패러다임

  • 객체를 통해서 외부 세계와 내부 세계를 분리한다.

  • 두 세계는 메세지(공개 메서드)를 통해서만 통신한다.

  • 즉 객체는 높은 응집도와 낮은 결합도를 유지해야한다.

  • SOLID 원칙을 준수하여 객체를 설계해야한다.

     

객체 지향 적용하기

  • 객체를 확장할때 상속 보다는 조합을 고려하자.

  • 서로 연관 있는 값들은 VO로 추상화하자.

  • 컬랙션에 대해 연산이 필요하다면 객체로 포장하는 것을 고려하자.

  • 관련된 상수는 Enum형태로 모아서 관리하자.

  • 반복되는 로직은 인터페이스로 추상화를 고려하자.

  • 도메인 지식은 만드는 것이 아니라 발견하는 것


Misson

2일차 미션 - 추상과 구체의 예시

[추상] 손을 씻는다

[구체]
 1. 수도꼭지를 틀고 적당한 온도의 물을 준비한다.
 2. 적당량의 비누를 덜어 손에 묻힌 후, 양손의 손바닥을 맞대고 문지른다.
 3. 물로 손에 묻은 비누 거품을 헹궈 낸다.
 4. 손에 묻은 물기를 마른 수건으로 닦는다.
  • "손을 씻는 과정을 일상(도메인)에서 어떻게 하는지 구체적으로 나열해보았다.

  • "구체"는 "추상"의 생략된 내용들 포함하고 있지만, 같은 도메인 안에서는 의미를 이해하는데 불필요한 정보들이 너무 많이 포함되어 있다는것을 깨달았다.

4일차 미션 - "논리, 사고의 흐름"을 고려한 리팩토링

기존코드

public boolean validateOrder(Order order) {
    if (order.getItems().size() == 0) {
        log.info("주문 항목이 없습니다.");
        return false;
    } else {
        if (order.getTotalPrice() > 0) {
            if (!order.hasCustomerInfo()) {
                log.info("사용자 정보가 없습니다.");
                return false;
            } else {
                return true;
            }
        } else if (!(order.getTotalPrice() > 0)) {
            log.info("올바르지 않은 총 가격입니다.");
            return false;
        }
    }
    return true;
}

리팩토링 결과

public void validateOrder(Order order) {
    if (order.hasNoItems()) {
        throw new OrderException("주문 항목이 없습니다.");
    }

    if (order.isInvalidTotalPrice()) {
        throw new OrderException("올바르지 않은 총 가격입니다.");
    }

    if (order.hasNotCustomerInfo()) {
        throw new OrderException("사용자 정보가 없습니다.");
    }
}
  • 중첩 분기문을 없애, 사고의 depth를 줄였다.

  • validateOrder가 Order의 값을 직접 꺼내 계산하는 것이 아니라, Order 에게 메세지를 던져 직접 계산하도록 변경했다.

  • log 메세지와 false 를 exception으로 대체하여, 검증이 실패했다는 의미를 분명하게 표현하였다.

    • 해당 메서드를 호출하는 클라이언트 부분에서는 비지니스 로직과 오류 처리 로직을 분리 할 수 있다.(관심사 분리)

       


회고

칭찬할 점

  • 강의의 이론 내용을 듣고, 먼저 내 방식대로 리팩토링을 한 후, 강사님의 코드와 비교하며 강의를 들었다.

아쉬운점

  • 강의를 몰아서 듣다 보니, 제때 복습을 하지 못했다.

     

    보완할점

  • 다음주는 계획을 세워 강의를 듣고, 매 강의 마다 충분히 고민할 시간을 가져야겠다.


아래의 강의를 공부하고 정리하였습니다.

[Readable Code: 읽기 좋은 코드를 작성하는 사고법]

댓글을 작성해보세요.

채널톡 아이콘