@wongbing
웡빙 안녕하세요!!
4-1조 송준, Rowan JuiceMaker 첫 PR 보내드립니다 🙌
피드백 잘 부탁드립니다 🙏
### 고민한 점
#### Nested Type 사용
#### 재고 표현 방법
* class Fruit
과일 인스턴스를 FruitStore에 생성 -> ```JuiceMaker.make```메서드에서 과일 프로퍼티에 접근하는 방법이 번거로웠습니다. 각각의 과일 프로퍼티에 접근할 때 배열을 사용해야하는 불편함이 있었습니다.
```swift=
class FruitStore {
class Fruit {
let name: String
let stock = 10
init(name: String) {
self.name = name
}
}
let strawberry = Fruit(name: "딸기")
let banana = Fruit(name: "바나나")
let kiwi = Fruit(name: "키위")
let pineapple = Fruit(name: "파인애플")
let mango = Fruit(name: "망고")
func makeFruitsList() -> [Fruit] {
let fruitsList = [self.strawberry, self.banana, self.kiwi, self.pineapple, self.mango]
return fruitsList
}
func findFruit(fruitName: String) -> Fruit? {
for i in 0..<makeFruitsList().count {
if makeFruitsList()[i].name == fruitName {
return makeFruitsList()[i]
}
}
}
}
```
* dictionary
클래스를 사용하는 방법 외에 딕셔너리를 사용하는 방법을 고민해봤습니다. 그 결과로 가독성이 좋아졌습니다. 추가적으로 딕셔너리를 생성함으로써 만약 외부에서 새로운 품목을 추가할 때 위의 클래스 방식보다 수월할 것이라 생각됩니다.
또한, JuiceMaker ```make```메서드에서 ```Recipe``` 열거형 ingredients 연산 프로퍼티를 통해 ```subtractInventory```메서드의 parameter 전달이 수월해졌습니다.
```swift=
class FruitStore {
var fruitsStock = ["딸기":10, "망고":10, "바나나":10, "키위":10, "파인애플":10]
func subtractInventory(fruit: String, number: Int) throws {
guard let selectedStock = self.fruitsStock[fruit],
selectedStock - number >= 0 else {
throw StockError.outOfStock
}
fruitsStock[fruit] = selectedStock - number
}
func addInventory(fruit: String, number: Int) {
if let selectedStock = self.fruitsStock[fruit] {
fruitsStock[fruit] = selectedStock + number
}
}
func checkStock(fruit: String) {
let resultMessage = "\(fruit)의 재고는 \(fruitsStock[fruit])개입니다."
}
```
### 조언을 얻고 싶은 부분
#### 이 코드에서 더 효율성을 낼 수 있는 방법이 궁금합니다!!
#### Magic Literal/Number 사용
```Dictionary``` key, value에서 (과일명, stock초기값)을 magic literal/number로 표현했습니다.
magic literal/number의 사용을 지양하라는 피드백이 자주 보여서 고민해봤는데 dictionary 또는 enum에 값을 할당할 때도 적용해주는게 좋을까요?
- *magic literal/number*
```swift=
var fruitsStock = ["딸기":10, "망고":10, "바나나":10, "키위":10, "파인애플":10]
```
- *열거체*
```swift=
enum fruit {
static let strawberry = "딸기"
static let mango = "망고"
static let banana = "바나나"
static let kiwi = "키위"
static let pineappe = "파인애플"
}
```