
Evgeniy
05.03.2018
19:51:40
и проверять тип через instanceof

Bohdan
05.03.2018
19:51:43
типа успешно или нет?

Evgeniy
05.03.2018
19:51:59
вместо !empty($result->getErrors())

Google

Evgeniy
05.03.2018
19:52:18
но имхо тут это не надо

Bohdan
05.03.2018
19:52:23
можно и так
но оно все равно оказывается не лучше исключений)
вот в чем петрушка

Evgeniy
05.03.2018
19:52:39
как итог у тебя валидация контракта будет отдельно
в валидаторе
валидатор в идеале возвращает ок или не ок
или ошибки

Bohdan
05.03.2018
19:53:09
размазывание сущности получается

Evgeniy
05.03.2018
19:53:11
ты можешь код в terminate заменить на валидатор
и спросить у валидатора валидно ли
если валидно вызывать приватный метод terminate
и возвращать валидатор

Alan
05.03.2018
19:54:02
я все жду хорошего момента чтоб спросить к чему в итоге пришли ?

Google

Evgeniy
05.03.2018
19:54:03
у которого будет метод $result->hasErrors
и $result->getErrors

Bohdan
05.03.2018
19:54:11
@f3ath все же поясни, что ты имел ввиду
под логикой в результате
есть несколько разных вариантов и они отличаются мелкими деталями реализации
но киллер-фичи для всех сценариев нет

Evgeniy
05.03.2018
19:54:51
сейчас накидаю вариант

Bohdan
05.03.2018
19:55:15
вариант с валидатором мне не очень нравится именно из-за размазанности
то есть правила у меня отдельно, сущность отдельно
но правила - это ведь бизнес-логика

Alan
05.03.2018
19:55:43
ну смотря какие правила

Bohdan
05.03.2018
19:55:51
те, о которых говорим)
проверка связанных сущностей, статусов, полей и тд
совместимости всякие, короче

da horsie
05.03.2018
19:57:43

Bohdan
05.03.2018
19:58:09
все равно до меня не доходит? можешь какой-то простой пример набросить?
не кодом
чисто логику

Evgeniy
05.03.2018
19:58:38
https://pastebin.com/axB5K9Lt

Google

Bohdan
05.03.2018
19:58:39
я не вижу того, как результат операции должен решать на основании своего (ведь так?) стейта, что делать дальше коду

Evgeniy
05.03.2018
19:58:42
вот еще вариант
только как минус
пришлось методы isStarted и unpaidInvoicesPresent сделать публичными
если выносим во внешний класс проверку
можно проверку оставить в этом классе и возвращать объект добавляя ошибки в массив
сделав метод добавления как в прошлый раз

Bohdan
05.03.2018
20:00:14
но это уже было

Evgeniy
05.03.2018
20:00:26
ога
ну идеального решения нет
я бы брал скорей всего предпоследний

Bohdan
05.03.2018
20:01:19
последний вроде и интересен

Evgeniy
05.03.2018
20:01:30
где методы у контракта скрыты и внутри код проверок
но если он станет сильно разрастаться по проверкам

Bohdan
05.03.2018
20:01:40
но отдельный класс по сути не несет никакой больше пользы, кроме разделения кода

Evgeniy
05.03.2018
20:01:45
их можно вынести во вне

Bohdan
05.03.2018
20:01:54
и он не реюзабелен

Evgeniy
05.03.2018
20:02:08
да его реюзабельность = 0
мне тоже предпоследний вариант нравиться
но могут быть минусы если проверок слишком дофига

Google

Evgeniy
05.03.2018
20:02:56
неудобно их каждый раз скролить эту лапшу
хотя можно refactoring in method применить
и не выносить в отдельный класс
опять же дело вкуса

Bohdan
05.03.2018
20:05:02
да, сложно к чему-то придти

Evgeniy
05.03.2018
20:05:31
предпоследний вариант тебе норм будет, если будут усложнять изменишь потом как надо
хотя это мое имхо
и возмно выкинуть исключение это более правильно и я ничего не смыслю
причем кстате TerminateResult можно реюзать и в других действиях))
он в себе хранит инфу есть ли ошибки и текста ошибок))))
?

da horsie
05.03.2018
20:09:56

Evgeniy
05.03.2018
20:11:25
но вообще если объект на выходе не bool а другой объект возвращает
то вот тут надо его возвращать уже будет в случае успеха методом
но это совсем другая история

Bohdan
05.03.2018
20:13:40

da horsie
05.03.2018
20:14:06
ну у меня в голове крутились идеи, что например если надо какие-то еще действия совершать как единую транзакцию, их можно было бы как-то зашить в объект результата. ну типа result.notifyAdmins(emailSender)
но это такое

Evgeniy
05.03.2018
20:15:32
а почему их в объект результата

Google

Evgeniy
05.03.2018
20:15:42
а не в методе где его возвращают делать ?

da horsie
05.03.2018
20:15:48
ну и я говорю, что это так себе пример

Evgeniy
05.03.2018
20:16:12
объект результа с продолжением действий у меня было на практики
когда задача завершается фоновая и грубо говоря у нас 3 ситуации

da horsie
05.03.2018
20:16:42
что-то типа result.finalize(some args)

Evgeniy
05.03.2018
20:16:54
успешно, фатально(не успешно), и надо отложить в конец очереди на время

da horsie
05.03.2018
20:16:56
но это слишком некокретно все
забейте, короче)

Evgeniy
05.03.2018
20:17:09
так вот в 3 этих ситуация в зависимости от задачи надо делать разные действия
я такой вопрос решил в объектах результатах
вынес результат в интерфейс и сделал разные объекты

da horsie
05.03.2018
20:17:41
ну во
вполне себе пример

Evgeniy
05.03.2018
20:18:07
я же говорю было в практики но тут чуть сложней
я не ябу какое действие я запускаю в целом
и что оно возвращает)
потому что фоновых тасков у нас довольно много
при этом например время ожидание можно в таске указать типо return new Waiting(60);

da horsie
05.03.2018
20:20:30
угу

f4rt~
05.03.2018
20:20:56
где Waiting { public function __construct($sec) { sleep($sec); }} ?

da horsie
05.03.2018
20:20:58
если результат операции это конкретная штука из доменной области, есть шансы, что туда удобно будет какую-то логику еще засунуть