코리 안녕하세요! @corykim0829
이번 쥬스 메이커 프로젝트를 함께하게 된 june과 iyeah 입니다 :)
저희가 열심히 STEP 1 구현을 해보았는데, 코드에 대한 의견을 주시면 큰 도움이 될 것 같습니다!
새해 복 많이 받으시고 잘 부탁드려요 🙋🏻♂️
# 세부사항
- [x] FruitStore 충족 조건
- [x] 관리하는 과일의 종류 : 딸기, 바나나, 파인애플, 키위, 망고
- [x] 각 과일의 초기 재고 : 10개
- [x] 각 과일의 수량 n개를 변경하는 기능
- [x] JuiceMaker의 충족 조건
- [x] FruitStore의 과일을 사용해 과일쥬스 제조
- [x] 과일의 재고가 부족하면 과일쥬스 제조 불가
- [x] JuiceMaker는 FruitStore를 소유하고 있음
- [x] (선택사항) 필요한 경우 오류처리(throw, try-catch)를 구현
# 설명
## 과일 저장소 (`final class FruitStore`)
-> final class, struct를 고민하다 final class로 적어놓긴 했지만 어떤 타입이 좋을지 고민이 되는 부분입니다. 아래 `고민된 부분` 항목에 적어두었습니다.
- `defaultStock: UInt` : 초기 재고(10)
initializer에 직접 10을 대입해도 동작은 같지만, 매직넘버를 사용하지 않기 위해 초기값을 static let 프로퍼티로 지정했습니다.
- `stockByFruit` : 과일 이름과 재고를 딕셔너리로 묶어 재고를 저장
배열과 딕셔너리를 고민하다 과일의 개수 검색의 시간복잡도를 고려하여 O(1)에 수정할 수 있는 딕셔너리를 사용했습니다.
- `enum Fruit: CaseIterable` : 과일의 종류
stockByFruit에서 사용할 키 값으로 과일들의 종류를 저장할 enum Fruit을 만들었고, 초기 재고를 반복문을 통해 설정해주기 위해 CaseIterable 프로토콜을 채택하였습니다.
- `func subtractStock(fruitType: Fruit, quantity: UInt) throws` : 과일이 소진될 때 재고를 감소시키는 함수
guard문을 통해 에러상황에 대한 처리를 했습니다.
- `func addStock(fruitType: Fruit, quantity: UInt) throws` : 과일이 채워졌을 때 재고를 증가시키는 함수
guard문을 통해 에러상황에 대한 처리를 했습니다.
## 주스 메이커 (`struct JuiceMaker`)
- `enum Juice` : 주스의 종류
- `var recipe` : 주스를 만드는데 필요한 과일 및 개수 (딕셔너리)
- `func isEnoughStock(fruit: FruitStore.Fruit, requiredQuantity: UInt) throws -> Bool` : 과일의 재고가 충분한지 확인하는 함수
guard문을 통해 에러상황에 대한 처리를 했습니다.
- `func makeJuice(_ juice: Juice) throws` : 재고가 충분한지 확인한 후, 주스를 제조하는 함수
들여쓰기 2번을 초과하지 않는다는 요구사항을 만족시키기 위해 where절을 사용했습니다
## 에러
`enum JuiceMakeError` : .outOfStock, .notExistFruit
`.outOfStock` : 과일 저장소에 해당 과일의 재고가 부족할 때 발생하는 에러
`.notExitFruit` : 과일 저장소에 과일이 존재하지 않을 때 발생하는 에러
# 고민된 부분
1. FruitStore를 `final class` VS `struct`?
```swift
- 재고를 관리하는 속성의 특성상 추후 여러 개의 JuiceMaker가 생긴다면
재고 관리를 함께 할 수도 있을 것 같아 Singleton 구현도 고려하였습니다.
- final class와 struct를 계속 고민하다가 결국 결론을 내리지 못했는데요,
어떤 걸로 구현해도 문제가 되진 않을 것 같아서요.
혹시 이 중에 문제가 되는 선택지가 있는지, 혹은 더 나은 선택지가 있다면 그 이유가 궁금합니다!
```
```swift
2. '갯수'를 나타내는 변수명 짓기
- JuiceMaker에서 requiredQuantity, FruitStore에서 과일을 사용하거나 추가할 때
quantity를 사용했는데 더 좋은 변수명 있을까요 ~?
```