ruby - 请帮我处理这个 Ruby 代码

标签 ruby refactoring

我是 Ruby 的新手,我知道我没有使用其中提供的简单而强大的方法。我使我的代码可以工作,但它必须简单而不是这么大(尤其是我觉得我在循环变量方面非常糟糕)

i = 0
j = 0

loop_count = ((to_date-from_date)/(60*60*24)).to_i#diff b/w two dates in days

loop_count.times do
   48.times do

    event = Icalendar::Event.new

    status = get_availability_on_date_and_hour(@templates, @availabilities, from_date+j.days, i).downcase

    if(status != 'unavailable')
      #Initialize start and end dates in DateTime's civil format
      bias_date_time = DateTime.civil(from_date.year, from_date.month, from_date.day)

      event.dtstart = bias_date_time + j.day + (i/2).to_i.hour + (i%2*30).to_i.minutes
      event.dtend = event.dtstart + 30.minutes

      event.summary = status.upcase
      cal.add_event(event)
    end

    i += 1
  end
  i = 0
  j += 1
end

最佳答案

没有什么特别针对 Ruby 的,但通常要使您的方法简短..

我会将循环内容提取到一个单独的方法中。方法名称用于描述正在发生的事情。

我还将计算提取到一个单独的方法中,以描述您正在尝试执行的操作,并将复杂的位(最有可能需要更改的部分)分开。

类似的东西:

0.upto(((to_date-from_date)/(60*60*24)).to_i) do |j|
  0.upto(48) do |i|
      status = get_availability_on_date_and_hour(@templates, @availabilities, from_date+j.days, i).downcase

      add_event(from_date, to_date, i, j, status) if status != 'unavailable'
  end
end


def add_event(from_date, to_date, i, j, status)
      event = Icalendar::Event.new

      event.dtstart = whatever_i_am_trying_to_calculate(from_date, i, j)
      event.dtend = event.dtstart + 30.minutes
      event.summary = status.upcase

      cal.add_event(event)
end

def whatever_i_am_trying_to_calculate(from_date, i, j)
  bias_date_time = DateTime.civil(from_date.year, from_date.month, from_date.day)
  bias_date_time + j.day + (i/2).to_i.hour + (i%2*30).to_i.minutes
end

同时为变量 i 和 j 提供有用的名称。 i 和 j 意义不大。

关于ruby - 请帮我处理这个 Ruby 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2990601/

相关文章:

mysql - MySQL 遗留数据库的终极噩梦

c++ - 解开 Knuth 的结 : how to restructure spaghetti code?

ruby-on-rails - 检查多个参数的存在

ruby - 使用 Capybara 测试纯 JavaScript 应用程序

ruby - 带有 rvm 的 ubuntu 12.04 上的 ruby​​ 缺少一些 readline 库

Ruby:邮件列表库或 gem

XML 结束标记独占一行

c# - #Region 内的 Resharper 7 : Sort Method by name,

java - Intellij 将私有(private)字段及其访问器方法移动/重构到不同的类

ruby - 重构 Ruby : Converting string array to int array