@oop_ru

Страница 545 из 785
da horsie
05.03.2018
19:21:00
ну скорее код результата, потому что это предусмотренный случай

Like
05.03.2018
19:21:04
Я так и не понял, чем плох вариант с \Exception и методом toString()

Bohdan
05.03.2018
19:21:05
вот именно

случай предусмотренный

Google
da horsie
05.03.2018
19:21:27
имхо тут никаких исключений не должно быть

Bohdan
05.03.2018
19:21:27
мы знаем, что такое возможно

da horsie
05.03.2018
19:21:32
нормальый флоу

Evgeniy
05.03.2018
19:21:46
если это предусмотренный случай то предусмотри это в бизнес логике до вызова закрытия проверить надо

Like
05.03.2018
19:22:09
нормальый флоу
Ну это если у человека есть метод который проверяет: можно закрыть контракт или нет То здесь как бы bool вполне себе логичен А если у него все в одной куче?

Evgeniy
05.03.2018
19:22:18
ну или костыльно попробовать закрыть свалиться в исключение понять что это нормально и вывести ошибку

Evgeniy
05.03.2018
19:22:48
в $contract->close(); исключение

Bohdan
05.03.2018
19:23:15
я ведь тогда могу проверить извне

Google
Bohdan
05.03.2018
19:23:17
дернуть метод-проверку

Like
05.03.2018
19:23:23
bool мне не нравится, он только два варианта предусматривает
Задача метода дать ответ "можно закрыть N контракт или нет"

Bohdan
05.03.2018
19:23:27
и в зависимости от ответа дернуть закрытие или не дернуть

Like
05.03.2018
19:23:30
Вроде бы bool не плох

Evgeniy
05.03.2018
19:23:32
if (!$contract->isHaveOpenInvoices()) $contract->close();

Bohdan
05.03.2018
19:23:38
могу его же дернуть и изнутри но это слегка изврат

можно и так

da horsie
05.03.2018
19:23:49
Evgeniy
05.03.2018
19:23:54
так если его дернут не проверив

это исключение

типо предусмотренна проверка

до закрытия

но вообще тогда проверка вытекает из сущности

Bohdan
05.03.2018
19:24:42
но можно и public function terminateContract() : bool { if ($this->unpaidInvoicesPresent()) { return false; } $this->terminate(); return true }

допустим так (буль фигня, но писать больше неудобно)

Evgeniy
05.03.2018
19:25:44
можно и так

но terminate может выкинуть исключение в теории

Bohdan
05.03.2018
19:26:25
внутренний?

Evgeniy
05.03.2018
19:26:30
да

Google
Bohdan
05.03.2018
19:26:39
окей, давай переделаю

Evgeniy
05.03.2018
19:26:40
в теории ты его приватным сделаешь скорей всего

так не надо его оборачивать ни во что

твой вариант имхо правильный

Bohdan
05.03.2018
19:27:01
public function terminateContract() : bool { if ($this->unpaidInvoicesPresent()) { return false; } $this->status = 'terminated'; return true }

злой гуанокод, но пофиг

(у меня, кстати, такой вариант, без вложенного terminate - проверка есть всегда

и без проверки я не закрою контракт

потому мне и не нравится вариант с hasUnpaidInvoices - так все равно можно выстрелить себе в ногу

я сейчас вообще прихожу к плавному написанию домена в запрещающем стиле

Evgeniy
05.03.2018
19:28:34
я бы вот так делал

https://pastebin.com/r0JUAFsx

Bohdan
05.03.2018
19:28:53
а что изменится?)

тем более

если вызов terminate будет происходить только из terminateContract

тем более нейминг (незачем повторять Contract с учетом того, что это у нас уже в имени класса присутствует)

Evgeniy
05.03.2018
19:31:49
https://pastebin.com/18en9sLK

вот тако пример но вообще я бы мб разделил действия по отмене в объект

который бы отменял контракт

потомучто мне кажется потом еще правила добавятся

Google
Evgeniy
05.03.2018
19:32:54
и заказчик захочет знать почему именно он не отменен

Bohdan
05.03.2018
19:34:10
преждевременная оптимизация) "почему именно" - да, можно завернуть, конечно но 1. сделать это позже несложно 2. разные классы исключений/возвращаемых результатов, как коняш предлагал и соответственно можно уже на основании них проверять все

а так мы все равно с bool далеко не уедем

Evgeniy
05.03.2018
19:36:12
у тебя несколько проверок могут быть

например не начал ли контракт действия

или не закончил ли он действия

помимо неоплаченных счетов

Bohdan
05.03.2018
19:41:31
могут но опять-таки - мы упираемся в возврат bool

и неизвестно,как узнать, почему он не закрылся

da horsie
05.03.2018
19:43:39
возвращай объект "результат операции" постарайся всю условную логику инкапсулировать в нем

Evgeniy
05.03.2018
19:44:15
https://pastebin.com/Hy6ebHZh

я бы вот так мб делал

лапша только в одном месте

но она легко на валидатор меняется

и потом из валидатора ошибки забирть

da horsie
05.03.2018
19:45:03
фронтв первую очередь не должен показывать кнопку, а во вторую - должен быть готов к ситуации "не получилось закрыть" потому что у тебя распределенная система и race conditions неизбежны

Evgeniy
05.03.2018
19:45:24
да я писал про фронт

Bohdan
05.03.2018
19:45:26
пока не говорим о фронте

Evgeniy
05.03.2018
19:45:39
я вот чисто со стороны бэкенда написал

и там ниже ответ отправлять клиенту

Google
Evgeniy
05.03.2018
19:46:01
мб наследовался бы от RuntimeException

если хочешь можешь убрать наследование от исключения и возвращать $errors

Bohdan
05.03.2018
19:46:53
ну вот тут мы пришли к возврату объекта результата

Evgeniy
05.03.2018
19:47:04
и проверять наличие ошибок через $error->getErrors(); и в зависимости от возврата делать реакцию

Bohdan
05.03.2018
19:47:06
da horsie
05.03.2018
19:47:19
блин никак не могу вспомнить видос. там про ситуацию "юзер положил товар в корзину, а мы уже успели изъять его из продажи"

Bohdan
05.03.2018
19:48:15
ну так это ведь собственно проверка того, как завершится операция

если "результат" - это нечто вроде DTO - тогда не особо складывается

da horsie
05.03.2018
19:48:44
ну так это ведь собственно проверка того, как завершится операция
ну смысл в том, что проверка должна быть только в одном месте, вот и пусть она будет внутри этого объекта

Bohdan
05.03.2018
19:50:03
но ведь она относится к логике самого объекта/доменной модели

Evgeniy
05.03.2018
19:50:11
вот вариант с возвратом результата

https://pastebin.com/DQhzHuZ5

Maksim
05.03.2018
19:50:14
блин никак не могу вспомнить видос. там про ситуацию "юзер положил товар в корзину, а мы уже успели изъять его из продажи"
ну тут проверка в процессе чекаута будет. Если после чекаута, то ты его изъять уже не сможешь, но сможешь сделать возврат (за свой счёт уже правда)

Evgeniy
05.03.2018
19:50:16
и обработкой

Bohdan
05.03.2018
19:50:40
тут результат - это контейнер

в таком виде я еще понимаю логику

Evgeniy
05.03.2018
19:50:48
собственно я бы выбирал из последний двух

ну там можно и массив вернуть пустой))

?

и использовать его в качестве контейнера с ошибками)

но это слишком магически

Страница 545 из 785