class AddOperation {
func add(_ a: Double, _ b: Double) -> Double {
return a + b
}
}
class SubstractOperation {
func substract(_ a: Double, _ b: Double) -> Double {
return a - b
}
}
class MultiplyOperation {
func multiply(_ a: Double, _ b: Double) -> Double {
return a * b
}
}
class DivideOperation {
func divide(_ a: Double, _ b: Double) -> Double {
return a / b
}
}
class RemainderOperation {
func remainder(_ a: Double, _ b: Double) -> Double {
guard b != 0 else {
return .infinity
}
return a.truncatingRemainder(dividingBy: b)
}
}
class Calculator {
func calculate(operator op: String, firstNumber: Double, secondNumber: Double) -> Double {
switch op {
case "+":
return AddOperation().add(firstNumber, secondNumber)
case "-":
return SubstractOperation().substract(firstNumber, secondNumber)
case "*":
return MultiplyOperation().multiply(firstNumber, secondNumber)
case "/":
return DivideOperation().divide(firstNumber, secondNumber)
case "%":
return RemainderOperation().remainder(firstNumber, secondNumber)
default:
return 0
}
}
}
슈퍼클래스를 통한 추상화?
프로토콜을 통한 추상화?
protocol AbstractOperation {
func calculate(_ a: Double, _ b: Double) -> Double
}
class AddOperation: AbstractOperation {
func calculate(_ a: Double, _ b: Double) -> Double {
return a + b
}
}
class SubstractOperation: AbstractOperation {
func calculate(_ a: Double, _ b: Double) -> Double {
return a - b
}
}
class MultiplyOperation: AbstractOperation {
func calculate(_ a: Double, _ b: Double) -> Double {
return a * b
}
}
class DivideOperation: AbstractOperation {
func calculate(_ a: Double, _ b: Double) -> Double {
return a / b
}
}
class RemainderOperation: AbstractOperation {
func calculate(_ a: Double, _ b: Double) -> Double {
guard b != 0 else {
return .infinity
}
return a.truncatingRemainder(dividingBy: b)
}
}
class Calculator {
func calculate(operation op: AbstractOperation, firstNumber: Double, secondNumber: Double) -> Double {
op.calculate(firstNumber, secondNumber)
}
}