Slide 1

Slide 1 text

JavaScript Funcional @lupomontero / LimaJS 21/03/2018 Fol m ?

Slide 2

Slide 2 text

Qué es FP? Functional Programming is a programming paradigm, meaning that it is a way of thinking about software construction based on some fundamental, defining principles […] Fuente: https://medium.com/javascript-scene/master-the-javascript-interview-what- is-functional-programming-7f218c68b3a0#.xx2uha5ki

Slide 3

Slide 3 text

Declarativo vs Imperativo Qué vs cómo… Recursión/abstracción de control de flujo vs iteración… Aplicación de args vs mutación de valores... Composición vs herencia

Slide 4

Slide 4 text

Declarativo vs imperativo const intersection = (a, b) => a.filter(value => b.indexOf(value) > -1); function intersection(a, b) { var result = []; for (var i = 0; i < a.length; i++) { for (var j = 0; j < b.length; j++) { if (a[i] === b[j]) { result.push(a[i]); break; } } } return result; }

Slide 5

Slide 5 text

Principios de FP ● Uso de Funciones Puras ● Composición de Funciones / HOFs ● Evitar estado cambiante (inmutabilidad) ● Evitar el estado compartido

Slide 6

Slide 6 text

Funciones puras => transparencia referencial ● Dados los mismos inputs siempre retorna lo mismo ● No tiene efectos colaterales // Impura const time = () => Date.now(); time(); // => 1521674192729 time(); // => 1521674402875 // Pura const sum = (a, b) => (a + b); sum(2, 3); // => 5 sum(2, 3); // => 5

Slide 7

Slide 7 text

HOFs const greetPart = greeting => name => `${greeting}, ${name}` const greetHello = greetPart('Hello') greetHello('Heidi') // => 'Hello, Heidi'

Slide 8

Slide 8 text

Aplicación parcial const partial = (fun, ...args) => (...newArgs) => fun(...args.concat(newArgs)); const greeter = (greeting, separator, emphasis, name) => `${greeting}${separator}${name}${emphasis}`; const greetHello = partial(greeter, 'Hello', ', ', '.'); greetHello('Heidi'); // => 'Hello, Heidi.'

Slide 9

Slide 9 text

Composición (React) const withFooProp = WrappedComponent => props => const Bar = props =>
{console.log(props)}
; const Baz = withFooProp(Bar) // augmented version of Bar const App = props => (
);

Slide 10

Slide 10 text

Inmutabilidad const Bar = props => (
{props.foo}/{props.baz} { props.foo = 'WTF'; }} >❤
);

Slide 11

Slide 11 text

class Bar extends React.Component { constructor(props) { super(props); this.state = { count: 0 }; } render() { return (
{this.props.foo}/{this.props.baz}/{this.state.count} { // this.state.count += 1; // WRONG!! this.setState(prevState => ({ count: prevState.count + 1 })); }} >❤
); } }

Slide 12

Slide 12 text

Evitar estado compartido function Foo(opts) { this.x = opts.x; } Foo.prototype.bar = function () { return this.x + 1; }; Foo.prototype.baz = function () { this.x = 0; };

Slide 13

Slide 13 text

FP vs OOP Ventajas FP (rama declarativa) ● Flexibilidad ● Predictabilidad ● Aislamiento/reusabilidad/testabil idad?? (pedacitos más chiquitos e independientes) ● Tiende a ser más conciso y expresivo Ventajas OOP (rama imperativa) ● Más estricto ● Modelo jerárquico intuitivo ● Patrones conocidos ● ...

Slide 14

Slide 14 text

By the way... JavaScript es un lenguaje de ❤ funcional