2016-10-13 1 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

はい、そうです。ただ2つのプロパティ(水平と垂直)。工場の使い方おそらくあなたは例がありますか? – FrenkyB

+0

ではなく、手動で位置を作成する代わりに、作成を他のものに委譲します。ポジションを作成することが唯一の仕事である新しいファクトリサービスを作成するか、既存のインタフェースの1つにファクトリメソッドを持たせることができます。ある人は、チェス盤のインターフェイス上にファクトリメソッドを作成してポジションを作成できるとすでに回答しました。 – Nkosi

答えて

2

あなたはIChessboardインターフェイスにファクトリメソッドを追加することができます。

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

チェス盤とポジションの依存関係はありませんか? – FrenkyB

+1

チェスボードの実装は、標準の 'Position'クラスなのかどうかを返す' IPosition'の実装を選択しますが、 'IPosition'が単に数字のペアで実際の振る舞いがない場合、実際には必要ありませんインタフェースであること。 –

関連する問題