プログラミング的なSomething

プログラミング的なSomething

ITエンジニア(?)目線で生活・自転車・トレーニング話を綴ります

コードの外的振る舞いから内部実装を行うをやってみた

独学者としてはRubyの上達法というエントリはとても参考になります。今回は以下の記事で紹介されていた、コードの外的振る舞いから実装に落とし込む作業をしてみた。

Rubyをより良く書けるようになるための課題演習のつくりかた

作業時間は延べ2時間くらい?

class VendingMachine
  def initialize
    @money = 0
    @sales = 0
    @stock = {}
    @stock = {:cola=>{:price=>120, :stock=>5}}
  end

  def stock_info
    @stock
  end

  def store(drink)
    @stock[drink[0]] = drink[1]
    # カッコ悪いから書きなおす
  end

  def insert(coin)
    if coin == 10 or coin == 50 or coin == 100 or coin == 500 or coin == 1000
      # カッコ悪いから書きなおす
      @money = coin + @money
    else
      puts coin
    end
  end

  def total
    @money
  end

  def refund
    @money = 0
  end

  def purchasable_drink_names
    purchasable_drinks = []
    @stock.each do |key,value|
      purchasable_drinks << key if @money >= value[:price]
    end
    purchasable_drinks
  end

  def purchasable?(drink)
    if @stock[drink][:price] <= @money
      puts "true"
    else
      puts "false"
    end
  end

  def purchase(drink)
    if @stock[drink][:price] <= @money
      @sales = @sales + @stock[drink][:price]
      @stock[drink][:stock] = @stock[drink][:stock] - 1
      @money = 0
    else
      nil
    end
  end

  def sale_amount
    @sales
  end

end


class Drink
  def self.redbull
    redbull = [:redbull,{:price=>200, :stock=>1}]
  end

  def self.water
    water = [:water,{:price=>100, :stock=>1}]
  end

end

汚くてもかいちゃえって部分は自分でも実感しているので、スマートな方法をフィードバックされたらそら上手くなっていくよなーと思いました。独学のイマイチな部分ですね。