测试人是男性还是女性 - 如果不是男性,我可以假设它是女性吗?

时间:2014-01-30 21:13:55

标签: ruby coding-style

我想听听专家在下列情况下作为程序员应该做些什么。

人是一个具有名称,生日等属性的类,其中一个是性别,男性为“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

1 个答案:

答案 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

您无法使用Personm以外的性别创建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"

总结:

  

我可以假设它是女性

这取决于两个因素:

  1. 速度
  2. 正确性
  3. 如果你关心速度,你可以避免它,因为你可以看到我用 hackish 的方式来改变sex
    如果您必须100%确定,请使用elsif