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