Ruby 如何在此算法中重构连续、独立的if语句?
下面的方法生成81个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
单元格
对象,每个对象都有各自不同的行
,列
,和块
。它使用一种算法,根据当前生成的单元格
更改这些属性
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)