Coding by composition

Outline

  1. ¿Qué es la composición?
    1. Definición
    2. Leyes
  2. Herramientas para la composición
    1. Point Free
    2. Función traza
    3. Currificación y aplicavión parcial

¿Qué es la composición?

const compose = (f, g) => x => f(g(x))
const compose = (f, g, h, i, j) => x => f(g(h(i(j(x)))))

¿Qué es la composición?

const orderByAge = sortBy(prop('age'));
const getOlderCat = last,
const getColor = prop('color')
const myCats = [
   {
   	name: 'Misis',
    color: 'white',
    age: 7
   }, {
   	name: 'Txomsko',
    color: 'black',
    age: 4
   }, {
   	name: 'Hermes',
    color: 'grey',
    age: 5
   }
]
white

¿Qué es la composición?

oderByAge
getOlderCat
getColor

¿Qué es la composición?

const myOrderedCats = sortBy(prop('age'), myCats);
const myOlderCat = last(myOrderedCats);
const myOlderCatColor = prop('color', myOlderCat);
const getMyOlderCatColor = x => prop('color',last(sortBy(prop('age'))))(x);

¿Qué es la composición?

const getMyOlderCatColor = compose(prop('color'), last, sortBy(prop('age')))

¿Qué es la composición?

  • Tuberías que definen el flujo de operaciones por los que pasan los datos para obtener el resultado que queremos
  • Definibles sin necesidad de tener los datos
  • La composición siempre genera funciones

Ley Asociativa

const composedF1 = (f, g, h) => compose(f, g, h);
const composedF2 = (f, g, h) => compose(f, compose(g, h));
const composedF3 = (f, g, h) => compose(compose(f, g), h);

composedF3 = composedF2 = composedF1

Ley Asociativa

const addFive = x => x + 5;
const addTwo = x => x + 2;
const addSeven = x => x + 7;

const composedF1 = compose(addSeven, addTwo, addFive);
// x => x + 14;
const composedAddFiveAndTwo = compose(addTwo, addFive);
// x => x + 7;
const composedF2 = compose(addSeven, composedAddFiveAndTwo);
// x => x + 14;
const composedAddTwoAndSeven = conpose(addSeven, addTwo);
// x => x + 9;
const composedF3 = compose(composedAddTwoAndSeven, addFive);
// x => x + 14;
oderByAge
getOlderCat
getColor

Ley Asociativa

oderByAge
getOlderCat
getColor

Ley Asociativa

oderByAge
getOlderCat
getColor

Ley Asociativa

Ley Asociativa

  • La propiedad asociativa nos permite flexibilidad y equivalencia
  • Las funciones pueden ser agupadas en el orden que más nos convenga obteniendo resultados equivalentes por cualquiera de los caminos

Herramientas

Point Free

const getMyCatCapitalName = cat => cat.name.toUppperCase();

const getCapitalName = compose(toUpperCase, prop('name'));

Point Free

  • Las funciones nunca mencionan los datos sobre los que operan
  • Eliminamos código innecesario
  • Nos mantenemos genéricos y concisos

Algunas veces puede ofuscar el código

Función traza

const trace = curry((tag, x) => {
    console.log(tag, x);
    return x;
})
  • Es una función impura
  • Nos ayuda a depurar nuestro código
  • No interfiere en el flujo de datos
oderByAge
getOlderCat
getColor

Función traza

trace('oldest cat')
{
   name: 'misis',
   age: 7,
   color: 'white'
}

Currificación y aplicación parcial

La currificación y aplicación parcial nos permiten preparar cada función para coger su "data" operar sobre él y pasarlo al siguiente eslabón

 

Currificación y aplicación parcial

const prop = curry((prop, obj) => obj[prop]);

const getColor = prop('color')

Conclusiones

  • La composición conecta nuestras funciones como una serie de tuberías, por las que fluyen los datos para construir nuestra aplicación.
  • La composición como principio de diseño de la aplicación mantiene nuestra aplicación simple y razonable.

Coding by composition

By Henar Hernandez

Coding by composition

  • 91