我正在创建一个功能,根据我在属性上的属性(在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语句与不是(!)相结合似乎很可怕。我正在寻找更清晰的方法来重构这个,以达到我根据属性生成正确句子的目的。
答案 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
块