Size: a a a

2020 June 18

AM

Artem Molotov in PHP
Нормальна ли ситуация, когда в API и на фронте дублируется одна и та же логика? К примеру, если нужно что-то обрабатывать, условно, "реалтайм".

Был бы API на JS, можно было бы этого избежать...
источник

AM

Artem Molotov in PHP
Artem Molotov
Нормальна ли ситуация, когда в API и на фронте дублируется одна и та же логика? К примеру, если нужно что-то обрабатывать, условно, "реалтайм".

Был бы API на JS, можно было бы этого избежать...
Насколько я понимаю, придётся всё время править в двух местах и не забывать об этом (уведомляя фронтов через задачи или напрямую).
источник

DD

Darkwing Duck in PHP
Artem Molotov
Нормальна ли ситуация, когда в API и на фронте дублируется одна и та же логика? К примеру, если нужно что-то обрабатывать, условно, "реалтайм".

Был бы API на JS, можно было бы этого избежать...
обычная логика, но валидация бэка как всегда "не верь никому"
источник
2020 June 19

АЯ

Андрей Ява in PHP
Валентин Удальцов
Однажды я услышал, что геттеры — это плохо.

И прошел все этапы реакции по Кюблер-Росс: отрицание, злость, торг, депрессию, принятие 😂
Надеюсь, этот пост поможет пропустить несколько стадий.

DTO. Если тело геттера return $this->privateProperty, заменяем его публичным свойством с аннотацией @psalm-readonly-allow-private-mutation или @psalm-readonly или объявляем весь класс @psalm-immutable. Так мы обеспечиваем инкапсуляцию да ещё и нанооптимизируем код (-N вызовов геттеров). Метод без каких-либо манипуляций не имеет смысла — это 4 строки визуального долга и 1 строка для покрытия тестами.

Кстати, я тут заметил, что геттер — это трюк. К существительному добавили глагол, чтобы удовлетворить фомуле subject.actionVerb(?object). Вот только get — это не предоставить, а получить. То есть мы не просим объект поделиться состоянием, мы его отбираем.

Value Object. Если метод представляет собой query по CQS и возвращает некоторое представление (проекцию) объекта, то его название не должно быть шаблонным, оно должно отражать семантику. Например, Birthday::format(string $format): string, Color::toHex(): string.

Entity. Стараемся применять принцип Tell-Don't-Ask. Попробую сформулировать по-своему. Объект — это состояние + поведение. Если мы программируем объектно-ориентированно, мы должны просить объект совершить действие над принадлежащим ему состоянием, а не отбирать у него состояние и выполнять действие за пределами этого объекта. Если программируем не объектно-ориентированно (что тоже ок), то объекты по определению не используем и геттеры, соответственно, тоже.

---

Итак, в DTO вместо геттеров используем публичные свойства. В Value Object — семантические query методы, и то, если не добавлять "на всякий случай", их будет немного. В моделях оставляем только command методы.

Как тогда вывести состояние модели? Рассудим логически. Для вывода состояния поведение не нужно, нужно только состояние. Значит и сама модель для этой задачи не нужна. Где хранится состояние модели? В хранилище. Вот из него напрямую и запросим. Утрированный GET API контроллер: echo json_encode($pdo->query('select x1, x2 from y where z = ?')->fetch()).
Псалм тебе ничего не обеспечивает.
источник

SB

Sergei Baikin in PHP
Андрей Ява
Псалм тебе ничего не обеспечивает.
Твой пхп код тебе ничего не обеспечивает. Так что вы в равных позициях и ничего не поменялось.
источник

SP

Sergey Protko in PHP
Валентин Удальцов
Однажды я услышал, что геттеры — это плохо.

И прошел все этапы реакции по Кюблер-Росс: отрицание, злость, торг, депрессию, принятие 😂
Надеюсь, этот пост поможет пропустить несколько стадий.

