<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jhonantan Sosapanta </title>
    <description>The latest articles on DEV Community by Jhonantan Sosapanta  (@jasa1704).</description>
    <link>https://dev.to/jasa1704</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F714331%2Fdbc6624e-4e61-4c9c-9985-a2196bdfde0e.jpeg</url>
      <title>DEV Community: Jhonantan Sosapanta </title>
      <link>https://dev.to/jasa1704</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jasa1704"/>
    <language>en</language>
    <item>
      <title>Microfrontend(MF) - Uso del patrón MVP (Modelo, Vista, Presentación)</title>
      <dc:creator>Jhonantan Sosapanta </dc:creator>
      <pubDate>Fri, 06 May 2022 00:11:00 +0000</pubDate>
      <link>https://dev.to/jasa1704/microfrontendmf-uso-del-patron-mvp-modelo-vista-presentacion-4dc2</link>
      <guid>https://dev.to/jasa1704/microfrontendmf-uso-del-patron-mvp-modelo-vista-presentacion-4dc2</guid>
      <description>&lt;p&gt;&lt;strong&gt;MOTIVACIÓN&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Organizar el código de una manera coherente en una estructura que represente lo que gestiona.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Comunicar nuestros objetivos, a través de un flujo de información establecido.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Asegurar el principio de única responsabilidad, separando lógica  de la vista usando como base un patrón MVP&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fomentar el desarrollo guiado por pruebas unitarias.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;MVP&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;El patrón de diseño MVP nos ayuda a separar la capa de vista de la lógica, realizar tests unitarios y escribir un código más limpio.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Vista(View): capa encargada de diseñar la UI, realizar peticiones y mostrar resultados. En esta capa no debe existir lógica de negocio, aquí están las actividades, fragmentos, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Presentador(Presenter): capa encargada de interactuar con la Vista y Modelo. cabe resaltar que la Vista realiza la petición, luego el Presentador solicita información a la capa Modelo, una vez devuelta la información, el Presentador la entrega a la Vista.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modelo(Model): Capa encargada del acceso a la Base de Datos, API Rest, Memoria Cache, etc.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Diagrama de interacción de componentes  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WnB4oA0W--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gqbhegzjeeabhsqu53p7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WnB4oA0W--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gqbhegzjeeabhsqu53p7.png" alt="Image description" width="880" height="1038"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Estructura&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Se debe identificar una estructura base para organizar el desarrollo de una manera más limpia y eficiente. El objetivo es establecer el ciclo de vida de los componentes, para asegurar la responsabilidad de cada uno de los objetos disponibles. El diagrama a continuación ejemplifica como estos se deben comportar y comunicar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nJekzV_k--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/opg5v7x9enx9b0dtqf8b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nJekzV_k--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/opg5v7x9enx9b0dtqf8b.png" alt="Image description" width="880" height="638"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Podemos observar un objeto externo, single-spa, responsable de invocar las pages disponibles dentro del MF. Estas actúan como layouts para distribuir los componentes, quienes son los encargados de ejecutar micro-acciones como, mostrar un listado de productos o un botón para vaciar una orden de compra, entre otras aciones. Estos componentes se exponen a través de @inputs o @outputs para comunicarse con las pages quienes orquestan la comunicación con los managers.&lt;/p&gt;

&lt;p&gt;En caso de requerir información de algún objeto externo, sea otro MF, un API, una base local u otra fuente de datos, los managers se deben comunicar con los services responsables de acceder a dichos recursos. En este punto, el flujo de información comienza a retornar a sus orígenes, el service retorna la data, el manager ejecuta su lógica de negocio, el componente muestra los resultados esperados de acuerdo a la regla de visualización y el page de acuerdo al layout muestra los componentes que son invalidados como respuesta del single-spa. En base a la descripción previa, se propone la siguiente estructura:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;├───e2e
│   └───src
└───src
    ├───app
    │   ├───components
    │   │   └───test-component
    │   ├───managers
    │   │   └───test-manager
    │   ├───mocks
    │   │   └───services.mocks.ts
    │   ├───models
    │   │   └───test-model
    │   ├───pages
    │   │   ├───empty-route
    │   │   └───test-page
    │   ├───services
    │   │   ├───healthCheck
    │   │   └───translation
    │   └───utils
    ├───environments
    └───single-spa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Descripción de la estructura&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Models

