我正在重构一些不太可重用的代码,并且有很多重复的代码。该代码有两个类A和B,它们扩展了抽象类I。但是有A和B的子类来支持概念X和Y,因此结果是复制并粘贴了概念X和Y的具体类AX,AY,BX,BY进入每个。
所以我知道我可以在这里使用合成来委派对功能X和Y的支持,但这还需要构建这些对象的代码,这就是为什么我开始阅读mixins的原因,所以我想知道我的代码是否是一个好的解决方案
class I(ABC):
@abstractmethod
def doSomething():
pass
class ICommon(ABC):
@abstractmethod
def doSomethingCommon():
pass
class A(I, ICommon):
# the interface(s) illustrates what mixins are supported
# class B could be similar, but not necessarily with the same interfaces
def doSomething():
self.doSomethingCommon()
...
class XCommonMixin(object):
# feature X shared possibly in A and B
# I have also split features X into much smaller concise parts,
# so the could be a few of these mixins to implement the different
# features of X
def doSomethingCommon():
return 42
class AX(XCommonMixin, A):
pass
# init can be defined to construct A and bases if any as appropriate
答案 0 :(得分:1)
是的,这正是存在mixin(或更一般而言,类)的目的。一个类应该封装与特定概念或目的相关联的所有功能(例如您的A
和B
,也喜欢您的X
和Y
)。>
我相信您对此有过多的思考。您可能知道如何使用类,mixin实际上只是被赋予了奇特名称的类,因为它们需要多重继承才能起作用。 (因为mixin并不总是能够独立运行的完整类;它们是可以附加到其他类的功能的集合。)类是有关关注点分离的。一关-一堂课。为这四个概念A
,B
,X
和Y
中的每个实现一个类,然后根据需要将它们组合(具有多个继承)。
我强烈建议您阅读What is a mixin, and why are they useful?。 (当前)最高评分的答案很好地说明了混合素确实存在于此类情况。