代码之家  ›  专栏  ›  技术社区  ›  satoru

过度使用mixin是邪恶的,有什么替代方案?

  •  7
  • satoru  · 技术社区  · 14 年前

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

    例如,以下设计

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

    可能比简单地添加 get_followers User :

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

    因为以后我们可能会考虑支持其他可能成为 :

    class BookStore(FollowableMixin):
        ...
    

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

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

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

    我应该做些什么来简化这个程序?

    4 回复  |  直到 14 年前
        1
  •  6
  •   Mark Byers    14 年前

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

    class FooMixin(FollowableMixin, RunnableMixin):
        pass
    

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

        2
  •  6
  •   Ned Batchelder    14 年前

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

    简化的一些可能性:

    1. 你的用户类试图做的太多了。把它分成几个小班。

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

        3
  •  4
  •   Duncan    14 年前

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

    看到了吗 http://ginstrom.com/scribbles/2009/03/27/the-adapter-pattern-in-python/ 关于Python中适配器的一个描述,特别是martijnfaassen关于使用工厂和接口以及 grokcore.component .

        4
  •  4
  •   unutbu    14 年前

    用纸和笔写下实际实例化的具体类(例如User和BookStore)。列出希望这些类执行的所有方法。只有看到这个列表,你才能理性地决定什么样的类层次结构最适合你的情况。手工书写的缓慢可能会迫使你以一种新的方式思考对象之间的关系。试着向想象中的朋友(或我们)详细解释你的课程聪明但对你的问题一无所知的人。表达细节的缓慢可能会带来洞察力。

    mixin可能会给你很多通用性,让你的项目得以发展,但是你经常被迫在通用性(复杂)和实用性(简单)之间做出妥协。四个混合料允许2**4种可能的混凝土等级。如果在实践中,具体类要少得多,那么mixin可能不是合适的工具。