Приведи пример применения принципа DRY (Don’t Repeat Yourself) в Flutter.

«Приведи пример применения принципа DRY (Don’t Repeat Yourself) в Flutter.» — вопрос из категории SOLID и принципы, который задают на 29% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Принцип DRY направлен на устранение дублирования кода. Во Flutter его можно применять на разных уровнях.

1. Вынос повторяющихся стилей в константы или методы-хелперы:

// ПЛОХО: Стиль дублируется
Widget buildButton1() {
  return ElevatedButton(
    style: ElevatedButton.styleFrom(
      backgroundColor: Colors.blueAccent,
      foregroundColor: Colors.white,
      shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)),
      padding: EdgeInsets.symmetric(horizontal: 24, vertical: 12),
    ),
    onPressed: () {},
    child: Text('Submit'),
  );
}

Widget buildButton2() {
  return ElevatedButton(
    style: ElevatedButton.styleFrom(
      backgroundColor: Colors.blueAccent, // Дублирование
      foregroundColor: Colors.white,      // Дублирование
      shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), // Дублирование
      padding: EdgeInsets.symmetric(horizontal: 24, vertical: 12), // Дублирование
    ),
    onPressed: () {},
    child: Text('Cancel'),
  );
}

// ХОРОШО: Стиль вынесен в константу
const ButtonStyle myPrimaryButtonStyle = ElevatedButton.styleFrom(
  backgroundColor: Colors.blueAccent,
  foregroundColor: Colors.white,
  shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)),
  padding: EdgeInsets.symmetric(horizontal: 24, vertical: 12),
);

Widget buildButton1() {
  return ElevatedButton(
    style: myPrimaryButtonStyle, // Переиспользование
    onPressed: () {},
    child: Text('Submit'),
  );
}

Widget buildButton2() {
  return ElevatedButton(
    style: myPrimaryButtonStyle, // Переиспользование
    onPressed: () {},
    child: Text('Cancel'),
  );
}

2. Создание кастомных переиспользуемых виджетов: Если у вас часто повторяется сложная композиция виджетов (например, карточка товара с изображением, названием и ценой), правильнее создать для нее отдельный виджет ProductCard. Это избавит от копирования одного и того же кода в нескольких местах и упростит будущие изменения дизайна.

3. Вынос бизнес-логики в отдельные классы (сервисы, репозитории): Вместо того чтобы писать один и тот же код для работы с API в разных ViewModel или Bloc, следует создать единый ApiClient или Repository и инжектировать его туда, где он нужен. Это классическое применение DRY на уровне архитектуры.