В мире Java (точнее, если у вас нет множественного наследования / миксинов), практическое правило довольно простое: «Подарите композицию объекта наследованию класса».
Я хотел бы знать, если / как это изменилось, если вы также рассматриваете миксины, особенно в Scala?
Считаются ли миксины способом множественного наследования или составления классов?
Существует ли также рекомендация «Композиция объекта Favor поверх композиции класса» (или наоборот)?
Я видел довольно много примеров, когда люди используют (или злоупотребляют) миксины, когда компоновка объектов также может выполнять свою работу, и я не всегда уверен, какой из них лучше. Мне кажется, что с их помощью можно добиться совершенно схожих результатов, но есть и некоторые отличия, например:
- видимость - с миксинами все становится частью публичного API, что не относится к композиции.
- многословие - в большинстве случаев миксины менее многословны и немного проще в использовании, но это не всегда так (например, если вы также используете типы self в сложных иерархиях)
Я знаю, что короткий ответ "Это зависит", но, вероятно, есть некоторые типичные ситуации, когда то или иное лучше.
Некоторые примеры руководств, которые я мог придумать до сих пор (при условии, что у меня есть две черты A и B, и A хочет использовать некоторые методы из B):
- Если вы хотите расширить API A с помощью методов из B, тогда mixins, иначе состав. Но это не помогает, если создаваемый мной класс / экземпляр не является частью общедоступного API.
- Если вы хотите использовать некоторые паттерны, которые нуждаются в миксинах (например, Stackable Trait Pattern ), тогда это простое решение.
- Если у вас есть циклические зависимости, то могут помочь миксины с типами. (Я пытаюсь избежать этой ситуации, но это не всегда легко)
- Если вам нужны динамические решения во время выполнения, как сделать композицию, тогда составьте объект.
Во многих случаях миксины кажутся более простыми (и / или менее многословными), но я вполне уверен, что у них также есть некоторые подводные камни, такие как «класс Бога» и другие, описанные в двух статьях artima: часть 1 , part 2 (Кстати, мне кажется, что большинство других проблем не имеют отношения / не столь серьезны для scala).
У вас есть еще подобные подсказки?