Ryan
Ryan

Reputation: 1

Looking for help cleaning up code

This is for an assignment for a class. I want to create a register type application for a donut shop. The application should accept "l" to list flavors, "a" to add flavors, "d" to delete flavors, and "e" to exit. The prices should be listed in ascending order. When adding a flavor, it should ask first the flavor, then the price.

I have the application working. It uses Jekyll (what the class uses).

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

However it's even uglier than what I have here. I appreciate any input. I am interested in seeing what I should have done for clean up purposes, and maybe adding classes/methods where they should be, and making this more Rubyesque.

Upvotes: 0

Views: 55

Answers (1)

sawa
sawa

Reputation: 168269

I would change the code to the following. This is not refactor since it is not equivalent to your code. In particular, it is not inconsistent like your code is. For example, when it prompts, it does not sometimes change a line and sometimes not as in your code; My code never changes a line. My code also always prints the list after an operation, unlike your code, which does not do so particularly when an item is added. Also, unlike your code, it does not end a message sometimes with and sometimes without a period; Messages in my code never end with period.

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

Upvotes: 2

Related Questions