[TIL] 계산기 과제 피드백 + 반영?

한철희·2024년 3월 11일
0

TIL

목록 보기
8/57

계산기 과제를 lv.4까지 완성하고 제출한 뒤
금방 피드백을 받아볼 수 있었다.
튜터님이 작성해주신 피드백 내용을 정리해보면

좋은 점!
1. 코드 구성이 깔끔한 점.
2. README에 각 단계별 적용한 것들, 적용법들을 간략하게나마 적어둔 것
3. 의존성역전의 법칙을 잘 지킨 것(추상화관련)

보완할 점!
1. Calculator 클래스에서 divide함수의 반환값 Double?DivideOperationoperate반환값 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함수의 반환값도 바꿔줘야하기때문에 전부다 바꾸는건 뭔가 이상하다는 느낌이 들었다.
에러메시지를 출력하는 방법이 있긴하지만 아직 배운 부분이 아니라서 이 방식을 적용하고 싶지는 않았다.

이 부분은 추후에 튜터님께 여쭤보고 이 글에 업데이트 하는 방식으로 작성하겠다.

profile
초보 개발자 살아남기

0개의 댓글