不恰当的亲密关系和特征嫉妒之间有什么区别?

Che*_* OT 15 language-agnostic refactoring

两种气味都在福勒的书"重构"中有所描述.

我知道这些气味的含义是:

  • Feature Envy是一个对象中的一个方法在另一个对象上调用了六个获取方法.
  • 不恰当的亲密关系是两个班级经常依赖于彼此的私人部分.

看起来两种气味都表明一个对象的一部分太多依赖于另一个对象.

有人可以解释这两种气味之间的主要区别吗?

Dav*_*uth 14

你描述得很好.

不恰当的亲密关系意味着妥协其他类的封装,例如直接访问不应直接访问的实例变量.很坏.修复抓取类只使用受感染类的公共功能,如果可能,更改受损类,以便其他类无法获取其私有功能.

Feature Envy是指一个方法使用另一个类的公共特征而不是它自己的公共特征.没有那么糟糕,因为(假设其他类的公共功能可以安全使用),它不会导致错误.但它确实导致设计纠缠在两个类之间.通过向令人羡慕的类添加更高级别(更好抽象的)公共特性,或者将方法从羡慕的类移动到令人羡慕的类来修复,以便羡慕的类具有较少的调用方法.

  • 我认为值得强调的是,不恰当的亲密关系不仅仅是访问私人会员.这意味着在例如C#中,除非你使用反射,否则你根本不必担心它.一般来说,一个类取决于另一个类的实现细节.例如,知道由于某些私有实现细节需要以特定顺序调用两个公共方法,或者访问属性以确保已初始化属性延迟加载的对象. (4认同)