A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Functional-First Web Development Rodrigo Vidal F# VTEX Twitter &

Apresentações semelhantes


Apresentação em tema: "Functional-First Web Development Rodrigo Vidal F# VTEX Twitter &"— Transcrição da apresentação:

1 Functional-First Web Development Rodrigo Vidal F# Developer @ VTEX Twitter & Github: @rodrigovidal

2

3 F# é Open Source github.com/Microsoft/visualfsharp github.com/fsprojects/

4 Monads, Functor, Traversables, Lens, Applicative, Monoids, Arrows, Monad Transformers..

5 7 formas de baixo risco para usar REPL Testes de unidade, integração ou aceitação Scripts Prototipar Build Gerenciamento de Pacotes Escrever uma pequena parte do sistema em F#

6 Testes

7 Buildando seu projeto com FAKE

8 Funcionalidades Concisa Imutabilidade por default Funções de Primeira Classe Composição Funções “curried” por default Pattern Matching Record Types Pipes Discriminated Unions Type Providers Computation Expressions Poderoso Type System Active Patterns

9 Por que nós usamos F# na VTEX?

10

11 NULL

12 F# Elimina classes inteiras de Erros Em F# tudo é imutável e mesmo as classes não podem ser nulas*

13 http://theburningmonk.com/2014/12/seven-ineffective-coding-habits-many-f-programmers-dont-have/

14 Visualização

15 Pipeline

16 Record Types

17 High Order Functions

18 let ok, result = recoverConfigurations () if ok then launch result.x else log result.s Boolean Blindness

19 let result = recoverConfigurations () match result with | Success x -> launch x | Failure s -> log s Boolean Blindness

20 DEMO Web Api

21 Requisito “Ao cadastrar um usuário, enviar uma email solicitando que seu login seja ativado.”

22 Modelagem de Domínio type User = { FirstName: string LastName: string Email: string Password: string IsActivate : bool }

23 Modelagem de Domínio type User = { FirstName: string50 LastName: string30 option Email: Email Password: Password }

24 String Oriented Programming

25 Units of Measure type Product = { Name : string Price : decimal Quantity : decimal } type Product = { Name : string50 Price : decimal Quantity : decimal }

26 A abordagem Funcional para tratamento de Erros O Caminho Feliz O Caminho Triste

27 O Caminho Feliz string CreateUser(Request request) { validateRequest(request); verifyEmail(request); db.createUser(request); smtpServer.sendEmail(request.Email) return “OK”; }

28 O Caminho Feliz em F# let createUser = validateRequest >> verifyEmail >> db.createUser >> smtpServer.sendEmail >> returnMessage

29 O Caminho Triste string Create(Request request) { var isValid = validateRequest(request); if (!isValid) { return “Request is not valid” } verifyEmail(request); db.createUser(request); smtpServer.sendEmail(request.Email) return “OK”; }

30 O Caminho Triste string Create(Request request) { var isValid = validateRequest(request); if (!isValid) { return “Request is not valid”; } verifyEmail(request); var result = db.createUser(request); if (!result) { return “Conflict”; } smtpServer.sendEmail(request.Email) return “OK”; }

31 O Caminho Triste string Create(Request request) { var isValid = validateRequest(request); if (!isValid) { return “Request is not valid”; } verifyEmail(request); try { var result = db.createUser(request); if (!result) { return “Conflict”; } } catch { return “DB error: User record not created” } smtpServer.sendEmail(request.Email) return “OK”; }

32 O Caminho Triste string Create(Request request) { var isValid = validateRequest(request); if (!isValid) { return “Request is not valid”; } verifyEmail(request); try { var result = db.createUser(request); if (!result) { return “Conflict”; } } catch { return “DB error: User record not created” } if (!smtpServer.sendEmail(request.Email)) { log.Error(“User email not sent.”); } return “OK”; }

33 É possível manter a elegância do Caminho Feliz no Caminho Triste?

34 Pense nas funções como um Fluxo let createUser = validateRequest >> verifyEmail >> db.createUser >> smtpServer.sendEmail >> returnMessage Este era o código do Caminho Feliz

35 Pense nas funções como um Fluxo let createUser = validateRequest >> verifyEmail >> db.createUser >> smtpServer.sendEmail >> returnMessage Este é o código do Caminho Triste

36 Design não funcional

37 Funções Como uma função pode ter mais de uma saída?

38 type Result = | Success | ValidationError | CreateError | SmtpError type Result = | Success | Failure

39 type Result = | Success | Failure type Result = | Success of 'TEntity | Failure of string type Result = | Success of 'TEntity | Failure of 'Tfailure list

40 Retornando um Result let validateInput input = if input.name = “” then Failure “Name must not be blank” elif input.email = “” then Failure “Email must not be blank” else Success input type Input = { name : string email : string } type Result = | Success of Input | Failure of string

41 let validateInput input = if input.name = “” then Failure NameMustNotBeBlank elif Regex(emailP, input.email) then Failure EmailNotValid else Success input type Result = | Success of Input | Failure of ‘TFailure type ErrorMessage = | NameMustNotBeBlank | EmailNotValid of email

42

43 Lidando com Result + Async

44 O padrão importa!

45 Obrigado!


Carregar ppt "Functional-First Web Development Rodrigo Vidal F# VTEX Twitter &"

Apresentações semelhantes


Anúncios Google