계산기 과제를 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
함수의 반환값도 바꿔줘야하기때문에 전부다 바꾸는건 뭔가 이상하다는 느낌이 들었다.
에러메시지를 출력하는 방법이 있긴하지만 아직 배운 부분이 아니라서 이 방식을 적용하고 싶지는 않았다.
이 부분은 추후에 튜터님께 여쭤보고 이 글에 업데이트 하는 방식으로 작성하겠다.