Можно ли использовать миксины для реализации абстрактных методов?

1

Я рефакторинг кода, который не очень многократно используется и имеет довольно много дубликатов кода. Код имеет два класса 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
  • 0
    через 6 месяцев кому-то нужно будет прочитать код (даже вам в будущем) ... поймут ли они это? если вы думаете, что они будут, идти вперед и реализовать ваше сложное решение. затем вернитесь через 6 месяцев, чтобы проверить, были ли вы правы.
Теги:
oop
mixins
abstract-methods

1 ответ

1

Да, это именно то, для чего существуют mixins (или, в более общем плане, классы). Предполагается, что класс должен инкапсулировать все функции, связанные с определенной концепцией или целью (например, ваши A и B, но также как ваши X и Y).

Я верю, что ты это переусердствуешь. Вероятно, вы знаете, как использовать классы, а mixins - это действительно просто классы, которым давалось причудливое имя, потому что для работы требуется множественное наследование. (Потому что mixins не всегда являются полноценными классами, способными функционировать сами по себе, они представляют собой набор функций, которые могут быть привязаны к другим классам.) Классы - это разделение проблем. Одна проблема - один класс. Внедрите класс для каждого из четырех понятий A, B, X и Y, а затем объедините их (с множественным наследованием) по своему усмотрению.

Я настоятельно рекомендую прочитать Что такое mixin и почему они полезны? , Ответ на текущий рейтинг (текущий) дает хорошую работу, объясняя, что mixins существуют именно для таких ситуаций.

  • 0
    Возможно, я переосмысливаю это, но я впервые использую миксины (и сталкиваюсь с причиной их использования), но мне всегда говорили, что множественное наследование - зло, я пытаюсь убедиться, что я делаю это правильно;) Думаю, мой вопрос отличается в основном из того, что я прочитал, потому что я использую микширование для реализации абстрактных хуков, которые вызываются из абстрактного класса, а не для добавления функции местности с помощью «открытого» метода, как в большинстве примеров. Это что-то меняет?
  • 0
    @ovg Нет. Каждый из ваших классов реализует набор функций. Независимо от того, были ли эти функции объявлены абстрактными в родительском классе, не имеет значения. Классы являются инструментом для повторного использования кода. Вы используете их именно так, как задумано.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню