3

我知道参数越少越好,超过 2 个(或 3 个或 4 个,取决于文献)是代码味道。

如果我有带参数的代码,例如:

class DoubleSeries
  def self.generate_sequences(seq1_start, seq2_start, seq1_step, seq2_step, iterations)
    seq1,seq2=seq1_start,seq2_start
    result=[]
    (1..iterations).each do
      result << seq1 << seq2
      seq1+=seq1_step
      seq2+=seq2_step
    end
    result
  end
end

当它们都服务于函数时,如何将参数数量从 5 个减少?

4

2 回答 2

6

我想如果您想严格遵守Sandi Metz 规则,那么 OOP 方式就是您要走的路。

class Sequence
  attr_reader :start, :step

  initialize(start, step)
    @start = start
    @step = step
  end
end

sequence_1 = Sequence.new(seq1_start, seq1_step)
sequence_2 = Sequence.new(seq2_start, seq2_step)

class DoubleSeries
  def self.generate_sequences(sequence_1, sequence_2, iterations)
    item_1, item_2 = sequence_1.start, sequence_2.start
    result=[]
    iterations.times do
      result << item_1 << item_2
      item_1 += sequence_1.step
      item_2 += sequence_2.step
    end
    result
  end
end

[我的代码(迈克尔):

在此处输入图像描述

于 2013-10-15T03:50:50.583 回答
2

如果您不能没有参数,那么该参数必须保留。仅仅因为具有小签名的方法是首选,这并不意味着当每个参数都是必需的时,长方法签名是不好的。

但是,如果您真的想作弊并缩短签名,您可以尝试:

class DoubleSeries
  def self.generate_sequences(array_args)
    seq1_start, seq2_start, seq1_step, seq2_step, iterations = *array_args
    seq1,seq2=seq1_start,seq2_start
    result=[]
    (1..iterations).each do
      result << seq1 << seq2
      seq1+=seq1_step
      seq2+=seq2_step
    end
    result
  end
end

但是,我会争辩说,我写的内容不如您最初写的内容清晰(因为论点更加模棱两可)。我只是给出了一个代码示例来向您展示您只能有一个参数,但这可能不是最好的方法。

做你想做的另一种方法是改变你生成序列的方式。例如

class DoubleSeries
  def self.generate_sequence(seq1_start, seq1_step, iterations)
    seq1=seq1_start
    result=[]
    (1..iterations).each do
      result << seq1
      seq1+=seq1_step
    end
    result
  end        
end

x = DoubleSeries.generate_sequence(1,5,5)
y = DoubleSeries.generate_sequence(4,6,5)
x.zip(y).flatten

或者,使用 Ruby 2.0 和惰性枚举器:

range = 1..Integer::INFINITY
seq_1 = range.lazy.collect{|n| (n-start_1 % seq_1_step) == 0}.first(iterations)
seq_2 = range.lazy.collect{|n| (n-start_2 % seq_2_step) == 0}.first(iterations)
seq_1.zip(seq_2).flatten
于 2013-10-15T03:40:56.007 回答