Оскільки змішування ознак здійснюється статично в Scala, якщо ви хочете змінити ознаки, змішані з об’єктом, створіть різні об’єкти на основі певної умови.
Давайте візьмемо приклад канонічного торта. Ваші модулі визначаються як риси, а ваш додаток побудований як простий Об'єкт із змішаною функціональністю
val application =
new Object
extends Communications
with Parsing
with Persistence
with Logging
with ProductionDataSource
application.startup
Тепер усі ці модулі мають приємні декларації самотипу, які визначають їх міжмодульні залежності, тому цей рядок компілюється, лише якщо всі ваші міжмодульні залежності існують, є унікальними та добре набраними. Зокрема, модуль Persistence має власний тип, який говорить про те, що все, що реалізує Persistence, має також реалізовувати DataSource, абстрактну властивість модуля. Оскільки ProductionDataSource успадковує DataSource, все чудово, і ця лінія побудови додатків компілюється.
Але що, якщо ви хочете використовувати інший DataSource, вказуючи на якусь локальну базу даних для цілей тестування? Далі припустимо, що ви не можете просто повторно використовувати ProductionDataSource з різними параметрами конфігурації, завантаженими з файлу деяких властивостей. Що б ви зробили в такому випадку, це визначили нову ознаку TestDataSource, яка розширює DataSource, і замішали її. Ви навіть можете робити це динамічно на основі прапора командного рядка.
val application = if (test)
new Object
extends Communications
with Parsing
with Persistence
with Logging
with TestDataSource
else
new Object
extends Communications
with Parsing
with Persistence
with Logging
with ProductionDataSource
application.startup
Тепер це виглядає дещо детальнішим, ніж ми хотіли б, особливо якщо вашій програмі потрібно змінювати свою конструкцію за кількома осями. Позитивною стороною є те, що зазвичай у вас є лише одна частина умовної логіки побудови, така як у додатку (або в гіршому випадку один раз за ідентифікований життєвий цикл компонента), так що принаймні біль зведений до мінімуму та відгороджений від решти вашої логіки.