![][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