Риси - це ще один спосіб складання композиції. Подумайте про них як про спосіб складання всіх частин класу під час компіляції (або часу компіляції JIT), складання конкретних реалізацій частин, які вам знадобляться.
В основному, ви хочете використовувати риси, коли вам здається робити заняття з різними комбінаціями функцій. Ця ситуація виникає найчастіше для людей, які пишуть гнучкі бібліотеки, щоб їх споживали інші. Наприклад, ось декларація про тестовий клас, про який я писав нещодавно, використовуючи ScalaTest :
class TestMyClass
extends WordSpecLike
with Matchers
with MyCustomTrait
with BeforeAndAfterAll
with BeforeAndAfterEach
with ScalaFutures
Розділ рамки випробувань мають масу різних варіантів конфігурації, і кожна команда має різні переваги про те , як вони хочуть , щоб робити речі. withВстановлюючи параметри в риси (які змішуються при використанні в Scala), ScalaTest може запропонувати всі ці варіанти, не створюючи назви класів, як WordSpecLikeWithMatchersAndFutures, або тонни булевих прапорів виконання WordSpecLike(enableFutures, enableMatchers, ...). Це дозволяє легко дотримуватися принципу відкритого / закритого типу . Ви можете додавати нові функції та нові комбінації функцій, просто додаючи нову ознаку. Це також полегшує дотримання принципу поділу інтерфейсу , оскільки ви можете легко помістити функції, які не є загально необхідними, у ознаку.
Риси також є хорошим способом розміщення загального коду на кілька класів, які не мають сенсу розділяти ієрархію спадкування. Спадщина - це дуже тісно пов'язані відносини, і ви не повинні платити ці витрати, якщо зможете в цьому допомогти. Риси - це набагато більш вільно пов'язані відносини. У своєму прикладі вище я використовував, MyCustomTraitщоб легко поділитись реалізацією макетної бази даних між декількома інакше не пов'язаними тестовими класами.
Введення залежності залежить від багатьох тих самих цілей, але під час виконання на основі введення користувача, а не під час компіляції на основі введення програміста. Риси також призначені більше для залежностей, які семантично входять до одного класу. Ви наче збираєте частини одного класу, а не телефонуєте іншим класам з іншими обов'язками.
Структури введення залежностей досягають багатьох однакових цілей під час компіляції на основі введення програміста, але значною мірою є вирішенням для мов програмування без належної підтримки ознак. Риси вводять ці залежності в сферу перевірки типу компілятора, з чистішим синтаксисом, з більш простим процесом побудови, що дозволяє чіткіше розрізняти залежності компіляції від часу і часу виконання.