Skip to content

Added section "Getters and Setters" into library #279

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Mar 26, 2025
Merged

Conversation

tabuna
Copy link
Member

@tabuna tabuna commented Mar 24, 2025

Добавляет раздел о принципе "Tell, Don’t Ask" раскрывающий примеры применения и влияние на код.

Главный посыл, что getter/setter объекты становятся простыми структурами, а вся логика программы оказывается вынесенной в отдельные процедуры, что по сути сводит код к процедурному стилю.

В этом случае мы не задаем пошагово, что делать, а поручаем объекту выполнить всю необходимую инициализацию и запуск.
Такой подход позволяет скрыть детали реализации и предоставляет лишь интерфейс для взаимодействия с объектом.

Но существует чертовски много кода и практик на ООП языках, который является процедурным по своей конструкции, по этому мы разберем несколько примеров.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Однако в ООП-языках можно найти огромное количество кода и практик, которые по сути остаются процедурными. Поэтому давайте разберём несколько примеров.

Я бы перефразиваровал

$app->start();
```

В этом случае мы не задаем пошагово, что делать, а поручаем объекту выполнить всю необходимую инициализацию и запуск.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Возможно, стоит сразу написать, что это называется инкапсуляция, чтобы читатель запоминал терминологию

]);
```

Здесь объект `UserService` выполняет логику, а объект `User` остаётся максимально простым.
Copy link
Member Author

@tabuna tabuna Mar 25, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Это классический пример, который часто используют в качестве иллюстрации. Однако на практике я нередко встречал, что существует один общий UserManager или UserService, который не ограничивается одной конкретной задачей, а скорее большим декоратором над глупым объектом в попытке обратно вернуться к умному классу.

Например:

$manager = new UserManager();

// Получить всех пользователей
$manager->getAll();

// Отправить приветственное письмо 
$manager->sendWelcomeEmail($user);

При этом изначальная идея, заложенная умными дядьками, предполагала разделение таких сервисных классов по их назначению. То есть должны быть прям отдельные классы:

// Класс относящийся к выборке пользователей
$usersManager = new UsersManager();
$usersManager->getAll();

// Класс относящийся уже к уведомлениям пользователей
$userNotification = new UserNotification();
$userNotification->sendWelcomeEmail($user);

Как более однозначный процедурный (!) предложить однозначный способ Action и добавить перекрёстную ссылку на него?


<x-header align="align-items-center">
<x-slot name="sup">Объектно-ориентированное программирование</x-slot>
<x-slot name="title">Геттеры, сеттеры и DTO</x-slot>
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Очень хороший голосовой комментарий от Чубарова, в котором он указал, что я поддался распространённому заблуждению. Мой пример с классом User не является DTO, поскольку как DTO, так и VO должны быть имутабельными, так как у него есть сеттер, то он уже не может считаться таковым.

Нужно добавить будет сноску об этом, а заголовок поменять

@tabuna tabuna merged commit 0b01789 into master Mar 26, 2025
5 of 8 checks passed
@tabuna tabuna deleted the gettersandsetters branch March 26, 2025 21:01
ReWiG pushed a commit to ReWiG/laravel.su that referenced this pull request Jul 16, 2025
* Added section "Getters and Setters" into library
* Fixed ambiguous or incorrect remarks
* Added route endpoint
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants