Swift初学者が自動販売機ロジックを実装してみた!

#概要
現在、私はMENTAサービスを利用し、ヤマタクメンターにご指導いただいています。

ヤマタクメンターやサービスについて知りたい方はこちら！
(https://menta.work/plan/584)

その中で、今回は、「自動販売機ロジックの実装」の課題を行ったので、アウトプットしていきます。

なお、今回の課題はSwift初学者が作ったロジックであり、至らぬ点が多々あると思います。どうか、温かい目で見守っていただけると幸いです。

アドバイスはどしどし受け付けております。

※一部、サンプルコードも含まれており、今回は、リファタリングがメインです。その点もご理解ください。

***環境***

-Playground

# 要件

### サンプル実装の要件
・日本円を入力できる
・入力された日本円と飲み物の価格を比較し、前者が後者の値を上回っている且つ対象の飲み物の在庫がある場合に購入可能フラグを返す
・対象の飲み物は「コーヒー」「水」「モンスター」とする
・対象の飲み物の購入可能判定を返す際に対象の飲み物の在庫を1減らす

### 今回実装したリファタリングの要件
・ 飲み物を購入した際にお釣りの金額を返す
・在庫がない場合に「在庫切れ」という出力をする
・購入されるたびに、購入された飲み物の在庫の数を出力する
・入力された日本円を出力する関数を追加
・在庫がない場合に投入された金額を返却する
・飲み物と同じ値段を投入した時もtureを返す
・購入が成立すると" お買い上げありがとうございます"と出力


# サンプル実装

```swift:VirtualVendingMachine.rb
import UIKit

class VirtualVendingMachine {
   
    //ドリンクのタイプ
    enum DrinkType {
        case coffee
        case water
        case monster
    }
    
    
    var inputedYen: Int = 0
    
    //値段
    var coffeePrice: Int = 120
    var waterPrice: Int = 100
    var monsterPrice: Int = 210
    
    //在庫
    var coffeeStock: Int = 5
    var waterStock: Int = 5
    var monsterStock: Int = 5
    
    
    //ドリンク購入
    func buyDrink(type: DrinkType, inputedYen: Int) -> Bool {
       
       
        var isBuyable = false
        
        coinOutput(type: type, inputedYen: inputedYen)
        
        switch type {
    
        case .coffee:
            isBuyable = coffeePrice <= inputedYen && 0 < coffeeStock
        case .water:
            isBuyable = waterPrice <= inputedYen && 0 < waterStock
        case .monster:
            isBuyable = monsterPrice <= inputedYen && 0 < monsterStock
        
        }
        
        returnDrinkTypeSwich(type: type, inputedYen:inputedYen)
        
        return isBuyable
    
    }
    


    //ドリンクタイプの
    func returnDrinkTypeSwich(type: DrinkType, inputedYen:Int) {
            
        switch type {
      
        case .coffee:
            
            coffeeReturnYenStock(type:type, inputedYen: inputedYen)
            
        case .water:
           
            waterReturnYenStock(type:type, inputedYen: inputedYen)
            
        case .monster:
          
            waterReturnYenStock(type:type, inputedYen: inputedYen)
            
        }
    
    
    }

    //日本円を出力する
    func coinOutput(type: DrinkType,inputedYen: Int){
        print("\(inputedYen)円が投入されました")
   
    }
    
 
//コーヒーが買われた時、お釣りと在庫管理する
    func coffeeReturnYenStock(type: DrinkType,inputedYen: Int){
      
        //お釣りを返す
        if coffeeStock <= 0 {
             
            print("コーヒーの在庫がないので\(inputedYen)円を返却します")
            
        }else if inputedYen >= coffeePrice{
           
            var returnYen1   =  inputedYen - coffeePrice
            
          
            print("お買い上げありがとうございます")
            print("お釣りは\(returnYen1)円です")
            
            
        }else{
          
            var noenoughcoins = coffeePrice - inputedYen
            print("\(noenoughcoins)円足りません")
        
        }
        
        
        //在庫の管理
       if inputedYen >= coffeePrice && coffeeStock > 0 {
             
           coffeeStock -= 1
             print("現在のコーヒーの在庫は\(coffeeStock)です")
     
      
    }else{
          
            return
          
         }
        
    }
    
//水が買われた時、お釣りと在庫管理する
    func waterReturnYenStock(type: DrinkType,inputedYen: Int){
       
        if waterStock <= 0 {
            
            print("水の在庫がないので\(inputedYen)円を返却します")
            
            
        }else if inputedYen >= waterPrice{
         
            var returnYen2   =  inputedYen - waterPrice
            print("お買い上げありがとうございます")
            print("お釣りは\(returnYen2)円です")
            
        }else{
            
            print("お金が足りません")
        
        }
        
       
        if inputedYen >=  waterPrice && waterStock > 0 {
           
            waterStock -= 1
            print("現在の水の在庫は\(waterStock)です")
        
        }else{
       
            return

       }
           
        
    }
    
 //モンスターが買われたとき、お釣りと在庫を管理する
    func monsterReturnYenStock(type: DrinkType,inputedYen: Int){
        
      
        if monsterStock <= 0 {
            
            print("モンスターの在庫がないので\(inputedYen)円を返却します")
            
        }else if inputedYen >= monsterPrice {
         
            var returnYen3   =  inputedYen - monsterPrice
           
            print("お買い上げありがとうございます")
            print("お釣りは\(returnYen3)円です")
            
        }else{
            print("お金が足りません")
         
        }
     
        if inputedYen >=  monsterPrice && monsterStock > 0{
               
                monsterStock -= 1
           print("現在のモンスターの在庫は\(monsterStock)です")
            
            }else{
            
                 return
        
    }
        
    }
    
}
let virtualVendingMachine = VirtualVendingMachine()
let isSuccessToBuy = virtualVendingMachine.buyDrink(type: .water, inputedYen:  150)
print(isSuccessToBuy)

```
# 反省点
・functionの名前をつけるのが、難しかった。
・コードが単調になってしまっている気がする。

# まとめ
ロジックを考えるのは、基礎学習のアウトプットにとても最適だと思います。
色々な発見や、自分の苦手な部分に気づくことができるので、基礎学習の脱却を目指している人は、是非一度、挑戦してみてはいかがでしょうか？

それでは！