2017-09-20 4 views
-1

私はOOPデザインでチェスプログラムを書いています。私は自分のコードをリファクタリングしようとしています。最初の課題は、すべてのint xとint yの組み合わせをint xとint y情報を含むPairオブジェクト(ペア位置)にグループ化することでした。リファクタリングint x、int yからペア位置(Java)

だから私のボードクラスは、もともと

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]; 

    } 
    .... 

のようなものが見えました。

そして私は

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) 

新しいパラメータを持つように

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

そして、すべてのメソッドのように見えるように

int x, y; 

を変更しようとしましたが、私が持っていた問題がでましたテスト。私のテスト例

一つは、私はint型のx int型のyのパラメータを使用

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); 
} 

のように見えました。基本的にピースを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 pos = new Point(4,3); 

のような新しいPointオブジェクトを作成すると仮定していますが、これは単にコードが汚くなり、リファクタリングされていません。

私のアプローチを修正してもらえますか?

+1

なぜ2つの数字の周りにかっこを入れると、魔法のように 'Point'オブジェクトになると思いますか?代わりに 'board.placePiece(new Point(4、3)、n1)'を試してみてください。 – Andreas

+0

それはそれがどのように使用されるのでしょうか?よりシンプルにするためのより良い方法があるだろうか?すべてのテストケースに対して新しいポイントを設定することはさらに複雑になると考えられます。 – user6792790

+0

はい、そういう意味で「ポイント」が使われるはずです。 ---「よりシンプル」を定義します。元のコードは簡単に呼び出すことができましたが、なぜそれは答えではありませんか? – Andreas

答えて

2

はい、あなたがしているのは「リファクタリング」です。既存のコードを使用して変更しています。

Point(ポイントツーポイントの移動、ポイントでのボードセルのチェックなど)、次に個々のx/yパラメータを使用してアイデアを表現する方が簡単です。次の2つのアクションを実行することになりボード(A1A2、など)および使用の代わりに、説明enumを作成することができ

が、これは単にコード汚れになり...、1 - バリデーション二 - たとえば簡略化

public 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; 
    } 

} 

トン一方彼は当初は大きな設定だったので、コードの残りの部分はずっと簡単になりました...

movePieceTo(piece, Square.A3) 

また、自己文書化:)もPoint自体に関する情報を保持し

Squareので、あなたはさらなる変換目安として

pubic void movePieceTo(Piece piece, Square square) { 
    Point point = square.getPoint(); 
    //... 
} 

を行う必要はありませんです

+0

明確な答えをありがとう。だから、これはint xとint yをポジションとして使うよりも優れたアプローチだと思いますか? – user6792790

+0

@ user6792790これは、意見の問題です。ボード上で有効な値であることを確認するためには、 'x/y'と' Point'の両方が有効である必要があります。読むのがはるかに簡単です。「Square.A1」はコードを読むときに意味があり、「0、9」です。また、メソッドを呼び出すときにセカンダリオブジェクトを作成する必要がないため、コードをクリーンアップするという要件も満たしています。静的なPoint ...で同じことを達成できますが、それは私たちが 'enum'を得た理由:P – MadProgrammer

関連する問題