过度使用mixin是邪恶的,有哪些替代解决方案?

2024-10-03 09:06:56 发布

您现在位置:Python中文网/ 问答频道 /正文

有时使用带有多重继承的mixin可以帮助我们提高代码的可重用性。在

例如,下面的设计

class FollowableMixin(object):
    def get_followers(self):
        ...
    ...

class User(FollowableMixin):
    ...

可能比简单地将get_followers添加到User更好地重用:

^{pr2}$

因为稍后我们可能会考虑支持其他可能是get_followers客户的实体:

class BookStore(FollowableMixin):
    ...

但是,如果这种模式被过度使用,代码可能会变得过于复杂。在

class User(FollowableMixin, RunnableMixin, FlyableMixin, WhatMixin ...):
    ...

由于所有这些mixin类将属性和方法注入到类中,因此很难理解代码。例如,您不知道所调用的方法来自何处,而此方法又可能包含对另一个mixin中某个方法的调用。。。在

我该怎么做才能简化这个程序?在


Tags: 方法代码self实体get客户objectdef
3条回答

如果你的用户类真的有那么多合适的特性,那么你可能只是拥有一个复杂的应用程序。拥有五个mixin比从其他地方复制的五个函数要好。在

简化的一些可能性:

  1. 你的用户类试图做的太多了。分成更小的班级。

  2. 收集一些你的混音。例如,您可能会发现有五个类,每个类都是Followable、Runnable和Flyable。生成从这三个mixin派生的中间类FollowRunFly,然后在五个类中使用FollowRunFly。

  3. 也许你不必把你的混音片切得这么细。制作一个大mixin,并在类上使用它,让代码在运行时确定对象是可以飞行还是可以被跟踪。

有时,它可以帮助在一个类中收集相关的特性,如果它们经常一起使用的话。在

class FooMixin(FollowableMixin, RunnableMixin):
    pass

当你开始使用它时,你只有一个或两个直接基类,而不是很多。在

显然,只有在有意义的情况下你才应该这样做——它可能被滥用。如果不进一步了解您的具体例子,就很难知道在您的案例中这样做是否有意义。在

使用适配器而不是mixin。所以在您的例子中,您将拥有一个IFollowable接口和从书店或用户到ifolloable的适配器。在

请参见http://ginstrom.com/scribbles/2009/03/27/the-adapter-pattern-in-python/,了解Python中适配器的描述,尤其是Martijn Faassen关于使用工厂和接口以及grokcore.component的注释。在

相关问题 更多 >