Search
Duplicate

1. [클린 코드 with Java] 1단계 - 문자열 계산기

링크
점수
⭐️⭐️⭐️⭐️
완료일
2023/04/25
상태
완료
유형
인강

문자열 사칙 연산 계산기 구현

기능 요구사항

사용자가 입력한 문자열 값에 따라 사칙연산을 수행할 수 있는 계산기를 구현해야 한다.
입력 문자열의 숫자와 사칙 연산 사이에는 반드시 빈 공백 문자열이 있다고 가정한다.
나눗셈의 경우 결과 값을 정수로 떨어지는 값으로 한정한다.
문자열 계산기는 사칙연산의 계산 우선순위가 아닌 입력 값에 따라 계산 순서가 결정된다. 즉, 수학에서는 곱셈, 나눗셈이 덧셈, 뺄셈 보다 먼저 계산해야 하지만 이를 무시한다.
예를 들어 2 + 3 * 4 / 2와 같은 문자열을 입력할 경우 2 + 3 * 4 / 2 실행 결과인 10을 출력해야 한다.

프로그래밍 요구사항

indent(들여쓰기) depth를 2단계에서 1단계로 줄여라.
depth의 경우 if문을 사용하는 경우 1단계의 depth가 증가한다. if문 안에 while문을 사용한다면 depth가 2단계가 된다.
메소드의 크기가 최대 10라인을 넘지 않도록 구현한다.
method가 한 가지 일만 하도록 최대한 작게 만들어라.
else를 사용하지 마라.

피드백

리뷰어 : 전반적인 방향성은 나쁘지 않지만, 요구사항을 충족하지 못하는 부분이 있어 이 부분 개선이 필요해 보입니다. 개선 부탁드립니다.
else 사용하지 않는 것이 요구사항 중 하나였던 것으로 알고 있습니다.이 부분 요구사항을 충족하려면 어떻게 설계해야 할까요?
연산자 하나하나에 대한 추상화, 그리고 추상화된 연산자를 탐색하는 로직이 구현된 클래스 혹은 메소드 하나가 필요할 것 같습니다. 고민해주시면 감사하겠습니다.
생각정리 : 기능에 집중하다 보니 if else 조건을 놓쳐버렸다.
public String calculator(String leftNumber, String rightNumber) { Number left = Number.from(leftNumber); Number right = Number.from(rightNumber); OperationEnum operationEnum = null; if ("+".equals(operation)) { operationEnum = OperationEnum.ADD; } else if ("-".equals(operation)) { operationEnum = OperationEnum.MINUS; } else if ("*".equals(operation)) { operationEnum = OperationEnum.MULTIPLY; } else if ("/".equals(operation)) { operationEnum = OperationEnum.DIVIDE; } return String.valueOf(operationEnum.calculator(left.getNumber(), right.getNumber())); }
JavaScript
복사
다음과 같이 변경
public enum OperationEnum { ADD("+", (number1, number2) -> number1 + number2), MINUS("-", (number1, number2) -> number1 - number2), MULTIPLY("*", (number1, number2) -> number1 * number2), DIVIDE("/", (number1, number2) -> number1 / number2); private final String operation; private final IntBinaryOperator expression; OperationEnum(String operation, IntBinaryOperator expression) { this.operation = operation; this.expression = expression; } public int calculator(int number1, int number2) { return getExpression().applyAsInt(number1, number2); } public static OperationEnum from(String operation) { return Arrays.stream(values()) .filter(value -> operation.equals(value.operation)) .findFirst() .orElseThrow(() -> new IllegalArgumentException("잘못된 값 입력")); } public IntBinaryOperator getExpression() { return expression; } }
JavaScript
복사
완료된 소스코드 링크 :
2943
pull
출처