如何避免自定义类的空实例化?

时间:2019-03-28 08:50:25

标签: c# oop chess

我正在制作一个国际象棋程序,并试图优化我的代码,其中有一个抽象基类ChessPiece,它具有基本属性BoardColor,和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设计?

编辑:
添加了有关如何添加片段的代码

1 个答案:

答案 0 :(得分:0)

您可以将电路板视为一个系统,并将其上的部件视为子系统。它奇怪的关注点分离和耦合使子系统知道父系统,甚至改变了它的状态。

在我看来,一种更干净的方法是,董事会增加部分(或董事会上方的系统)。

阅读Separations of concernsHigh cohesion – Low coupling

编辑:棋子应该只包含有关棋盘上如何移动的信息。它可以实际移动到板上或板上的系统