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
- 处理此类事情的最佳方法是什么?
- 最初创建的
Border
实例在哪里? Cell
里面? Cell
外,Board
内class?
- 两个
Cells
如何共享一个Border
?他们每个人都有一个指向同一个实例的指针,还是两个相互复制的单独实例?
- 如果
Cell
移动到不同的位置怎么办?是否所有受影响的 Borders
重建或交换现有实例?
- 如果我想配置特定的边框,我该如何select呢?通过选择
Cell(x,y).rightBorder
? Cell(x+1,y).leftBorder
? Board.border(x,y,'right')
? (理想情况下它应该无关紧要,但也许一种方法比另一种方法有一些好处)
Borders
(甚至 Cells
)应该在工厂中创建吗?
我目前的解决方案是在每个 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),我认为不需要这样做。
这更像是一个“最佳实践”或“最佳方法”类的问题;我能够自己解决核心问题,但我想知道应该如何最好地解决这种情况。
想象一个带有方形单元格网格的二维板。每个单元格都是 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
- 处理此类事情的最佳方法是什么?
- 最初创建的
Border
实例在哪里?Cell
里面?Cell
外,Board
内class? - 两个
Cells
如何共享一个Border
?他们每个人都有一个指向同一个实例的指针,还是两个相互复制的单独实例? - 如果
Cell
移动到不同的位置怎么办?是否所有受影响的Borders
重建或交换现有实例? - 如果我想配置特定的边框,我该如何select呢?通过选择
Cell(x,y).rightBorder
?Cell(x+1,y).leftBorder
?Board.border(x,y,'right')
? (理想情况下它应该无关紧要,但也许一种方法比另一种方法有一些好处) Borders
(甚至Cells
)应该在工厂中创建吗?
我目前的解决方案是在每个 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),我认为不需要这样做。