Size: a a a

2020 August 11

АС

Альберт Степанцев... in PHP
Алексей Гевондян
но думается, что тут разумнее сделать что-то вроде $someData->getValue(), $someData->isValid(); $someData->getValidationErrors();
в вашем коде проблема
у вас существует невалидный объект с неопределенным внутренним состоянием
источник

АС

Альберт Степанцев... in PHP
Алексей Гевондян
return new Exception('Неверные данные') ?) это 5, мне кажется)
фигню какую-то несете
источник

KN

Kirill Nesmeyanov in PHP
фига, @fes0r, ты живой!
источник

AC

A C in PHP
Алексей Гевондян
return new Exception('Неверные данные') ?) это 5, мне кажется)
не, ну упарываться конечно не надо) этого не предлагали
источник

АГ

Алексей Гевондян... in PHP
getValue(): ?string, где null - признак отсутствия валидного значения
источник

AC

A C in PHP
ну тогда наллы обрабатывать гемор, хз
источник

АС

Альберт Степанцев... in PHP
A C
не, ну упарываться конечно не надо) этого не предлагали
я писал в своем коде yield new Exception, кстати ))
источник

AC

A C in PHP
для меня налл отсутствие значения — а не ошибка
источник

АГ

Алексей Гевондян... in PHP
Альберт Степанцев
фигню какую-то несете
вот и я о том, что это какая-то дичь)
источник

АС

Альберт Степанцев... in PHP
Алексей Гевондян
getValue(): ?string, где null - признак отсутствия валидного значения
проблема не пропала
объект продолжает существовать
невалидный
источник

AC

A C in PHP
Альберт Степанцев
я писал в своем коде yield new Exception, кстати ))
ну если не страдали, то и бог с ним, хотя я бы не стал)
источник

АГ

Алексей Гевондян... in PHP
Альберт Степанцев
я писал в своем коде yield new Exception, кстати ))
хорошо хоть не trhow 'Ошибка у вас'; )
источник

АГ

Алексей Гевондян... in PHP
Альберт Степанцев
проблема не пропала
объект продолжает существовать
невалидный
ну это же объект входных данных, который на вход получает что угодно, и определяет, есть значение или есть инфа об ошибке
источник

АС

Альберт Степанцев... in PHP
Алексей Гевондян
getValue(): ?string, где null - признак отсутствия валидного значения
получается, у вас примерно так:

$int = new IntOrNullValue('fuck');
$int->getValue(); // null


что неверно
потому что значение тут не null
а вообще отсутствие какого-либо валидного значения
источник

A

Aleksandr Khristenko in PHP
Альберт Степанцев
или вы знаете другой способ не допустить создание объекта, в случае невалидности входящих данных?
смарт конструктор, который возвращает что-то типа Maybe/Either
источник

AC

A C in PHP
ну в пхп8, можно будет обвешаться ?-> вместо этих монад)
источник

SP

Sergey Protko in PHP
Алексей Гевондян
а для чего исключения в языке завели?
что бы обрабатывать исключительные! ситуации. Например если у тебя есть функция которая принимает на вход данные и данные могут быть невалидны, то для этой функции невалидные данные это НЕ исключительная ситуация. И лучше вернуть ошибку явно как результат работы. В тоже время функция которая не смогла законнектиться к базе будет такое воспринимать уже как исключительную ситуацию.

Ну а дальше как бы дизайн языка решает как чего удобнее или неудобнее. В Го пошли по пути максимально явной и тупой проверки на ошибку что бы уменьшить количество проблем. В Java исключения сделали частью интерфейса и тебе их надо явно обрабатывать... но оно не покрывает всех кейсов.

Основной довод ЗА исключения - что это удобно. Кинул ошибку, и синтаксис языка обычно тебе позволяет это дело различать

try {
   $result = fn();
} catch (Throwable) {
   // не удалось
}


в чем-то это похоже на варианты в том же го, только там тебе надо руками по стэктрейсу прокидывать ошибку.

[$result, $error] = fn();
if ($error) {
   return [null, $error]
}


Кто-то называет существенным плюсом тут то, что люди начинают думать о глубине стэк трейса или более явно конвертировать ошибки... Но никто не спорт что лень такое писать везде. Хочется сахарку. Потому можно видеть пропозалы в стиле:

val result, ^ = fn()


которое автоматом отправит ошибку выше по трейсу.

В целом же основная проблема исключений - когда их используют как goto. мол

try {
  $this->tryThis();
} catch (YouShouldDoThisInstead $e) {
 $this->doThis();
} catch (OrYouShouldDoThat $e) {
  $this->doThat();
}


то есть грубо говоря у нас тут уже на исключениях выстраивается логика.
источник

AC

A C in PHP
но решение проблемы в этом чёт не совсем вижу)
источник

KN

Kirill Nesmeyanov in PHP
Sergey Protko
что бы обрабатывать исключительные! ситуации. Например если у тебя есть функция которая принимает на вход данные и данные могут быть невалидны, то для этой функции невалидные данные это НЕ исключительная ситуация. И лучше вернуть ошибку явно как результат работы. В тоже время функция которая не смогла законнектиться к базе будет такое воспринимать уже как исключительную ситуацию.

Ну а дальше как бы дизайн языка решает как чего удобнее или неудобнее. В Го пошли по пути максимально явной и тупой проверки на ошибку что бы уменьшить количество проблем. В Java исключения сделали частью интерфейса и тебе их надо явно обрабатывать... но оно не покрывает всех кейсов.

Основной довод ЗА исключения - что это удобно. Кинул ошибку, и синтаксис языка обычно тебе позволяет это дело различать

try {
   $result = fn();
} catch (Throwable) {
   // не удалось
}


в чем-то это похоже на варианты в том же го, только там тебе надо руками по стэктрейсу прокидывать ошибку.

[$result, $error] = fn();
if ($error) {
   return [null, $error]
}


Кто-то называет существенным плюсом тут то, что люди начинают думать о глубине стэк трейса или более явно конвертировать ошибки... Но никто не спорт что лень такое писать везде. Хочется сахарку. Потому можно видеть пропозалы в стиле:

val result, ^ = fn()


которое автоматом отправит ошибку выше по трейсу.

В целом же основная проблема исключений - когда их используют как goto. мол

try {
  $this->tryThis();
} catch (YouShouldDoThisInstead $e) {
 $this->doThis();
} catch (OrYouShouldDoThat $e) {
  $this->doThat();
}


то есть грубо говоря у нас тут уже на исключениях выстраивается логика.
смотря какая логика
источник

АГ

Алексей Гевондян... in PHP
Альберт Степанцев
получается, у вас примерно так:

$int = new IntOrNullValue('fuck');
$int->getValue(); // null


что неверно
потому что значение тут не null
а вообще отсутствие какого-либо валидного значения
ну пусть будет getValue(): int, кидающий исключение в случае отсутствия валидного значения. тоже годно.
источник