【发布时间】:2020-02-19 13:51:50
【问题描述】:
我经常看到对数据使用冗余属性的代码,而其中一个值可以从另外两个值中即时计算出来。对我来说,这是一个明显的反模式,因为它使代码的进一步工作变得更加困难。每次您更改一个值时,您都应该知道它与其他值的关系并更改它们。如果你把这个搞砸了,就会出现一个模棱两可的情况,你不知道哪些值是正确的,哪些是不正确的。
但是,我不知道这是否是一个具有既定名称的“已知”反模式。
# Bad
class Rectangle
attr_accessor: height
attr_accessor: width
attr_accessor: ratio
def initialize
@height = 1
@width = 1
@ratio = 1
end
end
# 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,但记住你是从哪个值派生出来的,同时检查这些值是否发生了变化。) -
@DevSolar 通常很少有编辑,当它所依赖的值之一被更新时,您可以只更新缓存。但这无论如何都不能解决依赖流动性问题。因此,有时您还需要跟踪哪些值被认为是“独立的”,哪些值被认为是“缓存的”,并且它会根据用户设置的内容而变化。
-
@Spencer:我不太明白你在说什么。一方面编辑很少见,但另一方面,一个值实际上取决于什么是不断变化的,即 X 有时是 A/B,有时是 A*C?听起来对我来说很糟糕......(无论如何,我想我们在这里分心了......)
标签: anti-patterns