워밍업 클럽 2기 BE 클린코드&테스트 1주차 발자국
프로그램의 정의
프로그램 = 데이터 + 코드
추상과 구체
추상 : 중요한 정보는 가려내어 남기고, 덜 중요한 정보는 생략하여 버린다.
메서드와 추상화
잘 쓰여진 코드라면, 한 메서드의 주제는 반드시 하나다.
메서드 선언부
반환타입 메서드명 ( 파라미터 ) { 메서드 구현부 }
void 대신 충분히 반환할 만한 값이 있는지 고민해보기 -> 반환값이 있다면 테스트도 용이해 진다.
인텔리제이 메서드 뽑아내는 단축키 : 코드 드래그 후 옵션 + 커맨드 + m -> 메서드로 만들어 준다
추상화 레벨
R r = method( ) ;
메서드를 추출하는 것 자체가 외부 세계와 내부 세계로 나뉜다. (경계가 나뉨)
하나의 세계 안에서는, 추상화 레벨이 동등해야 한다.
매직 넘버, 매직 스트링
의미를 갖고 있으나, 상수로 추출되지 않은 숫자, 문자열 등
상수 추출로 이름을 짓고 의미를 부여함으로써 가독성, 유지보수성 증가
public static final int BOARD_ROW_SIZE = 8;
public static final int BOARD_COL_SIZE = 10;
private static final String[][] BOARD = new String[BOARD_ROW_SIZE][BOARD_COL_SIZE];
private static final Integer[][] NEARBY_LAND_MINE_COUNTS = new Integer[BOARD_ROW_SIZE][BOARD_COL_SIZE];
private static final boolean[][] LAND_MINES = new boolean[BOARD_ROW_SIZE][BOARD_COL_SIZE];
public static final int LAND_MINE_COUNT = 10;
public static final String FLAG_SIGN = "⚑";
public static final String LAND_MINE_SIGN = "☼";
public static final String CLOSED_CELL_SIGN = "□";
public static final String OPENED_CELL_SIGN = "■";
인텔리제이 상수 뽑아내는 단축키 : 옵션 + 커맨드 + c
Early return
else의 사용을 지양 : if , else-if , else 를 같이 쓰지 않고 if - return 으로 바꾸면 앞의 정보를 신경 쓰지 않아도 된다.
사고의 depth 줄이기
무조건 1 depth로 만드는게 아니다
-> 추상화를 통한 사고 과정의 depth를 줄이는 것이 중요
-> 2중 중첩 구조로 표현하는 것이 가독성이 좋을 수도 있다.
메서드 분리
부정어를 대하는 자세
메소드명 자체에 부정어를 적기
되도록 2번 생각 해야하는 부정연산자를 사용하지 않는다.
해피 케이스와 예외 처리
사용자 입력, 객체 생성자, 외부 서버의 요청 주의
의도한 예외와 예상하지 못한 예외를 구분하기
Null을 대하는 자세
항상 NullPointException 경계
Optional 사용 자제
미션2
// asis
// 사용자가 생성한 주문이 유효한지를 검증하는 메서드
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;
}
/** 위 코드를 Readable Code로 리팩토링 한다면
* 1. early return을 사용해서 필요없는 else문 삭제하기
* 2. 최대한 getter 사용 지양하기
강제로 객체의 값을 가져오지 않고 객체에게 질문하기
*/
// tobe
public boolean validateOrder(Order order) {
if (order.hasNoItems()) {
log.info("주문 항목이 없습니다.");
return false;
}
if (order.isInvalidTotalPrice()){
log.info("올바르지 않은 총 가격입니다.");
return false;
}
if (order.hasNoCustomerInfo()){
log.info("사용자 정보가 없습니다.");
return false;
}
return true;
}
출처:
인프런 워밍업 클럽 2기(백엔드 클린코드, 테스트코드) - https://www.inflearn.com/course/offline/warmup-club-2-be-wb
강의 출처 - https://www.inflearn.com/course/readable-code-%EC%9D%BD%EA%B8%B0%EC%A2%8B%EC%9D%80%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1%EC%82%AC%EA%B3%A0%EB%B2%95