Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

쥬스 메이커 [STEP 2] Diana, Gama #363

Open
wants to merge 2 commits into
base: ic_11_diana
Choose a base branch
from

Conversation

forseaest
Copy link

안녕하세요~ @mint3382!
쥬스 메이커 STEP 2 PR 합니다! 🙏

💻 코드 설명

  • JuiceMaker.swift
    • 조언해주신 import UIKit를 삭제했습니다. (사실 step1 머지 이전 커밋에서 삭제했는데 반영이 안 된 것 같습니다🥺)
  • FruitStore.swift
    • 기존의 checkFruitStock 함수(현 isAvailable(fruit:))에서 if문과 guard let문이 같이 사용되었는데, if let문을 사용하면 옵셔널 바인딩과 조건문을 동시에 사용할 수 있다는 것을 알게 되어 if let문으로 변경했습니다. 에러 처리를 도입한 후에는 if else문으로 상황별로 분기 처리해서 가독성을 높이도록 했습니다.
  • JuiceMakerViewController.swift
    • 쥬스를 만드는 화면에서 과일의 재고를 수정하는 화면으로 이동할 때 모달 프레젠테이션 방식을 사용했습니다.

    • 쥬스를 만드는 것이 성공했는지, 실패했는지를 반환해주고 alert을 띄우기 위해 다음과 같은 코드를 작성했습니다. 처음에는 쥬스 버튼별로 코드를 나열했다가 중복되는 부분을 함수로 분리시켜 범용적으로 사용하도록 만들었습니다.

      func tryMakingJuice(menu: [JuiceMenu], menuName: String) {
          do {
              try juiceMaker.makeJuice(juiceMenu: menu)
              try juiceMaker.consumeFruit(recipe: menu)
              alertSufficientStock(juiceName: "\(menuName)")
          } catch FruitStoreError.outOfStock {
              alertInsufficientStock()
          } catch {
              print("잘못된 입력입니다.")
          }
      }

✨ 고민했던 점

함수와 변수의 네이밍

  • 입력된 쥬스 메뉴가 제조가 가능한지 여부를 Bool로 리턴해주는 checkSufficientStock(recipe: [JuiceMenu]), 입력된 과일의 재고가 레시피의 용량만큼 존재하는지를 Bool로 나타내주는 checkFruitStock(fruitForRecipe: JuiceMenu)의 이름을 isAvailable로 동일하되, 파라미터 형식이 다른 이름으로 변경했습니다. 또한 파라미터명도 각각 menu, fruit로 변경했습니다.

내비게이션 바가 나타나지 않는 현상

  • JuiceMakerViewController에서 ModifyStockViewController로 이동하는 부분에서 ModifyStockViewController로 직접 present를 하여 ModifyStockViewControllernavigationBar가 보이지 않는 문제가 발생했습니다. 이 경우 ModifyStockViewController를 바로 present 하지 않고 ModifyStockViewController가 속한 navigationViewController를 present 함으로써 문제를 해결했습니다.
@IBAction func modifyStockButtonTapped(_ sender: Any) {
    guard let viewController = self.storyboard?.instantiateViewController(withIdentifier: "ModifyStockViewController") as? ModifyStockViewController else {
        return
    }
        
    let navigationController = UINavigationController(rootViewController: viewController)
    self.present(navigationController, animated: true)
}

에러 처리

  • 에러 처리에 대해서 처음 공부해보고 논의하여, 발생할 수 있는 에러를 enum으로 선언했습니다.

    • outOfStock: 재고 부족
    • invalidFruitName: FruitStore에 존재하지 않는 과일 종류 입력
    enum FruitStoreError: Error {
        case outOfStock
        case invalidFruitName
    }
  • 주스를 주문하는 tryMakingJuice 함수에서 do catch문으로 주스를 만들 수 있는지 확인하고, 과일들을 소모하면서 만약 에러가 발생한다면 상황에 맞게 다른 대처를 취할 수 있도록 했습니다.

의존성 주입

  • 쥬스메이커 컨트롤러에서 쥬스 창고에 직접 접근하던 코드를 수정하여 쥬스 창고는 쥬스메이커에서만 접근할 수 있도록 수정했습니다.
  • 쥬스메이커 컨트롤러에서 쥬스 창고에 접근하기 위해서는 쥬스메이커에 생성된 함수를 사용하도록 수정했습니다.
// FruitStore.swift
private var fruits: [FruitCategory: Int]

// JuiceMaker.swift
private var fruitStore: FruitStore

📝 조언을 얻고 싶은 부분

  • 네이밍이 적절한지 궁금합니다!

    • isAvailable이란 이름은 같되 파라미터만 다르게 한 함수를 2개를 만들었습니다. 파라미터가 menu인 경우는 해당 메뉴가 가능한지를, fruit인 경우는 메뉴의 레시피에 포함되는 과일의 재고가 충분한지를 나타냅니다. 이렇게 네이밍 해도 좋은지 궁금합니다.
  • 로직이 괜찮은지 궁금합니다!

    • tryMakingJuice 함수 내부에서 makeJuice가 성공한 다음에 consumeFruit 함수를 호출을 하고싶은데 현재는 makeJuice함수 다음 바로 consumeFruit 함수를 위치시켜 실행을 하고 있는데 이 방법으로 호출하는게 괜찮은 방법일까요?
  • 에러를 처리하는 위치가 어디가 좋을지 궁금합니다!

    • FruitStore에서 생기는 오류는 모두 JuiceMakerViewController로 넘겨 처리하고 있는데 이렇게 에러를 모아서 한 곳에서 처리하는게 괜찮은 방법인지 궁금합니다!
  • 커밋 컨벤션이 적절한지 궁금합니다!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant