Я рефакторинг кода, который не очень многократно используется и имеет довольно много дубликатов кода. Код имеет два класса A и B, которые расширяют абстрактный класс I. Но существуют подклассы A и B для поддержки понятий X и Y, поэтому результатом являются конкретные классы AX, AY, BX, BY с понятиями X и Y, скопированными и вставленными в каждый.
Поэтому я знаю, что могу использовать композицию здесь для делегирования поддержки функций X и Y, но для этого также требуется код, который создает эти объекты и т.д., Поэтому я начал читать о миксинах, поэтому мне интересно, мой код - хорошее решение
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
Да, это именно то, для чего существуют mixins (или, в более общем плане, классы). Предполагается, что класс должен инкапсулировать все функции, связанные с определенной концепцией или целью (например, ваши A
и B
, но также как ваши X
и Y
).
Я верю, что ты это переусердствуешь. Вероятно, вы знаете, как использовать классы, а mixins - это действительно просто классы, которым давалось причудливое имя, потому что для работы требуется множественное наследование. (Потому что mixins не всегда являются полноценными классами, способными функционировать сами по себе, они представляют собой набор функций, которые могут быть привязаны к другим классам.) Классы - это разделение проблем. Одна проблема - один класс. Внедрите класс для каждого из четырех понятий A
, B
, X
и Y
, а затем объедините их (с множественным наследованием) по своему усмотрению.
Я настоятельно рекомендую прочитать Что такое mixin и почему они полезны? , Ответ на текущий рейтинг (текущий) дает хорошую работу, объясняя, что mixins существуют именно для таких ситуаций.