# **쥬스 메이커 (juice-maker)*
## 1. **소개**
사용자가 버튼을 통해 쥬스를 주문하면 쥬스를 만들어주고 재료를 소모합니다.
재료 수정 페이지를 통해 부족한 재료를 추가할 수 있습니다.
## 2. **🧑🤝🧑 팀원**
### 팀원
| **stone** | **제이푸시** |
| ----- | ----- |
| <img width="180px" src="https://avatars.githubusercontent.com/u/74972815?v=4"> | <img width="180px" src="https://i.imgur.com/JqEDLOf.jpg"> |
## 3. 👩🏻💻 실행 화면(기능 설명)
-- 이후 추가
## 4. **🔥 트러블 슈팅**
### **레시피를 만들때 튜플 배열 or 딕셔너리 사용**
- 레시피를 만들 때 둘 중 어떤 방식을 채택할지 고민했습니다.
- [.strawberry : 10, .banana : 1]
- [(.strawberry, 10), (.banana, 1)]
- 가독성이 조금 더 좋다고 생각한 딕셔너리를 사용했습니다.
### **switch문을 사용해서 에러 메세지를 catch 할 때 catch문이 많아지는 문제**
- 예상외의 에러를 체크해주는 부분을 한번에 묶어주기 위해서 `LocalizedError`를 사용했습니다.
### **enum에서 원시값으로 딕셔너리를 주지 못하는 문제**
- 딕셔너리를 가지는`Struct`로 구현했으나 enum의 값들과 중복되는 부분이 많아, enum내에 enum value를 이용해 레시피를 구현하는 방법을 채택했습니다.
## **5. 🤔고민한 부분**
**이미 유효성을 확인 한 후에 `Dictionary`의 값을 사용할 때**
- `fetchFruitAmount`함수를 사용하여, 과일의 유효성 체크를 하는데, 유효성 체크 후 `useFruits`함수를 사용하여 과일의 갯수를 감소시킵니다.
- `useFruits`함수 내부에서 `Dictionary`값인 `fruits`를 사용하는데,이미 유효성 검사가 끝난 값이라 굳이 `throw`로 에러를 던지지 않고 `return`으로 처리해도 되지 않을까 고민했습니다.
**딕셔너리 [Fruit : Int]를 사용해서 과일 저장소를 구현할 때 Int의 모호함을 해결하기 위한 고민**
딕셔너리로 표현시 처음 보는 사람이 의미를 잘 파악하지 못할 수 있으므로 과일명과 재고를 가지고 `Struct`를 정의해서 구현을 고민했습니다.
1. Typealias 파일을 만들어서 `typealias`들을 명시합니다.
- 단점: 사용하는 파일에 `typealias`가 무슨 타입인지 구현을 확인해야 합니다.
2. 사용하는 파일에 각각 `typealias`를 명시해줍니다.
- 단점: 다른 파일의 코드를 가져다 쓴다면 매개변수에 쓰이는 부분때문에 중복 명시가 있습니다.
두가지 방법중 1번의 단점을 좀 더 크게 보고 2번의 방법을 채택하고 싶었으나 파일의 길이가 길어지면 1의 단점이 똑같이 드러나게 된다고 생각했습니다. 2가지 방법으로도 해결을 하지 못한다 생각해서 `Struct`로 딕셔너리를 구현할 생각을 했습니다.
`Sturct`로 구현하는 방법을 채택하여 진행하려 했지만, `Dictionary`를 사용했을 때의 로직들을 전부 리팩토링이 이루어져야해, 비효율적으로 느껴졌습니다. 그래서 `Dictionary` 값을 할당하고 있는 `fruits` 변수의 네이밍 수정을 통하여 `Dictionary`타입의 방식을 채택하기로 결정했습니다.
## 6. **🔗 참고 링크**
[Swift Language Guide - Initialization](https://docs.swift.org/swift-book/LanguageGuide/Initialization.html)
[Swift Language Guide - Error Handling](https://docs.swift.org/swift-book/LanguageGuide/ErrorHandling.html)
[Swift Language Guide - AccessControl](https://docs.swift.org/swift-book/LanguageGuide/AccessControl.html)