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

ただし、私が書いたものは、あなたが最初に書いたものよりも明確ではないと主張します (議論がはるかに曖昧であるため)。引数を 1 つしか持てないことを示すコード例を示しましたが、これは最善の方法ではない可能性があります。

必要なことを行う別の方法は、シーケンスの生成方法を変更することです。例えば

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 とLazy Enumeratorsを使用して:

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 に答える