클린 코드 (3)

greenTea·2023년 9월 21일
0

조건문

1. guard 사용하기

중첩된 if문 (X)
if (check1()) {
	if (check2()) {
    	....
    }
}
guard를 이용한 if문 (O)
if (!check1()) {
	return;  <--- 필요
}

if (!check1()) {
    	
}
    ...

🤔기존 if 문의 반대 조건을 확인하게 하고 if문을 충족한다면 통과 그렇지 않다면 조기에 return하는 방법을 사용하면 보다 깔끔하게 코드를 작성 할 수 있습니다. (return을 하지 않는다면 아래 코드들이 사용 되므로 return을 해주셔야 합니다. for문 안이라면 break 또는 continue를 사용하시면 됩니다.)

긍정문 사용하기

부정 조건문

if (!name.status || name.length < 0) {

}

리팩토링 조건문

if (isEmptyName()) {

}

boolean isEmptyName() {
	return !name.status || name.length < 0
}

🫠기존에는 !, <등을 사용하여 해당 조건이 아닌 경우를 확인하게 하였는데 긍정문에 비해 부정문은 한눈에 파악하기 힘들다는 단점이 있습니다.
이를 isEmptyName()이라는 메소드로 추출하여 사용한다면 메소드의 이름만으로 이 함수가 name이 비어있는지를 체크하는 로직이라는 것을 알 수 있습니다.

에러를 사용하기

JavaScript를 기준으로 작성하였습니다.

  1. 사용자 정의 객체 사용
if (errorValue.code === 1) {
  console.log(errorValue.message);
}

😑사용자 정의 객체를 활용하면 다양한 에러 상황에 유연하게 대처할 수 있습니다. 개발자가 직접 에러 메시지나 에러 코드를 설정할 수 있기 때문에, 특정한 조건에 맞는 사용자 정의 로직을 적용하기 용이합니다.

단점: 하지만 위의 예시처럼, 에러를 판별하기 위한 추가적인 if문이 필요하게 됩니다. 이로 인해 코드가 복잡해질 수 있습니다.

  1. 직접 에러를 던지기
const errorValue = new Error("error!!!");
error.code = 1;
throw error;

😎Error 객체를 직접 생성하여 throw 키워드를 사용하면, 에러 처리 로직이 더 간결해집니다. 이 방법을 사용하면, 기존에 존재하는 에러 처리 방식을 이용하면서도 사용자 정의 정보(예: code)를 추가할 수 있습니다.

장점: 코드가 간결해지고, 표준 Error 객체를 활용하여 일관된 에러 처리가 가능합니다.

팩토리 메소드를 사용하자

🤓기존에는 사용자의 유형에 따라 로직을 분기하는 if-else if 문을 사용하고 있습니다. 이는 가독성도 떨어뜨리고 유지보수에도 어려움을 줍니다. 대안으로 팩토리 메소드 패턴을 사용하여 이 문제를 해결할 수 있습니다.

기존 코드
if (enter(user, "student")) {
  // 학생 로직
} else if (enter(user, "parent")) {
  // 부모 로직
} else if (enter(user, "teacher")) {
  // 교사 로직
}
팩토리 메소드
public class UserFactory {
  public static UserBehavior create(String type) {
    if ("student".equals(type)) {
      return new StudentBehavior();
    } else if ("parent".equals(type)) {
      return new ParentBehavior();
    } else if ("teacher".equals(type)) {
      return new TeacherBehavior();
    } else {
      throw new IllegalArgumentException("Invalid user type");
    }
  }
}
// 위 클래스 또한 더 좋게 리팩토링 할 수 있으나 여기서는 
// 이러한 컨셉이구나라고 생각하시면 될 것 같습니다.
수정 코드
UserFactory user = UserFactory.create(userType);
user.enter();

팩토리 메소드를 추가함으로써 if~else 로직을 지우고 본 코드에는 팩토리 클래스 하나만 남길 수 있게 되었습니다.

질문: 메소드가 늘어나면서 오히려 더 복잡성이 늘어나는 것 아닌가?

😭이에 대한 답변은 상황에 따라 다를 수 있습니다. 예를 들어, 시간이 부족한 상황에서 코드를 파악해야 할 경우, 수정 전 코드를 보면 if-else 구문 안에 있는 로직까지 전부 확인하면서 파악을 해야 했다면, 수정 후 코드에서는 로직을 신경 쓸 필요 없이 "user를 만드는 로직이구나"라고만 파악을 하면 되기에 더 빠르게 코드를 파악할 수 있습니다. 필요한 경우 해당 로직을 들어가서 확인하면 되기에 전보다 더 나은 코드라고 할 수 있습니다.

출처 및 참고자료

profile
greenTea입니다.

0개의 댓글