2012-11-23 41 views
0

有没有更好的(更有说服力)的方法来检查有效的参数?如何重构此Ruby代码以检查有效的参数?

def load_data filename, start_percent, end_percent 
    raise 'Values must be [0,1]' if start_percent < 0 
    raise 'Values must be [0,1]' if end_percent < 0 
    raise 'Values must be [0,1]' if start_percent > 1 
    raise 'Values must be [0,1]' if end_percent > 1 
    ... 

的Ruby 1.9.3

编辑:start_percentend_percent应该是浮动。

+1

这种方法有什么问题? –

+1

这是多余的,占用大量空间,并且容易出错。除此之外,它看起来业余。 –

回答

1

当这个错误发生时,你会想知道的细节(什么样的错误,有什么说法,什么无效值) :

def load_data filename, start_percent, end_percent 
    raise ArgumentError, "start_percent must be [0,1]; received #{start_percent}." unless start_percent.between?(0, 1) 
    raise ArgumentError, "end_percent must be [0,1]; received #{end_percent}." unless end_percent.between?(0, 1) 
end 
+0

这是一个很好的观点。 –

2

是啊!要看如果只想整数或也小数

# decimals 
def load_data(filename, start_percent, end_percent) 
    accepted = (0..1) 
    unless accepted.cover? start_percent && accepted.cover? end_precent 
    raise 'Values must be [0,1]' 
    end 
end 

的整数: 变化accepted = [0,1]accepted.include? start_percentend_percent

参考文献:

范围#盖:http://ruby-doc.org/core-1.9.3/Range.html#method-i-cover-3F

范围#包括?:http://ruby-doc.org/core-1.9.3/Range.html#method-i-include-3F

阵列#包括?: http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-include-3F

1

紧凑型:

[start_percent, end_percent].each{|p| raise 'Values must be [0,1]' unless (0..1).cover?(p) } 
+0

使用'do ... end'而不是'{}'这个效果很好 –

1
def load_data filename, start_percent, end_percent 
    unless (0..1).include?(start_percent) and (0..1).include?(end_percent) 
    raise 'Values must be [0,1]' 
    end 
    ...