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