TGViewer
Flutter Friendly Flutter Friendly @flutterfriendly · 995 subscribers
Post #283 783
💬Привет, с вами Катя, Flutter Dev Friflex

Сегодня я начинаю серию постов о принципах SOLID — фундаментальных правилах разработки программного обеспечения, которые помогают создавать чистый, масштабируемый и поддерживаемый код.

SOLID — это аббревиатура из пяти принципов объектно-ориентированного программирования. Разберем каждую букву отдельно, начиная с S (Single Responsibility Principle)

Что такое Single Responsibility Principle
Принцип единственной ответственности гласит: каждый класс должен иметь только одну причину для изменения. Проще говоря — один класс решает одну задачу.

Применение к классам

❌Нарушение SRP


class UserManager {
  // Работа с БД
  User getUser(String id) => User(id: id, name: 'John');
  void saveUser(User user) { /* сохранение */ }
  
  // Валидация
  bool validateEmail(String email) => email.contains('@');
  
  // Уведомления
  void sendWelcomeEmail(User user) { /* отправка */ }
  
  // Отчеты
  String generateReport(User user) => 'Отчет: ${user.name}';
}


Класс выполняет четыре разные задачи: работа с БД, валидация, уведомления и отчеты. У него слишком много причин для изменения.

✅Правильное применение SRP

// Работа с базой данных
class UserRepository {
  User getUser(String id) => User(id: id, name: 'John');
  void saveUser(User user) { /* сохранение */ }
  void deleteUser(String id) { /* удаление */ }
}

// Валидация данных
class UserValidator {
  bool validateEmail(String email) {}
  
  bool validatePassword(String password) {}
}

// Отправка уведомлений
class NotificationService {
  void sendWelcomeEmail(User user) {}
}

// Генерация отчетов
class ReportGenerator {
  String generateUserReport(User user) {}
}


Теперь каждый класс имеет только одну ответственность и одну причину для изменения.

Применение к методам
Принцип работает и на уровне методов — каждый метод должен
выполнять одну задачу.

❌Нарушение на уровне метода

void processOrder(Order order) {
  // Валидация
  if (order.items.isEmpty) throw Exception('Корзина пуста');
  
  // Расчет
  double total = 0;
  for (var item in order.items) {
    total += item.price * item.quantity;
  }
  
  // Сохранение
  database.save(order);
  
  // Уведомление
  emailService.send(order.userEmail, 'Заказ оформлен');
}


✅Правильное применение

class OrderService {
  final OrderValidator validator;
  final PriceCalculator calculator;
  final OrderRepository repository;
  final NotificationService notifications;
  
  void processOrder(Order order) {
    _validateOrder(order);
    final total = _calculateTotal(order);
    _saveOrder(order, total);
    _notifyUser(order);
  }
  
  void _validateOrder(Order order) => validator.validate(order);
  double _calculateTotal(Order order) => calculator.calculate(order);
  void _saveOrder(Order order, double total) => repository.save(order);
  void _notifyUser(Order order) => notifications.send(order);
}


Каждый метод выполняет одну конкретную задачу.

Преимущества SRP
✔️
Упрощение тестирования — каждый класс тестируется изолированно​
✔️Легкость поддержки — изменения в одной части не влияют на другие​
✔️Лучшая читаемость — код становится понятнее​
✔️Переиспользование — специализированные классы легче использовать повторно

В следующих постах я расскажу о других принципах SOLID.

🔄Делитесь в комментариях своими примерами применения SOLID в ваших проектах! Интересно узнать, с какими сложностями вы сталкивались и как принципы SOLID помогли их решить
  • 👍 18
  • ❤ 6
  • 🔥 6
More from @flutterfriendly
  1. May 14, 2026👀Какой сложный вопрос или тема по Flutter вас сейчас беспокоят? Может, задача не идет, ба…
  2. Apr 17, 2026💭Привет! Это Роза, Flutter-разработчица Friflex! Уверена, многие из вас знакомы с Dart De…
  3. Apr 8, 2026Привет, друзья! Делимся нашей страничкой на Хабре, чтобы всегда оставаться на связи. Там е…
  4. Apr 3, 2026🌸Апрель в календаре и на экране Весна зовет обновлять визуальное: убирать темные темы и в…
  5. Apr 1, 2026Всегда с нетерпением ждем этого дня, чтобы сделать подборку ИТ-мемов Пусть поводов для улы…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →