重构int x,int y到Pair位置(Java)

时间:2017-09-20 22:49:40

标签: java refactoring

我正在编写OOP设计的国际象棋程序,我正在尝试重构我的代码。第一个挑战是将所有int x和int y组合分组为包含int x和int y信息的Pair对象(Pair位置)。

所以我的董事会课看起来像

public class Board {

    public static final int NUM_OF_ROWS = 8;
    public static final int NUM_OF_COLS = 8;

    int x, y;

    //Initialization of NUM_OF_ROW x NUM_OF_COLS size of 2d Piece array
    Piece[][] board = new Piece[NUM_OF_ROWS][NUM_OF_COLS];

    public Piece getPiece(int x, int y) {

        return board[x][y];

    }
   ....

原本。

我试图改变

int x, y;

看起来像

int x, y;
Point position = new Point(x, y)

所有方法都有新参数

public Piece getPiece(int x, int y) to public Piece getPiece(Point pos)

public void placePiece(int x, int y, Piece pieceToPlace) to public void placePiece(Point pos, Piece pieceToPlace)

但我遇到的问题是在测试中。

我的一个测试用例看起来像

public void correctMovementTest() {
    Knight n1 = new Knight(Player.UP);
    board.placePiece(4, 3, n1);
    board.movePiceTo(2, 2, n1);
    assertEquals(board.getPiece(4, 3), null);
    assertEquals(board.getPiece(2, 2), n1);
}

当我刚使用int x int y参数时。基本上将工件放置到x = 4和y = 3并将其移动到x = 2和y = 2并检查它是否已正确移动。

但现在当我尝试将其更改为

public void correctMovementTest() {
    Knight n1 = new Knight(Player.UP);
    board.placePiece((4, 3), n1); // changed
    board.movePiceTo((2, 2), n1); //changed
    assertEquals(board.getPiece((4, 3)), null); // changed
    assertEquals(board.getPiece((2, 2)), n1); // changed
}

它给我一个错误说"参数的左侧必须是一个变量"我真的不明白。

我假设制作一个像

这样的新Point对象
Point pos = new Point(4,3);

会起作用,但这只会使代码变得更脏,而且不会重构。

有人可以纠正我的方法吗?

1 个答案:

答案 0 :(得分:2)

是的,您正在做的是"重构",您正在接受现有代码并进行更改。

使用enum表达您的想法通常更容易(移动点到点,在点检查板单元格等),然后使用单独的x / y参数。

  

但这只会让代码更脏......

你可以创建一个A1来描述董事会(A2public enum Square { A1(new Point(0, 9)), A2(new Point(0, 8)), A3(new Point(0, 7)), A4(new Point(0, 6)), A5(new Point(0, 5)), A6(new Point(0, 4)), A7(new Point(0, 3)), A8(new Point(0, 2)), A9(new Point(0, 1)), A10(new Point(0, 0)); // ... The rest of the board private Point point; private Square(Point point) { this.point = point; } public Point getPoint() { return point; } } 等)并使用它来代替,这将执行两个动作,一个 - 验证和两个 - 简化< / p>

例如

movePieceTo(piece, Square.A3)

虽然这是一个最初的大型设置,但它使代码的其余部分更加简单......

Square

它也是自我记录:)

由于Point还维护有关public void movePieceTo(Piece piece, Square square) { Point point = square.getPoint(); //... } 本身的信息,因此您无需进行进一步的转换

{{1}}

粗略的想法。