我使用工具在名为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
我该如何解决这个问题?
答案 0 :(得分:5)
'取向'是 place_ship 方法中的标记值。 '取向的价值'代码执行时不会改变。所以不需要检查它' ship.length'次。
place_ship 只有条件逻辑,没有别的。这是不必要的,条件逻辑可以驻留在之外。您 传入一个标志,告诉方法选择哪个路径,有条件地 。这是 条件耦合气味 。通常不会将条件参数传递给方法。对于2种选择有两种不同的方法,并恰当地命名。
您已经恰当地命名了 vertical_place_ship 和 horizontal_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
与horizontal_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;)来增加正确的变量。