Ruby on Rails分解帮助有条件

时间:2015-06-28 16:55:21

标签: ruby-on-rails-4

我正在使用pull review并要求我考虑以下代码,有人可以帮我解决这个问题吗?

  @start_time = (params[:start_time].to_time.hour.to_i < @room.opening_time.hour.to_i)? @room.opening_time.hour_minutes : params[:start_time]
  @end_time = (params[:end_time].to_time.hour.to_i > @room.closing_time.hour.to_i)? @room.closing_time.hour_minutes : params[:end_time]

1 个答案:

答案 0 :(得分:0)

首先,你可以把你正在比较的一些疯狂的长链扔进像这样的变量

opening_time = @room.opening_time.hour.to_i
closing_time = @room.closing_time.hour.to_i
starting_time = params[:start_time].to_time.hour.to_i
ending_time = params[:end_time].to_time.hour.to_i
open_minutes = @room.opening_time.hour_minutes
close_minutes = @room.closing_time.hour_minutes 

然后你可以做

@start_time = starting_time < opening_time ? start_minutes : params[:start_time]
@end_time = ending_time > closing_time ? end_minutes : params[end_time]

更具可读性。

从那里我建议提取出两种方法来运行实际的条件,使英语更清楚代码尝试做什么。例如:

def get_start_time(time)
  starting_time = time.to_time.hour.to_i
  opening_time = @room.opening_time.hour.to_i
  open_minutes = @room.opening_time.hour_minutes
  starting_time < opening_time ? start_minutes : time
end

def get_end_time(time)
  ending_time = time.to_time.hour.to_i
  closing_time = @room.closing_time.hour.to_i
  close_minutes = @room.closing_time.hour_minutes
  ending_time > closing_time ? end_minutes : time
end

@start_time = get_start_time(params[:start_time])
@end_time = get_end_time(params[:end_time])

虽然它可能是更多的物理代码,但阅读起来更清晰,更简单,这是重构的一个重要部分,尤其是在与团队合作时。