2013-12-08 5 views
0

Я новичок в Ruby, и я создаю небольшие бюджетные помощники.Упрощение моего кода с помощью методов?

Я знаю, что есть способ упростить этот код дальше, и я не могу окунуться в голову, какой метод мне нужно создать. Я повторяю needs, wants, save и пятьдесят, тридцать, двадцать, и т.д .:

puts "What's your annual income?" 
annual_income = gets.to_i 

weeks = 52.1775 
monthly_income = ((annual_income/weeks) * 2) 
weekly_income = (annual_income/weeks) 
needs = 0.5 
wants = 0.3 
save = 0.2 

def calc_amount(income, expense) 
    sprintf('%.2f',(income * expense)) 
end 

# Monthly 
fifty_percent_monthly = calc_amount(monthly_income, needs) 
puts "You should spend no more than $#{fifty_percent_monthly} on 'Needs' a month." 

thirty_percent_monthly = calc_amount(monthly_income, wants) 
puts "You should spend no more than $#{thirty_percent_monthly} on 'Wants' a month." 

twenty_percent_monthly = calc_amount(monthly_income, save) 
puts "You should save $#{twenty_percent_monthly} a month." 

# Each paycheck 
fifty_percent_weekly = calc_amount(weekly_income, needs) 
puts "You should spend no more than $#{fifty_percent_weekly} on 'Needs' each paycheck." 

thirty_percent_weekly = calc_amount(weekly_income, wants) 
puts "You should spend no more than $#{thirty_percent_weekly} on 'Wants' each paycheck." 

twenty_percent_weekly = calc_amount(weekly_income, save) 
puts "You should save $#{twenty_percent_weekly} each paycheck." 

# Total spent each year 
yearly_needs = calc_amount(annual_income, needs) 
puts "You'll be spending $#{yearly_needs} on 'Needs' each year." 

yearly_wants = calc_amount(annual_income, wants) 
puts "You'll be spending $#{yearly_wants} on 'Wants' each year." 

yearly_savings = calc_amount(annual_income, save 
puts "Congrats! Your total savings each year will be $#{yearly_savings}" 
+0

Лучшее место для этого вопроса, вероятно, [Обзор кодов] (http://codereview.stackexchange.com). –

+0

Alrighty! Спасибо. Я обязательно отправлюсь туда в следующий раз. –

+2

Этот вопрос, кажется, не по теме, потому что он, кажется, принадлежит на codereview.stackexchange.com – kero

ответ

3

Вы в основном хотите перебирает каждый тип периода времени, а затем цикл над каждым пунктом в вашем бюджете в этом. Вот простой способ, которым Вы могли бы добиться этого:

puts "What's your annual income?" 
annual_income = gets.to_i 

budget = { 
    :needs => 0.5, 
    :wants => 0.3, 
    :save => 0.2, 
} 

periods = { 
    'weekly' => 52.1775, 
    'monthly' => 12, 
    'yearly' => 1, 
} 

periods.each do |period_name, periods_per_year| 
    budget.each do |line_item_name, line_item_fraction| 
    amount = annual_income.to_f/periods_per_year * line_item_fraction 
    puts "You should spend %0.2f on '%s' %s" % [amount, line_item_name, period_name] 
    end 
end 

Выход не точно такой же, как у вас, но это работает. Вот что я получу, если я ввещу 1000:

You should spend 9.58 on 'needs' weekly 
You should spend 5.75 on 'wants' weekly 
You should spend 3.83 on 'save' weekly 
You should spend 41.67 on 'needs' monthly 
You should spend 25.00 on 'wants' monthly 
You should spend 16.67 on 'save' monthly 
You should spend 500.00 on 'needs' yearly 
You should spend 300.00 on 'wants' yearly 
You should spend 200.00 on 'save' yearly 
+0

Отлично! Этого достаточно, чтобы заставить меня использовать идею о том, как это будет работать. –

+1

+1, красиво сделано. Помимо превосходного рефакторинга, использование '' '' '' '' '' '' 'вместо традиционного 'sprintf' является идиоматическим Ruby. Единственное, что я вижу, что вы пропустили, - это использование знака доллара перед значениями, но это могло быть назначено константе, а затем заменено на строку формата, позволяя коду работать в любой валюте с незначительной настройкой , –

Смежные вопросы