# 계산기2 [STEP2] kaki, kokkilE
###### tags: `PR`
@Groot-94 안녕하세요 그루트!😃 계산기2 STEP2 PR 드립니다!
STEP1을 진행하면서 리팩토링도 병행한 부분이 있어서 이번 스텝에서는 수정 사항이 많지 않네요. :cry:
이번 리뷰도 잘 부탁드립니다! :clap:
## 수정 사항
### 컨벤션
- 코드를 병합하며 어색해진 메서드명과 상수, 변수명을 수정해주었습니다.
### 버그 수정
- 코드 병합 과정에서 다음과 같이 연산 결과를 받은 후 숫자를 입력할 경우 연산 결과에 이어서 입력이 되는 문제가 있었습니다.
<img src="https://i.imgur.com/eLSeinJ.gif" width=200>
- Bool 타입인 `isCalculated` 변수를 추가해주어 계산 직후 숫자를 입력할 경우 새로 숫자를 입력받을 수 있게 로직을 수정해주었습니다.
### 테스트 수정
- ExpressionParserTests에서 특정 수식만 테스트하던 케이스를 지우고 Formula의 operands, operaters에 정상적인 순서로 값이 들어가있는지 확인하는 방식으로 테스트 케이스를 작성하였습니다.
## 조언을 받고 싶은 부분 :book:
STEP1에서 여쭤봐야 했던 질문인데, PR 작성 시에 깜빡했어서 이번 PR에서 여쭤보게 되었습니다.
팀원의 코드를 병합하는 과정에서 ViewController가 서로 다른 구조로 되어있어 어떤 구조를 채택할지 고민을 했습니다.
`한 개의 IBAction 메서드로 모든 버튼을 처리하는 구조`와 `버튼의 타입별로 IBAction 메서드를 구현하여 처리하는 구조` 중 후자를 선택했는데, 선택한 이유에는 두 가지가 있었습니다.
- 각각의 액션 함수에서 어떤 동작을 수행하는지 추적하지 않고 한눈에 파악하기 수월하기 때문에 구체적인 기능을 파악하는 측면의 가독성이 더 좋다.
- 버튼 클릭시마다 switch 문으로 조건 검사를 수행하지 않기 때문에 성능상으로도 더 좋다.
그러나 한눈에 전체적인 코드의 구조를 파악하는 가독성 측면에서는 `한 개의 IBAction 메서드로 모든 버튼을 처리하는 구조`가 더 낫지 않나 하는 생각이 듭니다.
성능적인 측면에서는 `버튼의 타입별로 IBAction 메서드를 구현하여 처리하는 구조`가 더 나은 구조라는게 확실하다고 생각하는데, 가독성 측면에서 그루트의 생각은 어떠신지 의견을 여쭙고 싶습니다.
### 한 개의 IBAction 메서드로 모든 버튼을 처리하는 구조
``` swift
@IBAction private func touchUpCalculatorButton(sender: UIButton) {
guard let inputFromButton = sender.titleLabel?.text else {
return
}
processInput(from: inputFromButton)
}
private func processInput(from inputFromButton: String) {
switch inputFromButton {
case ButtonValue.AC:
allClear()
case ButtonValue.CE:
clearEntry()
case ButtonValue.SC:
signChanger()
case ButtonValue.add, ButtonValue.subtract, ButtonValue.divide, ButtonValue.multiply:
processOperatorInput(inputFromButton)
case ButtonValue.equal:
processEqualSignInput()
isOperateComplited = true
case ButtonValue.dot:
processDotInput(inputFromButton)
default:
if isOperateComplited {
operandUILabel.text = DefaultValue.zero
isOperateComplited = false
}
processNumberInput(inputFromButton)
}
}
```
### 버튼의 타입별로 IBAction 메서드를 구현하여 처리하는 구조
``` swift
@IBAction private func numberButtonTapped(_ sender: UIButton) { ... }
@IBAction private func operatorButtonTapped(_ sender: UIButton) { ... }
...
```