存储可计算冗余属性的代码反模式是否有公认既定名称?
你观察得太精准了!这种把可通过已有数据实时推导出来的值,硬作为冗余属性存储的做法,确实是公认的反模式,它通常被称为冗余数据(Redundant Data)反模式,也经常和**数据不一致(Data Inconsistency)**问题绑定在一起。
正如你所说,这种写法的维护成本高得离谱:每次修改height或者width时,开发者必须时刻记得同步更新ratio,只要有一次疏忽,对象里的数据就会出现矛盾——你根本说不清到底是ratio错了,还是height/width错了,排查这类bug简直是噩梦。
咱们用你给出的例子再拆解下:
反模式示例(Bad)
class Rectangle attr_accessor :height attr_accessor :width attr_accessor :ratio def initialize @height = 1 @width = 1 @ratio = 1 end end
这里的ratio完全是多余的——它本质上就是width除以height的结果,但硬存在实例变量里。初始化时没问题,但如果之后有人做了rect.height = 2却忘了更新ratio,那rect.ratio还是1,和实际应该的0.5完全不符,数据直接“脏”了。
正确写法(Good)
class Rectangle attr_accessor :height attr_accessor :width def initialize @height = 1 @width = 1 end def ratio @width.to_f / @height end end
把ratio改成方法,每次调用时都用当前最新的width和height计算,从根源上避免了数据不一致的问题——你只管修改height或width,ratio永远是准确的,维护起来轻松太多。
小补充:如果某个派生值的计算成本极高(比如涉及海量数据或复杂运算),可以考虑用**缓存(Memoization)**来优化性能,但这是有明确场景的优化手段,和无意义的冗余存储完全不同。比如你可以在依赖值变化时清空缓存,确保缓存的结果始终和源数据一致,这才是合理的做法。
内容的提问来源于stack exchange,提问作者Eneroth3
相关产品推荐
相关产品推荐

