Class 两个单元格之间共享边框的结构或设计模式

Class structure or design pattern for a shared border between two cells

这更像是一个“最佳实践”或“最佳方法”类的问题;我能够自己解决核心问题,但我想知道应该如何最好地解决这种情况。

想象一个带有方形单元格网格的二维板。每个单元格都是 class.

的独立实例

这将是伪代码:

class Board {
    int width;
    int height;
    Array cells;
}

class Cell {
    Board parent;
    int x;
    int y;
    int value;
}

(为了让这个例子更清楚一点:假设这是一个数独游戏,每个单元格都有一个值。)

现在,虽然每个 Cell 都是独立的,但有些 Cells 共享边界。假设此边框也是它自己的 class,因为它可以单独配置(例如,一个单元格的顶部边框可能具有不同的颜色、样式或厚度)。

现在,如果我扩展伪代码来适应这个:

class Cell {
    ...
    Array borders;
}

class CellBorder {
    Cell parent;
    int direction; // 0=top, 1=right, 2=bottom, 3=left
    Style style; // thickness, style, color, etc.
}

我的问题是:显然,两个相连的 Cells 共享一个 Border - 处理此类事情的最佳方法是什么?

我目前的解决方案是在每个 Cell 中只包含“顶部”和“左侧”Borders,同时将“底部”和“右侧”Border 链接到分别是邻居“顶部”和“左侧”Borders

但总的来说,什么是好的和灵活的方法? Border 处理是否会转交给 Board 而不是 Cells?我敢肯定,这类问题一定很常见,并且有一些最佳实践,甚至可能是一个非常适合的设计模式。

答案1:边框class必须在板class中创建。想象一下两个 Cell 之间的关系。想象一下,我们将电路板、边框和单元格部分拆分为层。基础部分将是董事会部分。然后,根据border和border border形成的cell,决定了cell的部分,应该来了。其实这里的cells是动态的,应该根据border和board部分的方式取值。

问题2:共享两个Cell边界应该需要两个实例互相复制。

问题3:如果电池是从其他电池购买的,则必须更换现有电池。

问题4:要改变一个特定的计划,协调并为每个边界方向赋值是有帮助的。例如;设 y 的单元格数为 10。可以给a1+y,b2+y,c3+y,d4+y,e5+y这样的值,这样就可以很容易的干预

问题5:应该从响应性和可开发性的角度来创建。

Of course, my answers are a collection of my own approaches. I hope that will be useful.

免责声明:由于您正在寻找面向对象世界中的良好实践,因此我的回答将面向领域驱动设计、对象思维和不变性。

Where is the Border instance initially created? Inside the Cell? Outside the Cell, in the Board class?

提倡一个Cell在创建自己的时候请求一个已经构造好的CellBorder的数组。分别请求每个边框的每个字段(每个边框的每个方向和样式)会使 Cell 创建混乱。

How would two Cells share a Border? Do they each have a pointer to the same instance, or two separate instances that just copy each other?

如果CellBorder是不可变的,那么某些实例是否被多个单元共享并不重要。 如果 CellBorder 是可变的,那么更喜欢为每个 Cell 创建新的 CellBorder,以避免在 Board(或任何 Cell)更新时产生令人讨厌的副作用一些 CellBorder.

What if a Cell is moved to a different position? Are all affected Borders reconstructed or existing instances swapped?

那么Cell的坐标就变了。它对其边界有什么影响?

If I want to configure a specific Border, how do I select it? By picking Cell(x,y).rightBorder? Cell(x+1,y).leftBorder? Board.border(x,y,'right')? (Ideally it shouldn't matter, but perhaps there is some benefit to one method over the other)

如果 Cell 不在 Board 中就无法存在,请确保将 Cell 的数组封装在 Board 中,并向 Board 添加一些行为Board 更改现有单元格的边框。示例方法调用可以是 board.ChangeBorder(x, y, newStyle)

Should Borders (and perhaps even Cells) be created in a factory?

如果您在实例化 Board 及其所有 Cell 时遇到一些性能问题,则可能会出现这种情况。对于数独游戏(假设为 9x9),我认为不需要这样做。