1

我收到以下错误reek

lib/actions.rb -- 5 warnings:
  Actions#move_forward calls (self.x_coordinate + unit) twice (DuplicateMethodCall)
  Actions#move_forward calls place((self.x_coordinate + unit), self.y_coordinate, self.direction) twice (DuplicateMethodCall)
  Actions#move_forward calls self.direction 5 times (DuplicateMethodCall)
  Actions#move_forward calls self.x_coordinate 4 times (DuplicateMethodCall)
  Actions#move_forward calls self.y_coordinate 4 times (DuplicateMethodCall)

下面是方法 move_forward

def move_forward(unit = 1)
        case self.direction
        when Direction::SOUTH
            place(self.x_coordinate, self.y_coordinate - unit, self.direction)
        when Direction::EAST
            place(self.x_coordinate + unit, self.y_coordinate, self.direction)
        when Direction::NORTH
            place(self.x_coordinate, self.y_coordinate + unit, self.direction)
        when Direction::WEST
            place(self.x_coordinate - unit, self.y_coordinate, self.direction)
        else

        end
    end

我想删除所有错误,尤其是重复的方法调用。在这种情况下,解决所有警告的最佳方法是什么?

4

3 回答 3

3

触发reek报告的代码“气味”是您正在调用一个设置多个实例变量状态的方法,而实际上发生的变化要少得多(例如方向根本没有变化)。该place方法设置了所有内容,这使得使用它进行小的更改过于冗长。

这可能会将该方法分解为导致报告的问题较少:

def move_forward(unit = 1)
  case direction
  when Direction::SOUTH
    move_relative( 0, -unit )
  when Direction::EAST
    move_relative( unit, 0 )
  when Direction::WEST
    move_relative( -unit, 0 )
  when Direction::NORTH
    move_relative( 0, unit )
  end
end

def move_relative( delta_x, delta_y )
  place( x_coordinate + delta_x, y_coordinate + delta_y, direction )
end

(我也无法抗拒“修复”你的 WEST 运动,抱歉,如果那真的是错误的)

于 2013-08-26T23:00:31.163 回答
2

也许是这样的?

def move_forward(unit = 1)
  x, y, d = x_coordinate, y_coordinate, direction
  case d
  when Direction::SOUTH
    place(x, y - unit, d)
  when Direction::EAST, Direction::WEST
    place(x + unit, y, d)
  when Direction::NORTH
    place(x, y + unit, d)
  else
  end
end

我发现有关“重复调用”的抱怨self.x_coordindateself.y_coordinate有点误报,但每条路径只调用一次。

于 2013-08-26T22:51:29.577 回答
2

你似乎没有使用面向对象的力量

使用现有对象的力量的解决方案怎么样?

def move_forward(by_how_much = 1) 
  move_relative(*direction.change_in_coords(by_how_much))
end

def move_relative(delta_x, delta_y)
  place( x_coordinate + delta_x, y_coordinate + delta_y, direction )
end

class Direction::SOUTH
  def self.change_in_coords(unit = 1)
    [0, -unit]
  end
end
于 2013-10-04T07:11:47.150 回答