【问题标题】:How do Mixins differ from Policy Oriented Design in C++Mixins 与 C++ 中的面向策略设计有何不同
【发布时间】:2017-01-14 05:39:37
【问题描述】:

我阅读了各种试图用 C++ 解释 Mixin 的资料。

他们似乎都在解释 Mixin 的应用,这些应用看起来不过是标准的面向策略的设计。

Link-1Link-2

所以我的问题是:Mixins 是 Policy Oriented Design 的同义词,还是 Mixins 及其在 C++ 中的应用还有更多?

【问题讨论】:

    标签: c++ mixins c++-concepts


    【解决方案1】:

    你链接到我写的一篇文章(思考自下而上),所以我想我会插话。

    基于策略的设计和 C++ 中的 Mixin 之间的相似之处在于,最终定义的类将继承自它被参数化的类。它们的不同之处在于,Mixins 形成一个链,因此它们是组合的,而策略在某种程度上是独立的。您可以将 Mixins 视为应用单个策略并且该策略具有策略的情况(注意递归以形成策略链)。

    对我来说,Mixins 的强大之处在于 MixinA 可以与 Base 交互,而如果 MixinA 和 Base 是独立的策略,它们就不能交互。这将使模式适合不同的情况。

    【讨论】:

    • 这个混合和策略之间区别的答案似乎与@skypjack 的答案不一致?想知道是否有任何遗漏或误解?
    • @dragonxlwang 我非常理解这个问题。类的策略是不同的/解耦的,并且是继承层次结构中的兄弟,而 mixin 具有基/派生关系并且是高度耦合的。
    【解决方案2】:

    它们是类似的解决方案。
    无论如何,它们通常旨在解决略有不同的问题。

    考虑以下类:

    template<PolicyDoX PX, PolicyDoY>
    struct PolicyBased {
        void doSomething() {
            // ... A few operations
            PX::doX();
            // ... Some other operations
            PX::doY();
        }
    };
    

    这是一种基于策略的简单方法。关键概念是类期望策略已经给出(让我说)接口。这是实现的问题(他们将如何做到这一点),而不是实际提供的内容。
    换句话说,该类的用户在功能方面不受给定策略的影响,因为PolicyBased 在任何情况下都提供相同的接口。

    另一方面,考虑一下:

    struct X { int i; void f() {} }
    struct Y { char c; void g() {} };
    struct Z { void h() {} };
    
    template<typename... T>
    struct Mixin: T... {}
    
    using Full = Mixin<X, Y, Z>;
    using Partial = Mixin<X, Z>;
    

    在这种情况下,当您使用一组不同的组件时,mixin 会更改它的界面。该类本身不期望任何给定的功能集,只是将它们提供给最终用户。
    因此,可以将 mixin 视为一个桶,您可以在其中放置几乎所有组件以获取您喜欢的类型,并且该类型将具有严格依赖于所选组件的接口。

    总结一下:

    • 策略定义了如何做某事,但不影响接受它们的类的接口。

    • Mixins 同意创建一个具有自己接口的新类型,该接口由用于定义 mixin 的组件集给出。

    【讨论】:

    • 我仍然没有看到您在“混合”示例中给出的它与面向策略的设计有何不同。 X、Y 和 Z 似乎只是称为“混合”的复合材料的策略
    • @JuliaSterbs mixin 类并不期望它的特定类型有任何特定的接口。基于策略的设计委托给策略特定的功能,因此这些类型必须提供固定的接口。
    • 有点难以看出区别——'policy'是否需要doX的固定接口,doY? vs,“混合”与 X、Y、Z 没有任何关系?除了 Mixin 将多种类型“联合”在一起之外,它所添加的所有功能都是通过 C++ 中的“this”指针来表达的? (如可克隆的 CRTP minix 示例)?
    猜你喜欢
    • 2015-07-31
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 2015-09-15
    • 2011-02-03
    相关资源
    最近更新 更多