【问题标题】:Is there an established name for this anti-pattern?这种反模式有一个既定的名称吗?
【发布时间】: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


【解决方案1】:

基本上违反don't repeat yourself

每条知识在系统中都必须有一个单一的、明确的、权威的表示。


违反 DRY 通常称为 WET 解决方案,通常代表“每次都写”、“所有内容都写两次”、“我们喜欢打字”或“浪费每个人的时间”。

【讨论】:

  • 我只看到用于代码本身的短语,而不是数据结构,但它对我来说很有意义!
  • @Eneroth3:原理是一样的。在数据库中,这将违反normalization
猜你喜欢
  • 1970-01-01
  • 2010-09-09
  • 2010-11-21
  • 1970-01-01
  • 2012-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
相关资源
最近更新 更多