
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
ну или костыльно попробовать закрыть свалиться в исключение понять что это нормально и вывести ошибку

Bohdan
05.03.2018
19:22:21
вопрос в том, что и как я верну

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

Like
05.03.2018
19:22:57

da horsie
05.03.2018
19:23:03

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

Google

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

Like
05.03.2018
19:23:23

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
да

Like
05.03.2018
19:26:33

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
собственно я бы выбирал из последний двух
ну там можно и массив вернуть пустой))
?
и использовать его в качестве контейнера с ошибками)
но это слишком магически