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

Ruby 如何在此算法中重构连续、独立的if语句?,ruby,algorithm,refactoring,Ruby,Algorithm,Refactoring,下面的方法生成81个单元格对象,每个对象都有各自不同的行,列,和块。它使用一种算法,根据当前生成的单元格更改这些属性 1.times do部分用于跳过内第一个循环上的if语句块,直到循环,此时单元计数器为0。我该如何使它更优雅 def initialize_default_cells cell_counter, row, column = 0,0,0 block = 1 until cell_counter == 81 1.times do

下面的方法生成81个
单元格
对象,每个对象都有各自不同的
,和
。它使用一种算法,根据当前生成的
单元格
更改这些属性

1.times do
部分用于跳过
内第一个循环上的
if
语句块,直到
循环,此时
单元计数器
为0。我该如何使它更优雅

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
def初始化默认单元格
单元格计数器,行,列=0,0,0
块=1
直到单元格_计数器==81
1.是的
如果单元格\u计数器==0,则中断
如果单元格\u计数器%1==0
列+=1
终止
如果单元格\u计数器%3==0
块+=1
终止
如果单元格\u计数器%9==0
列-=9
行+=1
块-=3
终止
如果单元格\u计数器%27==0
块+=3
终止
终止

@单元格I得出结论,对于每个
I=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
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=6
时,
6/3#=>2
是可被
3
整除的正数,
6/9#=>0
是可被
9
整除的正数,
6/27#=>0
是可被
27
整除的正数。然后使用这些值计算
Cell::new
的参数

关于重构/改进工作代码的问题属于。我建议不要使用
i-9*(i/9)
,而是使用
i%9
?另外,
i/3-3*(i/9)
(i%9)/3
。谢谢,@Jordan。我已经实现了这两个建议。这是如此的聪明和优雅。你是怎么想到这个的?我肯定会记住这个使用I/9,I%9的技巧,但是最后一个很难记住。有没有一个术语来形容它?你知道我能读到什么资料吗?您是否在控制台中多次尝试并出错以优化输出?此外,它应该是(0..80)。我猜你是从(1..81)开始的,忘了解释变化。有趣的是,我测试了我最初使用的两种方法,使用这个较短的方法,解算器仍然需要大约节省的时间(减少到十分之一秒)来计算世界上最难的谜题的解。我猜这种重构只对同时有大量请求的大型应用程序至关重要。谢谢你,卡里。
@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)
@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)