DTO. Если тело геттера return $this->privateProperty, заменяем его публичным свойством с аннотацией @psalm-readonly-allow-private-mutation или @psalm-readonly или объявляем весь класс @psalm-immutable. Так мы обеспечиваем инкапсуляцию да ещё и нанооптимизируем код (-N вызовов геттеров). Метод без каких-либо манипуляций не имеет смысла — это 4 строки визуального долга и 1 строка для покрытия тестами.

Кстати, я тут заметил, что геттер — это трюк. К существительному добавили глагол, чтобы удовлетворить фомуле subject.actionVerb(?object). Вот только get — это не предоставить, а получить. То есть мы не просим объект поделиться состоянием, мы его отбираем.

Value Object. Если метод представляет собой query по CQS и возвращает некоторое представление (проекцию) объекта, то его название не должно быть шаблонным, оно должно отражать семантику. Например, Birthday::format(string $format): string, Color::toHex(): string.

Entity. Стараемся применять принцип Tell-Don't-Ask. Попробую сформулировать по-своему. Объект — это состояние + поведение. Если мы программируем объектно-ориентированно, мы должны просить объект совершить действие над принадлежащим ему состоянием, а не отбирать у него состояние и выполнять действие за пределами этого объекта. Если программируем не объектно-ориентированно (что тоже ок), то объекты по определению не используем и геттеры, соответственно, тоже.

---

Итак, в DTO вместо геттеров используем публичные свойства. В Value Object — семантические query методы, и то, если не добавлять "на всякий случай", их будет немного. В моделях оставляем только command методы.

Как тогда вывести состояние модели? Рассудим логически. Для вывода состояния поведение не нужно, нужно только состояние. Значит и сама модель для этой задачи не нужна. Где хранится состояние модели? В хранилище. Вот из него напрямую и запросим. Утрированный GET API контроллер: echo json_encode($pdo->query('select x1, x2 from y where z = ?')->fetch()).
источник

SP

Sergey Protko in PHP
Вот ещё полезного
источник

ВУ

Валентин Удальцов... in PHP
спасибо, изучу)
источник

ВУ

Валентин Удальцов... in PHP
Поддерживается ли множественное наследование в PHP?
Анонимная викторина
28%
Да
71%
Нет
1%
Не знаю
Проголосовало: 1415
источник

ВУ

Валентин Удальцов... in PHP
interface A extends B, C — это множественное наследование типов или нет?
источник

АС

Альберт Степанцев... in PHP
странный вопрос
конечно да
источник

F

FOX in PHP
похоже, автор вопроса не в курсе о нюансе с интерфейсами
источник

АС

Альберт Степанцев... in PHP
а почему вопрос вообще возник?
источник

АС

Альберт Степанцев... in PHP
а, это чатик другой
ОК
источник

ВУ

Валентин Удальцов... in PHP
Альберт Степанцев
странный вопрос
конечно да
согласен) но оригинальный вопрос без уточнения) множественное наследование чего? классов — нет) типов — получается, да
источник

KN

Kirill Nesmeyanov in PHP
Валентин Удальцов
Поддерживается ли множественное наследование в PHP?
Анонимная викторина
28%
Да
71%
Нет
1%
Не знаю
Проголосовало: 1415
Хочу заметить, что interface, trait и class в php является одним и тем же типом внутри языка (кроме одного единственного флага)
источник

SP

Sergey Protko in PHP
Kirill Nesmeyanov
Хочу заметить, что interface, trait и class в php является одним и тем же типом внутри языка (кроме одного единственного флага)
и вот этот флаг решает как бы
источник

KN

Kirill Nesmeyanov in PHP
ну... его можно поменять)
источник

KN

Kirill Nesmeyanov in PHP
правда всё накроется
источник

SP

Sergey Protko in PHP
это полезно обсуждать в контексте "как работает это все под копотом" что не сильно влияет на то как ты этим пользуешься в проектах
источник