계산기 과제를 lv.4까지 완성하고 제출한 뒤
금방 피드백을 받아볼 수 있었다.
튜터님이 작성해주신 피드백 내용을 정리해보면
좋은 점!
1. 코드 구성이 깔끔한 점.
2. README에 각 단계별 적용한 것들, 적용법들을 간략하게나마 적어둔 것
3. 의존성역전의 법칙을 잘 지킨 것(추상화관련)
보완할 점!
1.Calculator클래스에서divide함수의 반환값Double?과DivideOperation의operate반환값Double과 통일하기
2.protocol을 공부해볼 것
3. 나누기나 나머지 연산에서 분모나 분자가 0일때의 예외처리
이 정도로 피드백을 받았다.
코드를 함수명도 그렇고 좀 복잡하게 작성했다고 생각했는데 좋게 봐주신 건 기분이 좋았다
README부분도 앞으로 과제도 그렇지만 프로젝트를 하면서 차분히 작성해봐야겠다고 생각
추상화 관련해서도 잘 작성한거같아서 마음이 놓였다
기분이 좋은건 잠깐 누리고
그럼 이제 보완할 부분에 대해서 생각을 해보자
우선 2번 protocol을 사용해서 추상화 부분을 먼저 작성해주자.
protocol은 함수의 몸체 그러니까 {}안을 작성하지 않고 함수를 정의해준다
그리고 실제 다른 클래스에서 사용될 때 필요한 부분을 작성하여 사용한다.
protocol AbstractOperation {
func operate(firstNumber: Double, secondNumber: Double) -> Double
}
class AddOperation: AbstractOperation {
func operate(firstNumber: Double, secondNumber: Double) -> Double {
return firstNumber + secondNumber
}
}
class SubtractOperation: AbstractOperation {
func operate(firstNumber: Double, secondNumber: Double) -> Double {
return Double(firstNumber - secondNumber)
}
}
class MultiplyOperation: AbstractOperation {
func operate(firstNumber: Double, secondNumber: Double) -> Double {
return Double(firstNumber * secondNumber)
}
}
class DivideOperation: AbstractOperation {
func operate(firstNumber: Double, secondNumber: Double) -> Double {
return firstNumber / secondNumber
}
}
class RemainderOperation: AbstractOperation {
func operate(firstNumber: Double, secondNumber: Double) -> Double {
return firstNumber.truncatingRemainder(dividingBy: secondNumber)
}
}
위가 protocol을 사용해서 다시 작성한 추상화 부분이다.
그리고 2번 항목 반환값은 Double로 통일하기로 했다
거기에 추가로 분모나 분자가 0일때는 특정 메시지를 출력하여
입력값이 올바르게 들어간 것인지 확인해볼 수 있도록 했다
흠 근데 예외처리를 위해 nil을 사용하다보니 또 Double?혼용해서 사용하게 된다.
일단 작성한 코드는 다음과 같다. 필요한 부분만 올리겠다
//Calculator 클래스 내부
func divide(firstNumber: Double, secondNumber: Double) -> Double? {
guard secondNumber != 0 else {
print("분모나 분자에 0이 있습니다.")
return nil
}
return divideOp.operate(firstNumber: firstNumber, secondNumber: secondNumber)
}
// 연산 클래스
class DivideOperation: AbstractOperation {
func operate(firstNumber: Double, secondNumber: Double) -> Double {
return firstNumber / secondNumber
}
}
// 함수 호출 부분
if let divideResult = calculator.divide(firstNumber: 10, secondNumber: 0) {
print("divideResult : \(divideResult)")
} else {
print("나눗셈 오류 발생")
}
단순히 -1을 반환하는 방식으로 하면 간단하게 끝난다. 실제로 코드도 작성해봤고
하지만 이것보다는 좀 더 명확한 방식으로 해주고 싶어서 시도했다.
divde함수에서 예외처리를 했는데 이 방식으로 하니 nil때문에 필연적으로 옵셔널을 사용하게 된다.
근데 연산클래스의 반환값에 Double?해주려면 protocol에서 쓰인 operate함수의 반환값도 바꿔줘야하기때문에 전부다 바꾸는건 뭔가 이상하다는 느낌이 들었다.
에러메시지를 출력하는 방법이 있긴하지만 아직 배운 부분이 아니라서 이 방식을 적용하고 싶지는 않았다.
이 부분은 추후에 튜터님께 여쭤보고 이 글에 업데이트 하는 방식으로 작성하겠다.