10

这是一个开放式问题,但我想征求 SO 社区关于 Traits 的一些意见;你认为 Squeak/Pharo 中的 Traits 是一件好事,还是应该远离它们而使用组合和委托?我问是因为虽然我知道如何使用它们(感谢 Pharo 的书),但我不确定使用它们的可接受程度,或者在哪里可以使用它们,在哪里不可以。

4

2 回答 2

7

我不喜欢特质,因为它们在代码中引入了强依赖性。这些依赖关系可能很明显(一个导入特征的类,一个期望方法的特征),但也非常微妙(一个隐藏超级方法/实例变量的特征)。此外,没有足够的工具支持特征。

根据我的经验,委托在像 Smalltalk 这样的动态类型的面向对象语言中提供了更好、更可重用的设计。

于 2010-07-12T06:57:36.533 回答
2

事情有其优点和缺点。Lukas 正确地提到了许多缺点:

  • 在代码中引入强依赖。
  • 没有足够的工具支持。

虽然第二个可能有一天会消失,但第一个不会。

trait 的目的是防止发生代码重复,当两个类不共享 Object 以外的超类时,共享一个实例方法。现在,有时委派可以解决这个问题,但通常不能。所以,特质的优点是:

  • 减少代码重复。

我在这里的判断是缺点超过了。我认为,从今天到永远,代码重复肯定会发生。如果委托不起作用,我什至可以想象代码重复并不是那么有害,因为它通常先于复制的代码片段的不同演变。

我认为,截至目前,最好的做法是自动跟踪代码重复,并始终监控一端何时发生变化而另一端没有变化。我目前正在编写一个工具来跟踪此类链接,甚至跨存储库。当它准备好时,我会在我的博客中报告它。

于 2010-07-22T16:06:16.253 回答