В Scala есть два инструмента для выражения композиции объектов: оригинальная концепция самотипа и хорошо известная тривиальная композиция. Мне любопытно, в каких ситуациях я должен использовать какие.
Существуют очевидные различия в их применимости. Самотип требует от вас использования черт. Композиция объекта позволяет вам изменять расширения во время выполнения с помощью объявления var.
Опуская технические детали, я могу выделить два индикатора, которые помогут в классификации вариантов использования.Если какой-то объект используется в качестве комбинатора для сложной структуры, такой как дерево, или просто имеет несколько одинаковых типизированных частей (отношение 1 автомобиля к 4 колесам), тогда он должен использовать композицию. Существует крайний противоположный вариант использования. Давайте предположим, что одна черта стала слишком большой, чтобы ее можно было четко наблюдать, и она разделилась. Вполне естественно, что в этом случае вы должны использовать самотипы.
Эти правила не являются абсолютными. Вы можете выполнить дополнительную работу по преобразованию кода между этими методами. например вы можете заменить композицию из 4-х колес самонабором над Product4. Вы можете использовать Cake[T <: MyType] {part : MyType}
вместо Cake { this : MyType => }
для зависимостей шаблона торта. Но оба случая кажутся нелогичными и требуют дополнительной работы.
Однако существует множество граничных вариантов использования. В отношениях один на один очень трудно решить. Есть ли какое-то простое правило, чтобы решить, какая техника предпочтительнее?
self-type делает ваши классы абстрактными, а композиция делает ваш код многословным. self-type дает вам проблемы с смешиванием пространств имен, а также дает вам дополнительный набор текста бесплатно (вы получаете не просто коктейль из двух элементов, а коктейль из бензина и моторного масла, известный как заправочная бомба).
Как я могу выбирать между ними? Какие подсказки есть?
Обновление:
Давайте обсудим следующий пример:
Шаблон адаптера. Какие преимущества он имеет как с самостоятельным вводом, так и с композиционным подходом?