Mar 19, 2021, TIL (Today I Learned)

Inwoo Hwang·2021년 8월 26일
0
post-thumbnail

학습 내용

고민한점/ 배운 점/ 해결법

함수를 적절히 분할하여 역할에 맞게 분배하기!

기존 방법:

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: "재료가 모자라요. 재고를 수정할까요?")
        }
    }
  • 아직 함수 속 함수를 활용하는 것이 익숙치 않지만 이렇게 bool을 리턴 해 주는 함수를 활용하면 코드의 로직을 더 탄탄하게 짤 수 있다는 부분이 내게는 유레카였다.
  • 또한 기존에는 에러처리를 너무 많이 해준 것 같아서 적절하게 에러처리를 줄여주고 주스만드는 함수에서 에러처리를 받게 설정 한 뒤 viewcontroller에서 해당 에러처리를 do-catch문으로 받게 만들도록 설계를 수정하여서 상황별로 다른 알림 메세지를 보여주도록 할 수 있었다.

다음 프로젝트에서도 배운 내용을 유용하게 써먹어야겠다 :)

profile
james, the enthusiastic developer

0개의 댓글