2017-09-20 11 views
-1

OOP 디자인에 체스 프로그램을 쓰고 있으며 코드를 리팩토링하려고합니다. 첫 번째 과제는 모든 int x 및 int y 조합을 int x 및 int y 정보가 포함 된 Pair 객체 (쌍 위치)로 그룹화하는 것이 었습니다.리팩토링 int x, int y to Pair 위치 (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

왜 두 숫자 주위에 괄호를 넣으면 마술처럼 'Point'객체가 될 것이라고 생각합니까? 'board.placePiece (new Point (4, 3), n1)'을 대신 사용해보십시오. – Andreas

+0

그것이 사용되는 방법입니까? 보다 단순하게 만드는 더 좋은 방법이 있을까요? 모든 테스트 케이스에 새로운 포인트를 두는 것은 훨씬 더 복잡한 것으로 간주됩니다. – user6792790

+0

예, 그렇기 때문에 '점'이 사용되어야합니다. --- "더 간단하게"정의하십시오. 원래 코드는 간단하게 호출 할 수 있었지만, 왜 그렇게 대답하지 않았습니까? – Andreas

답변

2

예, 현재 수행중인 작업은 "리팩토링"입니다. 기존 코드를 가져 와서 변경하고있는 것입니다.

Point (지점 간 이동, 지점에서 보드 셀 확인 등)을 사용한 다음 개별 x/y 매개 변수를 사용하여 아이디어를 표현하는 것이 일반적으로 더 쉽습니다. 당신은이 작업을 수행 할 보드 (A1, A2 등) 사용을 대신, 설명 된 enum를 만들 수

그러나 이것은 단지 코드 더러운하게 ... 한 - 검증 및 두 - 단순화

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

} 

동안 t 들어 그의 초기 설정이 컸기 때문에 나머지 코드는 훨씬 간단 해졌습니다.

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 '의 의미가 있습니다. 또한 메서드를 호출 할 때 보조 개체를 만들 필요가 없으므로 코드 정리에 대한 요구 사항을 충족합니다. '정적 점 ...'으로 동일한 작업을 수행 할 수는 있지만 그 중 하나입니다. 우리가'enum'을 얻은 이유 : P – MadProgrammer