함수를 적절히 분할하여 역할에 맞게 분배하기!
기존 방법:
func manageFruit(juice: Juice) throws {
for (fruit, requirements) in juice.recipe {
guard let stock = refrigerator[fruit] else {
throw JuiceMakerError.invalidAccess
}
if stock >= requirements {
refrigerator.updateValue(stock - requirements, forKey: fruit)
}
else {
throw JuiceMakerError.outOfStock
}
}
.
.
.
func makeJuice(order: Juice) -> Juice {
do {
try FruitStorage.shared.manageFruit(juice: order)
} catch {
}
return order
}
FruitStorage의 managefruit() 메서드가 모든 작업을 다 하기에 해당 메서드의 어깨가 너무 무겁다. 또한 model에서 에러처리를 하고 받아 주었기 때문에 Viewcontroller에서 어떻게 재고별로 다른 알림창을 띄울 수 있을지 고민하였다.
그렇기에 해당 메서드의 어깨를 가볍게 하면서 책임을 분할 해 주는 방법을 배운 뒤 활용 해 보았다.
class FruitStorage {
func manageFruit(fruit: Fruit, quantity: Int) {
guard let stock = refrigerator[fruit] else {
return
}
refrigerator.updateValue(stock + quantity, forKey: fruit)
}
func hasEnoughFruit(fruit: Fruit, requiredQuantity: Int) -> Bool {
guard let stock = refrigerator[fruit],requiredQuantity > 0, stock - requiredQuantity >= 0 else {
return false
}
return true
}
}
class JuiceMaker {
private func grindFruit(fruit: Fruit, amount: Int) {
FruitStorage.shared.manageFruit(fruit: fruit, quantity: -amount)
}
func makeJuice(order: Juice) throws {
for (ingredients, requirements) in order.recipe {
if FruitStorage.shared.hasEnoughFruit(fruit: ingredients, requiredQuantity: requirements) {
grindFruit(fruit: ingredients, amount: requirements)
}
else {
throw JuiceMakerError.outOfStock
}
}
}
}
@IBAction func touchUpMakeStrawberryJuiceButton(_ sender: UIButton) {
do {
try juiceMaker.makeJuice(order: Juice.strawberryJuice)
guard let stockOfStrawberry = FruitStorage.shared.refrigerator[.strawberry] else {
throw JuiceMakerError.invalidAccess
}
strawberryStockLable.text = String(stockOfStrawberry)
juiceIsReadyAlert(message: "\(Juice.strawberryJuice.description) 나왔습니다. 맛있게 드세요")
} catch {
notEnoughFruitAlert(message: "재료가 모자라요. 재고를 수정할까요?")
}
}
do-catch
문으로 받게 만들도록 설계를 수정하여서 상황별로 다른 알림 메세지를 보여주도록 할 수 있었다.다음 프로젝트에서도 배운 내용을 유용하게 써먹어야겠다 :)