Un conjunto de jugadas, que a lo largo de mi experiencia desarrollando, han servido para mantener sana la salud de nuestro código. Preparada en conjunto con #MercadoLibre para el #DevFest19 #DevFestSantiago.
archivos Convenciones de escritura (linters) Muchos más! Requerimientos Implementación Hay muchos factores que Hay muchos factores que influyen en esto! influyen en esto!
y y concisos concisos... ... Muy probablemente nos Muy probablemente nos cueste más "romper" el cueste más "romper" el diseño o la arquitectura diseño o la arquitectura
Los componentes "hacen demasiado" Conocen muchas muchas props Tienen más de un nivel de abstracción Son "booleano-dependientes" (más de esto en breve) Cambian por las razones equivocadas Nos convertimos en todo lo que juramos destruir: que todo ocurra en el mismo lugar
más limpio más limpio const Layout = () => ( <div className="layout"> <Header /> <ProductDescr /> <SomeCallToAction /> <Footer /> </div> ) Fácil de leer Es "pequeño" Se entiende lo que hace
= (props) => ( <div> {props.succeeded ? <Alert success text='Vamo!' /> : <Alert failure text='Y, bueno... esto es incómodo' /> } </div> Si tenemos un segmento de código así: Esperamos ver en la UI algo como esto:
es que en la implementación hay que hacerse cargo implementación hay que hacerse cargo de de num_bools num_bools combinaciones, cuando realmente combinaciones, cuando realmente hay hay solo solo num_bools num_bools estados posibles estados posibles válidos! válidos! 2 2
“ Flag arguments are ugly. Passing a boolean into a function is a truly terrible practice. It immediately complicates the signature of the method, loudly proclaiming that this function does more than one thing. It does one thing if the flag is true and another if the flag is false!"
API del componente La implementación sigue el principio de mínima sorpresa Cada componente que encapsula hace sólo una cosa La implementación de los componentes puede variar de forma independiente
content"} customContentStyle={{ backgroundColor: "blue" }} /> Y hagámonos la pregunta... Y hagámonos la pregunta... ¿Cómo puedo cambiar de posición el ¿Cómo puedo cambiar de posición el botón para cerrar el modal? botón para cerrar el modal?
todo lo que hemos hablado hoy todo lo que hemos hablado hoy <Modal content={"modal content"} displayFooterOnTop // WTF displayHeaderOnBottom // WTF x 2 closeButtonPosition="top-right" customContentStyle={{ backgroundColor: "blue" }} /> Es altamente probable que cada feature Es altamente probable que cada feature request que tenga que ver con layout, request que tenga que ver con layout, implique una nueva prop implique una nueva prop
Muy probablemente estemos en el punto de vista de una biblioteca consumida por developers, la flexibilidad en la implementación del layout es clave! ¿Cómo debería ser el API del componente?
API como...? <Modal> <Modal.Content> <Modal.Header> <div>Personalización del layout</div> <Modal.CloseButton>X</Modal.CloseButton> </Modal.Header> <Modal.Body> <h1>Heeeey! Este es el contenido del modal</h1> <Modal.CloseButton> Y si haces click acá, el modal se cierra </Modal.CloseButton> </Modal.Body> </Modal.Content> <Modal.OpenButton text="Abrir!" /> </Modal> ¿Han visto algo así en sus implementaciones?
Un Un compound component compound component es un tipo de es un tipo de componente que maneja el estado componente que maneja el estado interno de un feature, mientras delega interno de un feature, mientras delega el control de la presentación a quien el control de la presentación a quien implementa y no a quien declara implementa y no a quien declara
Render props es un patrón que permite Render props es un patrón que permite compartir funcionalidad entre compartir funcionalidad entre componentes, delegando el control de componentes, delegando el control de la implementación a un componente la implementación a un componente padre padre