[인프런 워밍업 클럽 2기 클린코드 & 테스트 코드] 1주차 발자국
해당 글은 [인프런 워밍업 클럽 2기 클린 코드 & 테스트 코드]에 참가하여 박우빈님의 <Readable Code: 읽기 좋은 코드를 작성하는 사고법> 강의를 듣고 작성한 글입니다.
✍ 이번주 강의 요약
추상
외부 세계는 추상화 레벨이 높고, 내부 세계는 추상화 레벨이 낮다.
추상화 레벨이 높다! -> 좀 더 포괄적임.
추상화 레벨이 낮다! -> 좀 더 구체적임.
추상화 레벨은 주변과 맞춰줘야 한다.
논리, 사고의 흐름
else 대신 early return 을 쓰자! -> 이전 것들을 신경쓰지 않고 사고의 깊이를 줄일 수 있음.
부정어 대신 의미가 명확한 메소드를 쓰자!
객체 지향 패러다임
객체 지향이란 곧, 관심사를 분리하여 캡슐화를 잘하는 것.
solid 규칙을 명시하자.
결합도를 낮추고 응집도를 높이기
🏃 미션
Day2
일상생활에서 쉽게 찾을 수 있는 추상과 구체를 생각하려고 했다. '음식을 먹다' 라는 추상을 음식을 입에 넣는 과정, 씹는 과정, 삼키는 과정으로 구체화하여 적으려고 했다.
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;
}
🗒️ 회고
현재 공채 시즌이라 진도를 빨리 나가지 못해서 아쉬웠다.
그래도 어찌저찌 미션도 제출하고 회고도 적어서 뿌듯했다.
첫 번째 미션은 쉬웠는데 두 번째 리팩토링 미션이 꽤 오래 걸렸다. 대신 좋은 코드, 읽기 쉬운 코드... 가독성이 좋은 코드에 대해 오랫동안 생각할 수 있어서 좋았다. 내 코드가 맞는 건지는 잘 모르겠지만ㅎㅎ.. 앞으로 강의를 들으면서 더 깊고 넓게 생각할 수 있는 능력을 기르고 싶다!
댓글을 작성해보세요.