我在阅读一篇关于 PHP 5.4.0 的新功能的文章时,发现其中最受期待的一个是Traits。
仔细研究这些Traits,我发现它们看起来只是编译器辅助的复制粘贴,并且是使用组合的方法,非常类似于广为人知的策略模式,其利用了“优先使用组合而不是继承”的设计原则。
我的理解正确吗?
使用这些trait相对于仅使用组合设计模式提供哪些其他优点使它们值得使用呢?
我在阅读一篇关于 PHP 5.4.0 的新功能的文章时,发现其中最受期待的一个是Traits。
仔细研究这些Traits,我发现它们看起来只是编译器辅助的复制粘贴,并且是使用组合的方法,非常类似于广为人知的策略模式,其利用了“优先使用组合而不是继承”的设计原则。
我的理解正确吗?
使用这些trait相对于仅使用组合设计模式提供哪些其他优点使它们值得使用呢?
在更广义的意义上,你需要仔细考虑组合所赋予的含义。特征是一种分解和组合的机制,可以用于代码复用(DRY)的适当单元的分解。
特征是一种组合机制,可以与类组合使用。许多特性实现也允许对特性进行组合。
GOF的口号是“优先选择组合而非继承”。
所有基于类的语言默认情况下都偏爱继承。对象只能从其类或类继承链中较高的类获取行为。当然,你可以通过不同的方式实现相同的结果。例如,你可以创建一个 Manager 类(例如 LayoutManager),然后将其引用添加到任何具有可放置行为/布局特征的类中,并添加没有其他作用的函数,只需调用管理器的方法即可。
public function doSomething() { return layoutManager.doSomething(); }
特征“组合”(它只是类方法级别的包含),发生在编译时,而您谈论的组合是在运行时发生的。
当您进行该组合时,特征已经存在。
由于PHP中的单一继承以及常见的静态实用程序类阻碍了某些设计目标,因此特征提供了另一种方式来塑造您的实现,并允许减少代码重复。
特征更像是行为,而不是继承或装饰。
它与策略模式不同,因为您可以定义通用算法,而每个具体的策略对象都有不同的算法。
此外,它更像是一种“水平”的行为继承,而不是具有行为规范的“垂直”继承。
这个问题非常有趣。