我想听听专家在下列情况下作为程序员应该做些什么。
人是一个具有名称,生日等属性的类,其中一个是性别,男性为“m”,女性为“f”。 Person类有实例方法#male?和#female?分别测试性别是“m”还是“f”。
重要的是,按照设计,性别总是有“m”或“f”,永远不会变成零或任何其他价值。
现在,我经常遇到需要切换逻辑的情况,具体取决于给定Person实例在性别字段中的值。
我的问题是,假设性别值总是“m”或“f”是正常的,所以如果它不是“m”,那么它必须是“f”,如下所示?< / p>
if (person.male?)
# do male stuff
else
# must be female. do female stuff
end
或者我是否应该经常测试以确保人是女性,即使它被测试为非男性,如下所示?
if (person.male?)
# do male stuff
elsif (person.female?)
# do female stuff
else
raise "Person is neither male nor female."
end
我觉得第二个例子有点重复,更重要的是,这个if / else子句不是测试模型数据不一致的地方,所以我倾向于选择第一个案例,但每次都是我这样做,我想知道这是不是应该的样子。我的意思是,如果这是一个布尔字段,我不会担心它,但事实并非如此。
有什么想法吗?
干杯,
SAKI
答案 0 :(得分:1)
好的,让我们的课程简单,只包含性别:
class Person
def initialize sex
raise "wrong sex" unless ['m', 'f'].include?(sex)
@sex=sex
end
attr_reader :sex
end
tom = Person.new 'm' # ok
anna = Person.new 'f' # ok
drwho = Person.new # ArgumentError: wrong number of arguments (0 for 1)
wrong = Person.new 'cat' # RuntimeError: wrong sex
您无法使用Person
或m
以外的性别创建f
(正如您所说)。
你能改变sex
吗?
tom.sex='ff'
# NoMethodError: undefined method `sex=' for #<Person:0x3f32148 @sex="m">
还有其他方法可以更改sex
吗?
tom.instance_variable_set '@sex', 'cat'
# => "cat"
tom.sex
# => "cat"
我可以假设它是女性
这取决于两个因素:
如果你关心速度,你可以避免它,因为你可以看到我用 hackish 的方式来改变sex
。
如果您必须100%确定,请使用elsif
。