functional-first web development rodrigo vidal f# developer @ vtex twitter & github:...

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

Upload: henrique-neto-quintanilha

Post on 07-Apr-2016

214 views

Category:

Documents


0 download

TRANSCRIPT

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

Functional-FirstWeb Development

Rodrigo VidalF# Developer @ VTEX

Twitter & Github: @rodrigovidal

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

F# é Open Source

github.com/Microsoft/visualfsharp

github.com/fsprojects/

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

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

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

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#

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

Testes

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

Buildando seu projeto com FAKE

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

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

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

Por que nós usamos F# na VTEX?

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

NULL

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

F# Elimina classes inteiras de Erros

Em F# tudo é imutável e mesmo as classes não podem ser nulas*

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

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

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

Visualização

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

Pipeline

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

Record Types

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

High Order Functions

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

let ok, result = recoverConfigurations () if okthen launch result.xelse log result.s

Boolean Blindness

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

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

Boolean Blindness

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

DEMO Web Api

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

Requisito

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

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

Modelagem de Domínio

type User = {FirstName: stringLastName: stringEmail: stringPassword: stringIsActivate : bool

}

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

Modelagem de Domínio

type User = {FirstName: string50LastName: string30

optionEmail: EmailPassword: Password

}

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

String Oriented Programming

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

Units of Measure

type Product = { Name : string Price : decimal Quantity : decimal}

type Product = { Name : string50 Price : decimal<real> Quantity : decimal<quantity>}

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

A abordagem Funcional para tratamento de Erros

• O Caminho Feliz• O Caminho Triste

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

O Caminho Feliz

string CreateUser(Request request) {validateRequest(request);verifyEmail(request);db.createUser(request);

smtpServer.sendEmail(request.Email)return “OK”;

}

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

O Caminho Feliz em F#

let createUser = validateRequest>> verifyEmail>> db.createUser>> smtpServer.sendEmail>> returnMessage

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

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”;

}

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

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”;

}

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

O Caminho Tristestring 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”;

}

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

O Caminho Tristestring 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”;

}

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

É possível manter a elegância do Caminho Feliz

no Caminho Triste?

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

Pense nas funções como um Fluxo

let createUser = validateRequest>> verifyEmail>> db.createUser>> smtpServer.sendEmail>> returnMessage

Este era o código do Caminho Feliz

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

Pense nas funções como um Fluxo

let createUser = validateRequest>> verifyEmail>> db.createUser>> smtpServer.sendEmail>> returnMessage

Este é o código do Caminho Triste

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

Design não funcional

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

Funções

Como uma função pode ter mais de uma saída?

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

type Result = | Success|

ValidationError| CreateError| SmtpError

type Result = | Success| Failure

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

type Result = | Success| Failure

type Result<'TEntity> = | Success of 'TEntity| Failure of string

type Result<'Tentity, 'TFailure> = | Success of 'TEntity| Failure of 'Tfailure list

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

Retornando um Resultlet validateInput input =

if input.name = “” thenFailure “Name must not be blank”elif input.email = “” thenFailure “Email must not be

blank”elseSuccess input

type Input = {name : stringemail :

string}

type Result<Input> = | Success of Input| Failure of string

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

let validateInput input = if input.name = “” then

Failure NameMustNotBeBlankelif Regex(emailP, input.email)

thenFailure EmailNotValid

else Success input

type Result<Input, ‘TFailure> =

| Success of Input| Failure of ‘TFailure

type ErrorMessage = |

NameMustNotBeBlank | EmailNotValid of

email

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

Lidando com Result + Async

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

O padrão importa!

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

Obrigado!