Mixin 与 C++ 中面向策略的设计有何不同
How do Mixins differ from Policy Oriented Design in C++
我阅读了各种试图用 C++ 解释 Mixins 的资源。
他们似乎都解释了 Mixin 的应用程序,看起来只不过是标准的面向策略的设计。
所以我的问题是:Mixins 是面向策略设计的同义词还是 Mixins 及其在 C++ 中的应用?
它们是相似的解决方案。
无论如何,通常它们旨在解决略有不同的问题。
考虑以下 class:
template<PolicyDoX PX, PolicyDoY>
struct PolicyBased {
void doSomething() {
// ... A few operations
PX::doX();
// ... Some other operations
PX::doY();
}
};
这是一个简单的 policy-based 方法。关键概念是 class 期望政策提供(让我说) 接口 。这是实现的问题(他们将如何做到这一点),而不是实际提供的内容。
换句话说,class 的用户在功能方面不受给定策略的影响,因为 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 会更改 其界面。 class 本身并不期望任何给定的功能集,只是将它们提供给最终用户。
因此,mixin 可以被视为一个桶,您可以将几乎所有组件放入其中以获得您喜欢的类型,并且该类型将具有严格依赖于所选组件的接口。
总结一下:
策略定义如何做某事,但不影响接受它们的 class 界面。
Mixins 同意创建一个新类型,它有自己的接口,由用于定义 mixin 的组件集提供。
你链接到我写的一篇文章(自下而上思考),所以我想我会插话。
基于策略的设计与 C++ 中的 Mixins 之间的相似之处在于,最终定义的 class 将继承自对其进行参数化的 classes。它们的不同之处在于 Mixin 形成一个链,因此它们组合在一起,而策略则有些独立。您可以将 Mixins 视为应用单个策略的情况,并且该策略具有策略(注意递归以形成策略链)。
对我来说,Mixins 的强大之处在于 MixinA 可以与 Base 交互,而如果 MixinA 和 Base 是单独的策略,则它们无法交互。这将使模式适用于不同的情况。
我阅读了各种试图用 C++ 解释 Mixins 的资源。
他们似乎都解释了 Mixin 的应用程序,看起来只不过是标准的面向策略的设计。
所以我的问题是:Mixins 是面向策略设计的同义词还是 Mixins 及其在 C++ 中的应用?
它们是相似的解决方案。
无论如何,通常它们旨在解决略有不同的问题。
考虑以下 class:
template<PolicyDoX PX, PolicyDoY>
struct PolicyBased {
void doSomething() {
// ... A few operations
PX::doX();
// ... Some other operations
PX::doY();
}
};
这是一个简单的 policy-based 方法。关键概念是 class 期望政策提供(让我说) 接口 。这是实现的问题(他们将如何做到这一点),而不是实际提供的内容。
换句话说,class 的用户在功能方面不受给定策略的影响,因为 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 会更改 其界面。 class 本身并不期望任何给定的功能集,只是将它们提供给最终用户。
因此,mixin 可以被视为一个桶,您可以将几乎所有组件放入其中以获得您喜欢的类型,并且该类型将具有严格依赖于所选组件的接口。
总结一下:
策略定义如何做某事,但不影响接受它们的 class 界面。
Mixins 同意创建一个新类型,它有自己的接口,由用于定义 mixin 的组件集提供。
你链接到我写的一篇文章(自下而上思考),所以我想我会插话。
基于策略的设计与 C++ 中的 Mixins 之间的相似之处在于,最终定义的 class 将继承自对其进行参数化的 classes。它们的不同之处在于 Mixin 形成一个链,因此它们组合在一起,而策略则有些独立。您可以将 Mixins 视为应用单个策略的情况,并且该策略具有策略(注意递归以形成策略链)。
对我来说,Mixins 的强大之处在于 MixinA 可以与 Base 交互,而如果 MixinA 和 Base 是单独的策略,则它们无法交互。这将使模式适用于不同的情况。