Ruby if语句 - 如何避免多个elsif语句,包括不

时间:2015-11-18 06:34:34

标签: ruby-on-rails ruby if-statement syntax coding-style

我正在创建一个功能,根据我在属性上的属性(在Rails应用程序中)自动生成描述。

我已经创建了一系列服务类来处理这个 - 这里是

class RoomDescriptionGeneratorInternetTV <  RoomDescriptionGeneratorBase

  def generate
    if internet? && cable_tv?
      internet_and_cable_tv_sentence
    elsif internet? && tv? && !cable_tv?
      internet_and_tv_sentence
    elsif internet? && !tv? && !cable_tv?
      internet_sentence
    end
  end

  private

  def internet?
    room.internet (#refers to an active record column in the room model)
  end

  def cable_tv?
    room.cable_tv
  end

  def tv?
    room.tv
  end

  # The sentences are then held in the locales for translation purposes.
  def internet_sentence
    t("internet")
  end

  def internet_and_tv_sentence
    t("internet_and_tv")
  end

  def internet_and_cable_tv_sentence
    t("internet_and_cable_tv")
  end

此代码的目的是生成句子,其中显示“此属性具有[互联网],[有线电视],[电视]”当然这些属性具有这些属性。然而,这个句子的使用和这个类的即时化发生在一个单独的服务对象中:

class RoomDescriptionGenerator < RoomDescriptionGeneratorBase
  #Other code...

  def internet_tv
    RoomDescriptionGeneratorInternetTV.new(room,locale).generate
  end

end

使用if / elsif语句与不是(!)相结合似乎很可怕。我正在寻找更清晰的方法来重构这个,以达到我根据属性生成正确句子的目的。

2 个答案:

答案 0 :(得分:2)

您可以使用

def generate
  return internet_and_cable_tv_sentence if internet? && cable_tv? 
  return internet_and_tv_sentence if internet? && tv? && !cable_tv? 
  return internet_sentence if internet? && !tv? && !cable_tv? 
end

答案 1 :(得分:2)

我认为有些条件是没用的。例如,您在第二个条件下测试!cable_tv?,但如果cable_tv?true,那么第一个条件将是true alreday。在最后一个条件下的类似情况。

此外,您在每种情况下都会检查internet?。提前检查会更有效。

我会将块重写为:

def generate
  return unless internet? 

  case
  when cable_tv? then internet_and_cable_tv_sentence
  when tv?       then internet_and_tv_sentence
  else                internet_sentence
  end
end

请注意,出于可读性原因,我更喜欢case when块而不是if elsif