【问题标题】:Ruby if statement - how to avoid multiple elsif statements including notRuby if 语句 - 如何避免多个 elsif 语句,包括 not
【发布时间】:2016-02-19 18:55:41
【问题描述】:

我正在创建一个功能来根据我在属性上的属性(在 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

此代码的目的是生成句子,如果这些属性当然具有这些属性,则显示为“此属性具有 [internet], and [cable TV], [TV]”。然而,这句话的使用和这个类的实例化发生在一个单独的服务对象中,使用:

class RoomDescriptionGenerator < RoomDescriptionGeneratorBase
  #Other code...

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

end

if/elsif 语句与 not(!) 结合使用看起来很可怕。我正在寻找更清晰的方法来重构它,以实现基于属性生成正确句子的目标。

【问题讨论】:

  • 看看建造者模式:rorandme.blogspot.nl/2012/02/…
  • 请尝试在下面使用:如果互联网? && 有线电视?返回 internet_and_cable_tv_sentence

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


【解决方案1】:

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

此外,您在每种情况下都检查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 块

【讨论】:

    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2022-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-29
      相关资源
      最近更新 更多