2015-11-18 81 views
0

我正在创建一个功能来自动生成基于属性的属性(在Rails应用程序中)的描述。Ruby if语句 - 如何避免多个elsif语句不包括

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

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 

的这段代码的目的是生成句子读取“这个属性[互联网]和[有线电视] ,[电视]“如果这些财产当然有这些属性。使用这句话和这个类的instantuation的但发生在使用一个单独的服务对象:(!)

class RoomDescriptionGenerator < RoomDescriptionGeneratorBase 
    #Other code... 

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

end 

使用IF/ELSIF statments联合不只是看起来可怕。我正在寻找更明确的方法来重构这个,以达到根据属性生成正确句子的目的。

+1

看一看Builder模式:HTTP:// rorandme .blogspot.nl/2012/02/some-simple-design-patterns-in-ruby.html –

+0

只要尝试使用以下内容: 如果互联网? && 有线电视?返回internet_and_cable_tv_sentence –

回答

1

我认为,有些条件是无用的。例如,你在第二种情况下测试!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 

注意,我更喜欢在if elsifcase when块原因可读性 -

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