0

是存储冗余信息(可以从现有数据生成)还是在每次需要访问时转换现有数据更可取?

我在下面尽可能地简化了我的具体问题,希望提供的答案可以作为未来的参考材料。

例子:

假设我们开发了一个程序,将数据放入网格上的 Squares(如井字游戏之类的超级描述性游戏)并分配各种细节,并为每个细节分配一个唯一的标识号:

也被称为世界上最简单的数独谜题。

在整个程序中,我们经常根据正方形的 X 和/或 Y 坐标执行逻辑(连续检查 3 个),而其他时候我们只需要 ID(可能访问 "SquareName[ID]" 处的字符串)——我们不确定这两者中哪一个更频繁地被访问,但这是一场相当激烈的竞争。

到目前为止,我们只是将 ID 存储在 square 类中,并在只需要 X 或 Y 时使用一些简单的公式对其进行转换。假设我们特别想获得一个正方形的坐标:

int CurrentX = (this.Square.ID - 1) % 3) + 1;  // X coordinate, 1 through 3
int CurrentY = (this.Square.ID + 1) / 3;       // Y, 1 through 3

由于正方形在设置后不会四处移动或更改 ID,部分我认为将所有 3 个值存储在 Square 类中会更简单,但我的另一部分对冗余感到畏缩,因为访问 X 和 Y 已经很容易了足以从现有 ID 计算。

(注意,这个程序本身不是非常占用内存或资源,网格的大小也不会变得更大,所以主要取决于哪个选项是更好的实践或经验法则。)

你会怎么办?

4

2 回答 2

1

根据经验,对于数据是读/写的系统,存储您的基本数据没有冗余

当性能或其他考虑成为一个实际问题时,您应该根据需要进行非规范化。(即等待它成为一个问题,不要过度预优化)。

您的目标应该是尽可能地维护最易维护的代码。这通常意味着编写尽可能少的代码。拥有额外的代码来维护数据点的冗余副本将使您的代码更加脆弱。

于 2012-08-07T18:57:19.727 回答
0

如果这些值可以在创建时确定然后不再更改,我会选择在构造函数中填充的变量。它不是多余的信息,因为它没有存储在其他任何地方,但这不是我的主要观点。在阅读我的代码时,我通常期望每当在请求时计算某些内容时,它可能会根据请求而改变。很容易在源中找到填充字段和更改字段的点,特别是如果它永远不会更改,但在查看某些总是返回相同结果的计算时,您可能会感到有些困惑,因为它是变量不能改变,想知道你是否只是错过了一个案例,或者这真的是静态的。此外,使用描述性变量名称,您可以摆脱注释。

于 2012-08-07T18:56:32.583 回答