if문이 너무 많은 코드
public class Client {
public int someMethod(CalculateCommand calculateCommand) {
CalculateType calculateType = calculateCommand.getCalculateType();
int num1 = calculateCommand.getNum1();
int num2 = calculateCommand.getNum2();
int result = 0;
// if 문이 많아서 복잡하다.
if ( calculateType != null && calculateType.equals(CalculateType.ADD)) {
result = num1 + num2;
}
else if ( calculateType != null && calculateType.equals(CalculateType.MINUS)) {
result = num1 - num2;
}
else if ( calculateType != null && calculateType.equals(CalculateType.MULTIPLY)) {
result = num1 * num2;
}
else if ( calculateType != null && calculateType.equals(CalculateType.DIVIDE)) {
if (num2 == 0 ) {
throw new RuntimeException("num2 cannot be 0");
}
else {
result = num1 / num2;
}
}
return result;
}
}
빠르게 반환하기 - Early return
객체에 대한 null 체크를 미리 함으로써 if문의 조건을 줄일 수 있습니다.
public class ClientEarlyReturn {
public int someMethod(CalculateCommand calculateCommand) {
CalculateType calculateType = calculateCommand.getCalculateType();
int num1 = calculateCommand.getNum1();
int num2 = calculateCommand.getNum2();
int result = 0;
if ( calculateType == null ) {
return result;
}
if ( calculateType.equals(CalculateType.DIVIDE) && num2 == 0 ) {
throw new RuntimeException("num2 cannot be 0");
}
// 널체크와 예외처리를 빼고 나머지는 모두 같은 로직이다. 하지만 복잡하다.
if ( calculateType.equals(CalculateType.ADD)) {
result = num1 + num2;
}
else if ( calculateType.equals(CalculateType.MINUS)) {
result = num1 - num2;
}
else if ( calculateType.equals(CalculateType.MULTIPLY)) {
result = num1 * num2;
}
else if ( calculateType.equals(CalculateType.DIVIDE)) {
result = num1 / num2;
}
return result;
}
}
코드 개선 및 생성 시점에 유효성 검사
아래 코드는 위 if문이 많은 코드 보다 가독성이 좋아 졌습니다. 천천히 살펴 보시죠
public class AdvanceClient {
public int someMethod(AdvanceCalculateCommand calculateCommand) {
AdvanceCalculateType calculateType = calculateCommand.getCalculateType();
int num1 = calculateCommand.getNum1();
int num2 = calculateCommand.getNum2();
// 릭팩토링 결과 변경 없이 코드의 구조를 재조정 하는 것 가독성을 높이거나 유지보수를 편하게 함.
int result = calculateType.calculate(num1, num2);
return result;
}
}
null 체크와 필요한 유효성 검사는 생성 시점에 하도록 합니다.
public class AdvanceCalculateCommand {
private AdvanceCalculateType calculateType;
private int num1;
private int num2;
public AdvanceCalculateCommand(AdvanceCalculateType calculateType, int num1, int num2) {
if ( calculateType == null ) {
throw new IllegalArgumentException("calculateType is null");
}
if ( calculateType.equals(AdvanceCalculateType.DIVIDE) && num2 == 0 ) {
throw new IllegalArgumentException("num2 cannot be 0");
}
this.calculateType = calculateType;
this.num1 = num1;
this.num2 = num2;
}
public AdvanceCalculateType getCalculateType() {
return calculateType;
}
public int getNum1() {
return num1;
}
public int getNum2() {
return num2;
}
}
enum 으로 각 타입을 계산 합니다.
public enum AdvanceCalculateType {
ADD (Integer::sum),
MINUS ((num1, num2) -> num1 - num2),
MULTIPLY ((num1, num2) -> num1 * num2),
DIVIDE ((num1, num2) -> num1 / num2);
AdvanceCalculateType(BiFunction<Integer, Integer, Integer> expression) {
this.expression = expression;
}
private final BiFunction<Integer, Integer, Integer> expression;
public int calculate(int num1, int num2) {
return this.expression.apply(num1, num2);
}
}
'자바' 카테고리의 다른 글
SOLID (0) | 2023.12.12 |
---|---|
의존성 ( dependency ) (0) | 2023.12.12 |
Java Optional (0) | 2023.12.12 |
Object Class (1) | 2023.12.11 |
예외 (0) | 2023.12.11 |