寻求帮助清理代码

时间:2015-10-07 21:45:07

标签: ruby architecture

这是一个课程的作业。我想为甜甜圈店创建一个注册类型的应用程序。应用程序应接受"l"列出flavor,"a"添加flavor,"d"删除flavor,"e"退出。价格应按升序列出。添加香精时,应首先询问味道,然后再询问价格。

我的应用程序正在运行。它使用Jekyll(类使用的)。

item = {}
item_asc = {}
puts "Welcome to d0nutz flavor menu"
input = ""
division_line = lambda {30.times {|x| print "="}}
while input != "e"
  division_line.call
  puts "\n(l)ist flavors\n(a)dd a flavor\n(d)elete a flavor\n(e)xit application"
  division_line.call
  print "\nYour choice: "
  input = gets.chomp
  case input
  when "l"
    item_asc.each {|x,y| puts "Flavor: #{x} - Cost: $#{y}"}
  when "a"
    puts "Enter new flavor: "
    flavor = gets.chomp
    puts "Enter cost: "
    cost = gets.chomp.to_i
    item[flavor] = cost
    item_asc = item.sort_by {|flavor,price| price}
    input = ""
  when "d"
    puts "Enter a flavor to remove"
    to_delete = gets.chomp
    item.delete("#{to_delete}") {|x| puts "#{x} not found."}
    item_asc = item.sort_by {|flavor,price| price}
    item_asc.each {|x,y| puts "Flavor: #{x} - Cost: $#{y}"}
    input = ""
  when "e"
  else
    puts "\nThat is not a recognised command"
  end
end

然而,它比我在这里更加丑陋。我很感激任何意见。我有兴趣看看我应该为清理目的做些什么,也许可以在应有的地方添加类/方法,并使这更像Rubyesque。

1 个答案:

答案 0 :(得分:2)

我会将代码更改为以下内容。这不是重构,因为它不等同于您的代码。特别是,它与您的代码不一致。例如,当它提示时,它有时不会改变一行,有时不会像你的代码那样;我的代码永远不会改变一行。我的代码也总是在操作后打印列表,这与您的代码不同,特别是在添加项目时,代码不会这样做。此外,与您的代码不同,它有时不会结束消息,有时也没有句号;我的代码中的消息永远不会以句点结束。

def prompt s
  print "#{s}: "
  gets.chomp
end
def list_items
  @items.each{|k, v| puts "Flavor: #{k} - Cost: $#{v}"}
end
def sort_items
  @items = @items.sort_by{|flavor, price| price}.to_h
  list_items
end

puts "Welcome to d0nutz flavor menu"
@items = {}
loop do
  puts(
    ?= * 30,
    "(l)ist flavors",
    "(a)dd a flavor",
    "(d)elete a flavor",
    "(e)xit application",
    ?= * 30,
  )
  case prompt("Your choice")
  when ?l
    list_items
  when ?a
    @items[prompt("Enter new flavor")] = prompt("Enter cost").to_i
    sort_items
  when ?d
    @items.delete(prompt("Enter a flavor to remove")){|k| puts "#{k} not found"}
    sort_items
  when ?e
    break
  else
    puts "That is not a recognised command"
  end
end