SRP
Принцип
У каждого класса/модуля/функции должна быть только одна причина для изменения.
Пример из жизни: кофемашина. Если она варит кофе, сама себя чистит, сама заказывает зёрна через интернет, печатает чеки - то это плохо! Если изменится способ печати чеков - придётся менять кофемашину. Если поставщик зёрен поменяет API - снова менять кофемашину. Правильно: кофемашина только варит кофе. Чисткой занимается отдельный сотрудник, заказом зёрен — менеджер, печатью чеков — кассовый аппарат.
Пример антипаттерна в коде: SmartDevice::print_state() и хранит температуру, и выводит её в консоль:
Если потом потребуется писать отчёты в файл, отправлять по сети, выводить на веб-страницу, логировать в JSON, то придётся менять сам доменный тип, и это плохо!
Правильно: SmartDevice только хранит данные и отвечает за свою бизнес-логику. А за вывод отвечает кто-то другой.
Антипаттерн без Display:
Паттерн SRP с Display:
Что такое f: &mut fmt::Formatter<'_>:
- Содержание (
self- то, что надо “напечатать”) - Лист бумаги (
f- куда Вы это записываете)fmt::Formatter- это как лист бумаги + ручка в одном флаконе. Он знает: - куда писать (в консоль, в строку, в файл)
- какие настройки форматирования (ширина, выравнивание и т.д.)
Что происходит в println:
println!создаёт свойFormatter, который указывает на стандартный вывод- Вызывает
person.fmt(&mut formatter) - Метод
fmtпишет в этотformatter println!добавляет перевод строки и отправляет в консоль