&lt;ul&gt;
&lt;li&gt;Carpetas model: contiene los modelos que servirán como 
objetos de intercambio dentro del arquetipo.&lt;/li&gt;
&lt;li&gt;Model.index.ts: Archivo exporter de los objetos dentro de 
la carpeta model para facilitar los imports dentro del 
microfrontend&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Utils

&lt;ul&gt;
&lt;li&gt;Utils.ts: archivo base para la creación de funciones 
utilitarias de manera general en el microfrontend.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Services

&lt;ul&gt;
&lt;li&gt;Carpetas services: contiene los objetos services que 
interactúan con objetos externos al MF, por ejemplo acceso 
a un API, base de datos del navegador, evento de otro 
microfrontend, etc.&lt;/li&gt;
&lt;li&gt;Service.index.ts: archivo exporter de los objetos dentro de 
la carpeta services para facilitar los imports dentro del 
microfrontend.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Managers

&lt;ul&gt;
&lt;li&gt;Carpetas managers: contiene los objetos manager 
 encargados de la lógica de negocio en el microfrontend. 
 Este concepto es introducido en esta nueva versión de 
 arquetipo para separar lógica de negocio de los 
 componentes. Estos managers se disponibilizan 
 a través de inyección de dependencia.&lt;/li&gt;
&lt;li&gt;Manager.index.jt :archivo exporter de los objetos dentro 
 de la carpeta managers para facilitar los imports dentro 
 del microfrontend&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Components

&lt;ul&gt;
&lt;li&gt;Carpetas componentes: es una pieza de microfrontend con 
 entradas (@inputs) y salidas(@ouputs) con la finalidad de 
 invalidar contenido de acuerdo a reglas de visualización 
 y sus entradas, del mismo modo un componente a través de 
 sus salidas puede comunicar la ejecución de acciones 
 para presentar nueva información. La idea de esta 
 segregación es disponibilizar componentes que sean re- 
 utilizados en otros pages. &lt;/li&gt;
&lt;li&gt;Component.index.ts: Archivo exporter de los objetos 
 dentro de la carpeta components para facilitar los 
 imports dentro del microfrontend&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Pages

&lt;ul&gt;
&lt;li&gt;Carpetas pages: este concepto es agregado en esta 
 versión para gestionar dos necesidades. La primera de 
 ellas es actuar  como layout para la distribución de los 
 componentes, su ubicación  y lo relacionado a 
 visualización. La segunda responsabilidad es actuar como 
 orquestador entre los componentes y los managers. Por 
 ejemplo, si algún componente desea realizar la operación 
 "CalculoNegocio" debe disponibilizar una salida que 
 permita identificar la solicitud de esta acción, para 
 esto la page previamente registar estas salidas y así 
 poder ejecutar la logica de negocio correspondientes 
 directamente al manager.  Una vez terminado la llamada 
 al manager y obtenida una respuesta, la page mediante 
 las entradas de los componentes refresca la información 
 y este puede actualizar su contenido.&lt;/li&gt;
&lt;li&gt;Pages.index.ts: archivo exporter de los objetos dentro 
 de la carpeta pages para facilitar los imports dentro 
 del micrfrontend&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Mocks

&lt;ul&gt;
&lt;li&gt;Services.mocks.ts: archivo para crear mocks sobre los 
 servicios a usar en nuestras pruebas unitarias con la 
 finalidad de reutilizar dichos mocks en todos nuestros 
 specs.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Autores: &lt;br&gt;
Jhonatan Sosapanta &lt;a href="https://www.linkedin.com/in/jhonatansosapanta/"&gt;https://www.linkedin.com/in/jhonatansosapanta/&lt;/a&gt;&lt;br&gt;
Alfredo Romero &lt;a href="https://www.linkedin.com/in/sir-david"&gt;https://www.linkedin.com/in/sir-david&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>microfrontend</category>
      <category>react</category>
      <category>angular</category>
    </item>
  </channel>
</rss>
