You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

存储可计算冗余属性的代码反模式是否有公认既定名称?

你观察得太精准了!这种把可通过已有数据实时推导出来的值,硬作为冗余属性存储的做法,确实是公认的反模式,它通常被称为冗余数据(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 17:07:26