---
# System prepended metadata

title: '계산기2 [STEP2] kaki, kokkilE'
tags: [PR]

---

# 계산기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) { ... }
...
```