[#] [Перевод] Железнодорожно-ориентированное программирование. Обработка ошибок в функциональном стиле
habrabot(difrex,1) — All
2017-10-09 10:30:06


![][1]

> Как пользователь я хочу изменить ФИО и email в системе.
Для реализации этой простой пользовательской истории мы должны получить запрос, провести валидацию, обновить существующую запись в БД, отправить подтверждение на email пользователю и вернуть ответ браузеру. Код будет выглядеть примерно одинаково на C#:

string ExecuteUseCase()
{
var request = receiveRequest();
validateRequest(request);
canonicalizeEmail(request);
db.updateDbFromRequest(request);
smtpServer.sendEmail(request.Email);
return "Success";
}

и F#:

let executeUseCase =
receiveRequest
>> validateRequest
>> canonicalizeEmail
>> updateDbFromRequest
>> sendEmail
>> returnMessage


## Отклоняясь от счастливого пути


![][2]

Дополним историю:
> Как пользователь я хочу изменить ФИО и email в системе
> И увидеть сообщение об ошибке, если что-то пойдет не так.

## Что же может пойти не так?


![][3]

1. ФИО может оказаться пустым, а email – не корректным
2. пользователь с таким id может быть не найден в БД
3. во время отправки письма с подтверждением SMTP-сервер может не ответить
4. ...

### Добавим код обработки ошибок


string ExecuteUseCase()
{
var request = receiveRequest();
var isValidated = validateRequest(request);
if (!isValidated) {
return "Request is not valid"
}
canonicalizeEmail(request);
try {
var result = db.updateDbFromRequest(request);
if (!result) {
return "Customer record not found"
}
} catch {
return "DB error: Customer record not updated"
}

if (!smtpServer.sendEmail(request.Email)) {
log.Error "Customer email not sent"
}

return "OK";
}
Вдруг вместо 6 мы получили 18 строк кода с ветвлениями и большей вложенностью, что сильно ухудшило читаемость. Каким будет функциональный эквивалент этого кода? Он выглядит абсолютно также, но теперь в нем есть обработка ошибок. Можете мне не верить, но, когда мы доберемся до конца, вы убедитесь, что это действительно так.
[Читать дальше →][4]

[1]: https://habrastorage.org/webt/59/da/2b/59da2b7193313753752158.gif
[2]: https://habrastorage.org/webt/59/da/2d/59da2d8f005bf618301003.jpeg
[3]: https://habrastorage.org/webt/59/da/2f/59da2f754e3bf250799737.png
[4]: https://habrahabr.ru/post/339606/?utm_source=habrahabr&utm_medium=rss&utm_campaign=feed_posts#habracut