重构控制参数

时间:2018-01-07 08:49:46

标签: ruby refactoring reek

我使用工具在名为reek的代码中查找代码气味,我遇到一个名为Control Parameter的问题

def place_ship(ship, start_position, orientation)
    @row = start_position[:row]
    @column = start_position[:column]
    ship.length.times do
        if orientation == :vertical
            vertical_place_ship(row,column,ship)
        else
            horizontal_place_ship(row,column,ship)
        end
    end
end

def vertical_place_ship(row,column,ship)
    self.grid[row][column].ship = ship
    self.grid[row][column].status = :occupied
    @row += 1 
end

def horizontal_place_ship(row,column,ship)
    self.grid[row][column].ship = ship
    self.grid[row][column].status = :occupied
    @column += 1
end

警告的内容:[

55]:ControlParameter: Board#place_ship is controlled by argument 'orientation

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:5)

'取向'是 place_ship 方法中的标记值。 '取向的价值'代码执行时不会改变。所以不需要检查它' ship.length'次。

place_ship 只有条件逻辑,没有别的。这是不必要的,条件逻辑可以驻留在之外。您 传入一个标志,告诉方法选择哪个路径,有条件地 。这是 条件耦合气味 。通常不会将条件参数传递给方法。对于2种选择有两种不同的方法,并恰当地命名。

您已经恰当地命名了 vertical_place_ship horizo​​ntal_place_ship 方法。你可以像这样重构它。

def <method_that_calls_place_ship>
// other code
    if orientation == :vertical
      vertical_place_ship(ship, start_position)
    else
      horizontal_place_ship(ship, start_position)
    end
// more code
end

def vertical_place_ship(ship, start_position)
    row = start_position[:row]
    column = start_position[:column]

    ship.length.times do
      self.grid[row][column].ship = ship
      self.grid[row][column].status = :occupied
      row += 1 
    end  
end

与horizo​​ntal_place_ship方法类似。

答案 1 :(得分:0)

无论工具反馈如何,查看您的代码,水平和水平之间的唯一不同之处。垂直大小写是否增加@rows或@columns。一个选项可能是:

def place_ship(ship, start_position, orientation)
    row = start_position[:row]
    column = start_position[:column]
    ship.length.times do
        self.grid[row][column].ship = ship
        self.grid[row][column].status = :occupied
        orientation == :vertical ? row += 1 : column += 1
    end
end

我删除了两个(相同的)方法,并且在放置每个船舶部件后,只使用了三元运算符(&#39;?&#39;)来增加正确的变量。