是否最好存储冗余信息(可以通过现有数据生成),或者在每次需要访问时转换现有数据?
我尽可能地简化了我的具体问题,希望所提供的答案可用作未来参考资料。
示例:
假设我们开发了一个程序,将数据放入网格中的Squares(就像Tic-Tac-Toe的超级描述性游戏之类的东西)并分配各种细节,并为每个细节分配一个唯一的标识号:
在我们的程序中,我们经常根据正方形的X和/或Y坐标执行逻辑(连续检查3个),有时我们只需要ID(也许可以访问“SquareName [ID]”处的字符串) ) - 我们并不确定这两个中哪一个被更频繁地访问,但它是一个相当紧密的竞争。
到目前为止,我们只是简单地将ID存储在方形类中,并且只要需要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进行计算。
(注意,这个程序本身不是内存或资源密集型,网格的大小也不是很大,所以它主要取决于哪个选项是更好的做法或经验法则。)
你会做什么?
答案 0 :(得分:1)
根据经验,对于可读/写数据的系统,存储基本数据而不会出现冗余。
当性能或其他考虑成为实际问题时,您应该根据需要进行非规范化。 (即等待它成为一个问题,不要过度预先优化)。
您的目标应该是可维护性最强的代码。这通常意味着编写尽可能少的代码。拥有额外的代码来维护数据点的冗余副本将使您的代码更加脆弱。
答案 1 :(得分:0)
如果这些是可以在创建时确定的值,然后不再更改,我会选择在构造函数中填充的变量。它不是多余的信息,因为它不存储在其他任何地方,但这不是我的主要观点。在阅读我的代码时,我通常希望无论何时在请求时计算某些内容,它都可能会根据请求进行更改。很容易在源中填充字段以及更改字段的位置,特别是如果它永远不会更改,但在查看某些计算时可能会稍微混淆,因为它会返回相同的结果,因为它是变量无法改变,并想知道你是否只是错过了一个案例,或者这是非常静态的。 此外,使用描述性变量名称,您可以删除注释。并不是说我一般都不打算评论,但是甚至不需要评论的源代码对于易于理解的代码来说是一个非常好的保存信号,可能(/应该)是你的目标。