TGViewer
PHP | Вопросы собесов PHP | Вопросы собесов @easy_php_ru · 2.3K subscribers
Post #1870 539
🤔 Какой принцип нарушает Active Record?

Это популярный шаблон проектирования, который используется для взаимодействия с базой данных. Он сочетает в себе логику бизнес-модели и работу с базой данных в одном объекте. Несмотря на свою популярность и удобство, Active Record нарушает принцип разделения ответственности (Single Responsibility Principle, SRP) из SOLID.

🚩Почему Active Record нарушает SRP?

SRP гласит, что класс должен иметь только одну причину для изменения, то есть заниматься только одной задачей.
🟠Логика бизнес-модели
Класс хранит правила и поведение, связанные с сущностью (например, вычисления, валидации, связи).
🟠Работа с базой данных
Класс отвечает за взаимодействие с базой данных, включая CRUD-операции (создание, чтение, обновление, удаление), построение SQL-запросов и т. д.

Таким образом, Active Record совмещает две разные ответственности: бизнес-логику и взаимодействие с базой данных. Если изменится структура базы данных или логика обработки данных, класс придется менять, что нарушает SRP.
class User extends ActiveRecord {
public function getFullName() {
return $this->first_name . ' ' . $this->last_name;
}

public function saveUser() {
$this->save(); // Метод сохранения в базе данных
}
}


🚩Альтернатива

Чтобы соблюсти SRP, можно разделить бизнес-логику и работу с базой данных на разные уровни:
🟠Data Mapper
Отвечает только за преобразование данных между объектами и базой данных.
🟠Сервисы
Обрабатывают бизнес-логику.

class User {
private $firstName;
private $lastName;

public function __construct($firstName, $lastName) {
$this->firstName = $firstName;
$this->lastName = $lastName;
}

public function getFullName() {
return $this->firstName . ' ' . $this->lastName;
}
}

class UserMapper {
public function save(User $user) {
// SQL-запрос для сохранения данных
}
}


Ставь 👍 и забирай 📚 Базу знаний
  • 💊 1
More from @easy_php_ru
  1. Oct 17, 2026🤔 Зачем использовать Rest , если есть Soup? SOAP (Simple Object Access Protocol) и REST (…
  2. Oct 16, 2026🤔 Какие типы БД бывают? Базы данных делятся на реляционные (SQL) и нереляционные (NoSQL).…
  3. Oct 16, 2026🤔 Что такое агрегат? Агрегат – это термин, часто используемый в области баз данных и прог…
  4. Oct 15, 2026🤔 Что такое замыкание? Это функция, которая «захватывает» переменные из внешней области в…
  5. Oct 15, 2026🤔 Что есть кроме микросервисной и монолитной архитектуры? Помимо монолитной и микросервис…
  6. Oct 14, 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 →