我正在制作一个国际象棋程序,并试图优化我的代码,其中有一个抽象基类ChessPiece
,它具有基本属性Board
,Color
,和StartPosition
。现在,在此基类构造函数中,我添加了实例化的特定部分。这是那部分:
// ChessPiece.cs
protected ChessPiece(Square startPosition, PieceColor color, Board board)
{
this.StartPosition = startPosition;
this.CurrentPosition = startPosition;
this.Color = color;
this.Board = board;
this.Board[startPosition] = this;
// ↑
// I add the pieces inside the indexer assignment (e.g. pieces.Add(piece)...)
}
这是我在Board
类中添加片段的方式:
// Board.cs
public ChessPiece this[Square square]
{
get { ... }
set
{
// simplified version of how I add pieces
this._pieces.Add(value);
}
}
现在,我以这种方式设置板子:
// Game.cs
private void PopulateBoard()
{
this.CreateStandardPieces(PieceColor.White);
this.CreateStandardPieces(PieceColor.Black);
}
private void CreateStandardPieces(PieceColor color)
{
// rook
new Rook(aSquare, color, this.Board);
// more initializations here
}
样本实例new Rook(...)
在我看来很奇怪,就像它是一个空实例一样。实际发生的是每当我实例化一块时,它就会自动添加到板上,而不是看起来是“空实例”。
现在我的问题是,我应该如何改进我的设计,以避免实例化为这种样子? 还是该设计被认为是好的OOP设计?
编辑:
添加了有关如何添加片段的代码
答案 0 :(得分:0)
您可以将电路板视为一个系统,并将其上的部件视为子系统。它奇怪的关注点分离和耦合使子系统知道父系统,甚至改变了它的状态。
在我看来,一种更干净的方法是,董事会增加部分(或董事会上方的系统)。
阅读Separations of concerns
和High cohesion – Low coupling
编辑:棋子应该只包含有关棋盘上如何移动的信息。它可以实际移动到板上或板上的系统