2016-10-13 4 views
1

체스 판과 조각에 인터페이스가 삽입 된 코드가 있습니다. DiagonalDirections는 열거 형입니다. 여태까지는 그런대로 잘됐다. 의존성을 주입하지 않으며 숨겨진 의존성을 사용하지도 않습니다.인터페이스로 숨겨진 종속성을 해결하는 방법

private void addToAllowedPositions(IChessboard chessboard, IPiece piece, DiagonalDirections direction) 
    { 
     int horizontalIndex = piece.Position.IndexHorizontal; 
     int verticalIndex = piece.Position.IndexVertical; 
     while (AreIndexesValid(setHorizontalIndexDirection(direction, ref horizontalIndex), setVerticalIndexDirection(direction, ref verticalIndex))) 
     { 
      IPosition currentPosition = new Position(horizontalIndex, verticalIndex); 
      IPiece currentPiece = chessboard.GetPiece(currentPosition); 
      if (currentPiece == null) 
       { 
        allowedPositions.Add(currentPosition); 
       } 
      else if (currentPiece.Color != piece.Color) 
       { 
        allowedPositions.Add(currentPosition); 
        break; 
       } 
       else break; 
     } 
    } 

문제는이 코드 라인이다 :

IPosition currentPosition = new Position(horizontalIndex, verticalIndex); 
난 정말 내가 여기에 인터페이스를 사용하는 방법을 모르는

? 매번 새로운 직책을 만들어야합니다. 그것은 내가 어떻게 고립시키는 지 모른다는 나의 유일한 의존이다. 나는 또한이 코드 조각을 단위 테스트하고 싶을 때 문제가있다. Position 클래스에서 변경된 사항이 있으면 기존의 단위 테스트에서 즉시이 메서드에도 반영됩니다.

+0

당신은 새로운 위치를 만드는 공장을 사용할 수 있습니다. POCO는'Position'입니까? – Nkosi

+0

예. 오직 두 개의 속성 만 - 수평 및 수직. 공장 사용 방법? 아마도 당신은 모범을 보았을 것입니까? – FrenkyB

+0

대신 수동으로 위치를 생성하는 대신 생성을 다른 것으로 위임합니다. 위치를 생성하는 것이 유일한 작업 인 새 팩토리 서비스를 만들거나 기존 인터페이스 중 하나에서 팩토리 메소드를 사용할 수 있습니다. 이미 체스 보드 인터페이스에서 팩토리 메소드를 사용하여 위치를 만들 수 있다고 대답 한 사용자가 있습니다. – Nkosi

답변

2

당신은 IChessboard 인터페이스 팩토리 메소드를 추가 할 수 있습니다

IPosition currentPosition = chessboard.CreatePosition(horizontalIndex, verticalIndex); 
+0

체스 판과 Position 사이의 의존성을 의미하지 않을까요? – FrenkyB

+1

체스 보드 구현은 표준 'Position' 클래스이든 다른 것이 든 리턴 할'IPosition'의 구현을 선택합니다. 그러나 'IPosition'이 숫자의 쌍일뿐 실제 동작이없는 경우 실제로 필요하지 않습니다 인터페이스가되어야한다. –

관련 문제