如何重构此算法中的连续,独立,if语句?

时间:2016-07-12 04:09:54

标签: ruby algorithm refactoring

以下方法生成81个Cell个对象,每个对象都有不同的rowcolumnblocks。它使用一种算法,根据当前生成的Cell更改这些属性。

1.times do为0时,实现if部分以跳过until循环内第一个循环上的cell_counter语句块。如何制作这更优雅吗?

def initialize_default_cells
    cell_counter, row, column = 0,0,0
    block = 1

    until cell_counter == 81
      1.times do 
        break if cell_counter == 0
        if cell_counter % 1 == 0
          column += 1
        end
        if cell_counter % 3 == 0
          block += 1
        end
        if cell_counter % 9 == 0
          column -= 9
          row += 1
          block -= 3
        end
        if cell_counter % 27 == 0
          block += 3
        end
      end
      @cells << Cell.new(ROW_ID[row], COLUMN_ID[column], block)
      cell_counter += 1
    end
  end

1 个答案:

答案 0 :(得分:2)

我的结论是,对于每个row,从头开始计算columnblocki = 0,..,80最简单。

def initialize_default_cells
  (0..80).each do |i|
    @cells << Cell.new(ROW_ID[i/9], COLUMN_ID[i%9], 1 + (i%9)/3 + 3*(i/27))
  end
end

COLUMN_IDi%9)的密钥从i-9*(i/9)减少,最后一个参数(1 + (i%9)/3 + 3*(i/27))从1 + i/3 - 3*(i/9) + 3*(i/27)减少

考虑三个例子。

i=0

@cells << Cell.new(ROW_ID[0/9], COLUMN_ID[0%9], 1 + (0%9)/3 + 3*(0/27))
  #=> << Cell.new(ROW_ID[0], COLUMN_ID[0], 1)

i=6

@cells << Cell.new(ROW_ID[6/9], COLUMN_ID[6%9], 1 + (6%9)/3 + 3*(6/27))
  #=> << Cell.new(ROW_ID[0], COLUMN_ID[6], 3)

i=29

@cells << Cell.new(ROW_ID[29/9], COLUMN_ID[29%9], 1 + (29%9)/3 + 3*(29/27))
  # << Cell.new(ROW_ID[3], COLUMN_ID[2], 4)

i=6时,6/3 #=> 2是可以被3整除的正数的数量,6/9 #=> 0是可以被{{1}整除的正数的数量}和9是可以被6/27 #=> 0整除的正数的数量。然后使用这些值计算27的参数。