Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Mixin и Extension - две техники для расширения функциональности
Mixin - это класс функциональности для переиспользования кода через смешивание в другие классы. Extension - это способ добавления новых методов к существующим типам.
Mixin - переиспользование через смешивание
mixin Logger {
void log(String message) {
print("[LOG] $message");
}
}
mixin Validator {
bool validate(String input) {
return input.isNotEmpty;
}
}
class User with Logger, Validator {
String name = "John";
void save() {
if (validate(name)) {
log("User saved");
}
}
}
Параметры:
- Может содержать переменные и состояние
- Может быть использован в нескольких классах
- Применяется при создании класса с
with - Часть иерархии типов
Extension - добавление методов к типам
extension StringHelper on String {
String capitalize() {
return "${this[0].toUpperCase()}${substring(1)}";
}
bool isValidEmail() {
return contains("@");
}
}
print("john".capitalize()); // John
print("john@mail.com".isValidEmail()); // true
Параметры:
- НЕ может содержать состояние
- Работает с любыми типами, включая встроенные
- Применяется при использовании типа
- НЕ часть иерархии типов
Примеры
Mixin с состоянием:
mixin Timestamped {
DateTime? createdAt;
void markCreated() {
createdAt = DateTime.now();
}
}
class Document with Timestamped {
String title = "Doc";
}
final doc = Document();
doc.markCreated();
print(doc.createdAt);
Extension для встроенных типов:
extension on int {
bool isEven() => this % 2 == 0;
String toHex() => "0x${toRadixString(16)}";
}
print((4).isEven()); // true
print((255).toHex()); // 0xff
extension on List<int> {
int sum() => fold(0, (a, b) => a + b);
double average() => sum() / length;
}
print([1, 2, 3, 4].sum()); // 10
print([1, 2, 3, 4].average()); // 2.5
Сравнение
| Вопрос | Mixin | Extension |
|---|---|---|
| Содержит состояние? | Да | Нет |
| Может наследовать? | Да | Нет |
| Для встроенных типов? | Нет | Да |
| Применение | with | На использование |
| Иерархия типов | Да | Нет |
Когда использовать
Mixin:
- Функциональность, которая нужна нескольким классам
- Требует хранения состояния
- Сложная логика инициализации
Extension:
- Вспомогательные методы
- Удобство использования
- Работа с встроенными типами
- Небольшие утилиты без состояния
Оба инструмента важны. Используй их правильно для чистого и переиспользуемого кода.