-
Notifications
You must be signed in to change notification settings - Fork 18
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
Conversation
В этом случае мы не задаем пошагово, что делать, а поручаем объекту выполнить всю необходимую инициализацию и запуск. | ||
Такой подход позволяет скрыть детали реализации и предоставляет лишь интерфейс для взаимодействия с объектом. | ||
|
||
Но существует чертовски много кода и практик на ООП языках, который является процедурным по своей конструкции, по этому мы разберем несколько примеров. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Однако в ООП-языках можно найти огромное количество кода и практик, которые по сути остаются процедурными. Поэтому давайте разберём несколько примеров.
Я бы перефразиваровал
$app->start(); | ||
``` | ||
|
||
В этом случае мы не задаем пошагово, что делать, а поручаем объекту выполнить всю необходимую инициализацию и запуск. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Возможно, стоит сразу написать, что это называется инкапсуляция, чтобы читатель запоминал терминологию
]); | ||
``` | ||
|
||
Здесь объект `UserService` выполняет логику, а объект `User` остаётся максимально простым. |
There was a problem hiding this comment.
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> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Очень хороший голосовой комментарий от Чубарова, в котором он указал, что я поддался распространённому заблуждению. Мой пример с классом User
не является DTO, поскольку как DTO, так и VO должны быть имутабельными, так как у него есть сеттер, то он уже не может считаться таковым.
Нужно добавить будет сноску об этом, а заголовок поменять
* Added section "Getters and Setters" into library * Fixed ambiguous or incorrect remarks * Added route endpoint
Добавляет раздел о принципе "Tell, Don’t Ask" раскрывающий примеры применения и влияние на код.
Главный посыл, что getter/setter объекты становятся простыми структурами, а вся логика программы оказывается вынесенной в отдельные процедуры, что по сути сводит код к процедурному стилю.