<?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: Gerson Umanzor</title>
    <description>The latest articles on DEV Community by Gerson Umanzor (@gbumanzordev).</description>
    <link>https://dev.to/gbumanzordev</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%2F377787%2Fbd1583e9-dfb4-4ad4-8c18-d8ed86160982.jpg</url>
      <title>DEV Community: Gerson Umanzor</title>
      <link>https://dev.to/gbumanzordev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gbumanzordev"/>
    <language>en</language>
    <item>
      <title>Como estructurar aplicaciones en Angular</title>
      <dc:creator>Gerson Umanzor</dc:creator>
      <pubDate>Mon, 02 May 2022 21:29:20 +0000</pubDate>
      <link>https://dev.to/gbumanzordev/como-estructurar-aplicaciones-en-angular-408a</link>
      <guid>https://dev.to/gbumanzordev/como-estructurar-aplicaciones-en-angular-408a</guid>
      <description>&lt;p&gt;Cuando se trata de estructurar aplicaciones, podemos pensar que no es necesario tener un orden definido, pero a medida el desarrollo crece, el equipo cambia y nuevos requerimientos son añadidos, se hace mas necesario tener consistencia en nuestro trabajo para facilitar la integración de nuevos miembros, nuevos requerimientos y para la mantenibilidad del proyecto.&lt;/p&gt;

&lt;p&gt;Angular tiene una estructura bien definida de como deberían ordenarse los archivos y carpetas y hoy me gustaría profundizar en ello.&lt;/p&gt;

&lt;h2&gt;
  
  
  Patrón LIFT
&lt;/h2&gt;

&lt;p&gt;LIFT es el patrón principal creado por el equipo de Angular para ayudarte a definir bien la estructura de tus proyectos, significa lo siguiente:&lt;/p&gt;

&lt;p&gt;Locate = Localizar&lt;br&gt;
Identify = Identificar&lt;br&gt;
Flat = Plano&lt;br&gt;
T-DRY = Intentar no repetirse.&lt;/p&gt;

&lt;p&gt;Ahora, veamos mas a detalle lo que cada uno significa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Locate
&lt;/h2&gt;

&lt;p&gt;Debemos hacer que el localizar código en nuestra aplicación sea algo fácil e intuitivo, que ya sea que tengamos mucho o poco tiempo en un proyecto siempre sepamos a donde ir para encontrar cada cosa. &lt;/p&gt;

&lt;p&gt;Para cumplir con este paso, podemos guardar archivos en sub carpetas con nombres descriptivos y que tengan relación, por ejemplo, una carpeta para componentes (components), una carpeta para directivas, servicios, interfaces y pipes. De esta manera, sabremos que cada modulo que trabajemos tendrá este grupo de carpetas y sabremos a donde dirigirnos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Identify
&lt;/h2&gt;

&lt;p&gt;Para cumplir con este paso, lo que debemos hacer es nombrar nuestros archivos de manera que identificarlos sea fácil, es decir, si estamos creando un componente, podemos colocar el nombre y la terminación &lt;code&gt;.component.ext&lt;/code&gt;, si estamos trabajando con servicios sería &lt;code&gt;.service.ts&lt;/code&gt; y así sucesivamente.&lt;/p&gt;

&lt;p&gt;Para este paso, lo que debemos evitar es que un archivo contenga más de un componente, así podremos saber que el nombre del archivo hace relación explícitamente a su contenido y no usar nombres más generales. Siempre debemos preferir nombres descriptivos (aunque largos) a tener nombres cortos pero confusos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Flat
&lt;/h2&gt;

&lt;p&gt;La estructura de nuestras aplicaciones debe ser lo mas plana posible, a nadie le gusta navegar a cinco niveles de profundidad en carpetas para encontrar el componente que andamos buscando.&lt;/p&gt;

&lt;p&gt;Una recomendación importante es que cuando una carpeta tenga más de diez archivos dentro de ella, deberíamos considerar crear sub-carpetas, porque si bien es cierto no queremos que se llene de anidaciones, tampoco es lo correcto dejar todo dentro de una sola carpeta.&lt;/p&gt;

&lt;h2&gt;
  
  
  T-DRY
&lt;/h2&gt;

&lt;p&gt;T-DRY significa &lt;code&gt;Try Don't Repeat Yourself&lt;/code&gt; y lo que significa es que, en la medida de lo posible intentemos no repetirnos, pero si es inevitable, o si haremos sacrificios en nuestro código para no repetirnos, que elijamos legibilidad sobre el DRY.&lt;/p&gt;

&lt;p&gt;Como ejemplo, debemos evitar nombrar con cosas obvias nuestros componentes, como agregar &lt;code&gt;login-view.component.html&lt;/code&gt; cuando la extensión ya nos esta indicando que es una vista, o nombrar &lt;code&gt;sign-up-style.component.scss&lt;/code&gt; cuando la extensión claramente nos dice que es un archivo de estilos.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Qué son Discriminated Unions y Exhaustiveness Checking en TypeScript?</title>
      <dc:creator>Gerson Umanzor</dc:creator>
      <pubDate>Mon, 18 Apr 2022 04:02:23 +0000</pubDate>
      <link>https://dev.to/gbumanzordev/que-son-discriminated-unions-y-exhaustiveness-checking-en-typescript-34d9</link>
      <guid>https://dev.to/gbumanzordev/que-son-discriminated-unions-y-exhaustiveness-checking-en-typescript-34d9</guid>
      <description>&lt;p&gt;Hola, yo soy Gerson Umanzor, Front-End Developer, y en esta ocasión me gustaría hablarles sobre los &lt;em&gt;Discriminated Unions&lt;/em&gt; y &lt;em&gt;Exhaustiveness Checkings&lt;/em&gt; en TypeScript.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Disclaimer&lt;/em&gt;&lt;/strong&gt;: No me considero un experto en TypeScript, solamente quiero compartir con ustedes lo que he aprendido y encuentro muy interesante.&lt;/p&gt;

&lt;h2&gt;
  
  
  Discriminated Unions
&lt;/h2&gt;

&lt;p&gt;Alguna vez han tenido una situación en la que necesiten basado en una propiedad de un parámetro actuar con otros keys o realizar cálculos?&lt;/p&gt;

&lt;p&gt;Por ejemplo, si ustedes tienen dos perfiles de una persona, y quieren usar diferente información de estos perfiles para mostrarla, por ejemplo, asumamos que de un perfil, podríamos tener a un doctor, y a un ingeniero (de software, por supuesto) y que cada uno podria tener diferentes propiedades, como especialidad (para el doctor) y tecnología (para el ingeniero):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Perfil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;tipo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;doctor&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ingeniero&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;especialidad&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;tecnologia&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;hospital&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;empresa&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora bien, si yo quisiera mostrar información basado en el tipo de perfil que estoy utilizando, podría encontrarme con errores, por ejemplo, alguien podria proveerme con el perfil de un Doctor, pero accidentalmente no llenar la especialidad, o llenar la tecnologia, y eso se traduciría en que yo deba estar haciendo muchas validaciones, algo mas o menos así:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;perfil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tipo&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;doctor&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;perfil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;especialidad&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Mostrar informacion&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pero dado que estas propiedades son opcionales (no puedo obligar al usuario a llenar toda la información cuando no la requiero toda), esto podría ocasionar que falte información o que esté recibiendo más información de la que necesito. &lt;/p&gt;

&lt;p&gt;Y si agregamos más tipos? Esto se traduciría en agregar aún más propiedades al objeto, y terminaríamos con un objeto enorme lleno de propiedades opcionales, y, peor aún, con un listado de validaciones interminables.&lt;/p&gt;

&lt;p&gt;Pero, como solucionamos esto? Bien sencillo, utilizamos lo que en TypeScript se llama &lt;strong&gt;&lt;em&gt;Discriminated Unions&lt;/em&gt;&lt;/strong&gt;, que se traduce en, tener una propiedad en común entre todas las interfaces o tipos, para que, de acuerdo al valor de esta propiedad, nosotros usemos solamente las keys que se necesitan, en ese caso, el ejemplo antes mencionado se traduciría en lo siguiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Doctor&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;tipo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;doctor&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;especialidad&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;hospital&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Ingeniero&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;tipo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ingeniero&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;tecnologia&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;empresa&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y luego, lo mas importante, es que crearemos un &lt;em&gt;type&lt;/em&gt; para unir (de ahi el &lt;em&gt;“Union”&lt;/em&gt; en el nombre de esta característica) ambas interfaces, así:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Perfil&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Doctor&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;Ingeniero&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora, cuando queramos hacer ciertas validaciones, esto funcionaria sin ningún problema:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;revisarPerfil&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;perfil&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Perfil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;perfil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tipo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;doctor&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// Puedo usar las propiedades especialidad y hospital, sin problemas;&lt;/span&gt;
      &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ingeniero&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// Puedo usar las propiedades tecnologia y empresa, sin problemas;&lt;/span&gt;
      &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nl"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lo que significa que solo debo hacer una validación (la de tipo) y con eso sería suficiente para saber que otras propiedades son accesibles, fácil, no? Bien, continuemos con Exhaustiveness Checking.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exhaustiveness Checking
&lt;/h2&gt;

&lt;p&gt;Cuando yo estoy recibiendo parámetros que tienen un número limitado de posibles valores, es muy importante saber que estoy cubriendo todos los posibles escenarios para poder evitar errores en producción.&lt;/p&gt;

&lt;p&gt;Bien, tomaremos como base para el ejemplo los bloques de código anteriores, así que continuaremos utilizando el switch que creamos al final del primer ejercicio:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;revisarPerfil&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;perfil&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Perfil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;perfil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tipo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;doctor&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// Puedo usar las propiedades especialidad y hospital, sin problemas;&lt;/span&gt;
      &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ingeniero&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// Puedo usar las propiedades tecnologia y empresa, sin problemas;&lt;/span&gt;
      &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nl"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En ese bloque switch, nosotros estamos validando que todos los posibles escenarios estén cubiertos, ¿no?&lt;/p&gt;

&lt;p&gt;Y que tal si más adelante, ya sea un par de días, unas semanas, unos meses o quien sabe, hasta un par de años, alguien más en el equipo agrega una interface más al tipo que nosotros habíamos declarado, llamemos a esta nueva interface &lt;code&gt;Arquitecto&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Arquitecto&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;tipo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;arquitecto&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="c1"&gt;// Resto de propiedades&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y ahora, el Union type se vería más o menos así:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Perfil&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Doctor&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;Ingeniero&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;Arquitecto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lo que significa que ahora, en nuestro switch case no estamos cubriendo todos los posibles escenarios que podríamos recibir, ¿qué hacemos? Aquí es donde el &lt;strong&gt;&lt;em&gt;Exhaustiveness Checking&lt;/em&gt;&lt;/strong&gt; entra en juego, y para implementarlo, hacemos lo siguiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;revisarPerfil&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;perfil&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Perfil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;exhaustiveChecking&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;never&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;perfil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tipo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;doctor&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// Puedo usar las propiedades especialidad y hospital, sin problemas;&lt;/span&gt;
      &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ingeniero&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// Puedo usar las propiedades tecnologia y empresa, sin problemas;&lt;/span&gt;
      &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nl"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;exhaustiveChecking&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;perfil&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Los cambios que hemos realizado son dos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Declaramos una variable de tipo &lt;code&gt;never&lt;/code&gt;, a la cual llamamos &lt;code&gt;exhaustiveChecking&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Agregamos el default case, y en este asignamos el valor de perfil.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Pero, ¿qué significa que asigne un valor de un parámetro a una variable de tipo never? Aquí viene la explicación:&lt;/p&gt;

&lt;p&gt;Dado que nosotros ya hemos cubierto todos los posibles escenarios de el parámetro perfil, cuando llegue al case default, no habría una coincidencia en cuanto al tipo, por lo tanto, TypeScript entiende que nunca va a llegar hasta ahí (de ahí que automáticamente se convierte en tipo never).&lt;/p&gt;

&lt;p&gt;Esto significa que, cuando yo agregue una nueva opción a mi &lt;em&gt;type&lt;/em&gt; &lt;code&gt;Perfil&lt;/code&gt;, TypeScript va a detectar automáticamente que cuando llega al default case el tipo de el parámetro perfil no es de tipo never, sino que podría ser del tipo que recién agregamos, y no nos va a dejar compilar la aplicación, evitando errores en tiempo de compilación y mostrando el siguiente error al pasar el cursor sobre exhaustiveChecking:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;Type&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Arquitecto&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="nx"&gt;not&lt;/span&gt; &lt;span class="nx"&gt;assignable&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;never&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hasta aquí esta pequeña entrada, espero les haya gustado, y si tienen algún otro tema del que les gustaría que hablara, me pueden dejar saber, y con gusto preparamos una nueva entrada.&lt;/p&gt;

&lt;p&gt;Un saludo!&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>javascript</category>
      <category>spanish</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Flujo de Trabajo con Git flow.</title>
      <dc:creator>Gerson Umanzor</dc:creator>
      <pubDate>Fri, 01 May 2020 23:17:24 +0000</pubDate>
      <link>https://dev.to/gbumanzordev/flujo-de-trabajo-con-git-flow-fe</link>
      <guid>https://dev.to/gbumanzordev/flujo-de-trabajo-con-git-flow-fe</guid>
      <description>&lt;p&gt;En el desarrollo de software es muy importante llevar el control y una línea de tiempo de lo que desarrollamos, por lo que un Sistema de Control de Versiones (VCS) es muy importante, pero en esta ocasión más que hablar del control de versiones como tal, me gustaria introducirlos a una metodología bastante popular para el desarrollo de software en equipo.&lt;/p&gt;

&lt;p&gt;Gitflow es un conjunto de reglas o “estándares” para versionamiento que (a mi manera de verlo) la mayoría de los equipos deberían seguir al momento de desarrollar software colaborativo, es una de las más populares y por lo tanto la que mejores valoraciones tiene. Empecemos. &lt;/p&gt;

&lt;h2&gt;
  
  
  Instalacion
&lt;/h2&gt;

&lt;p&gt;Para OSX podemos usar el siguiente comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;git-flow
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para instalar Git Flow en Windows, pueden &lt;a href="https://git-scm.com/download/win"&gt;seguir este enlace&lt;/a&gt; ya que el instalador ya trae git flow incluido. &lt;/p&gt;

&lt;p&gt;Para Linux, existen varias maneras que puedes investigar en línea, para las distribuciones basadas en Debian/Ubuntu, puedes ejecutar el siguiente comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; git-flow.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Después de haber instalado git-flow lo único que debemos hacer es dirigirnos al repositorio local de nuestro proyecto y ejecutar &lt;code&gt;git flow init&lt;/code&gt;, este comando es una extensión del comando &lt;code&gt;git init&lt;/code&gt; y no va a cambiar nada en el repositorio excepto la creación de las ramas.&lt;/p&gt;

&lt;p&gt;Una vez ejecutemos este comando, nos pedirá los nombres por defecto de las ramas principales para nuestro proyecto, podemos dejar los valores predeterminados y continuar, el resultado seria similar al siguiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git flow init
Initialized empty Git repository &lt;span class="k"&gt;in&lt;/span&gt; ~/project/.git/
No branches exist yet. Base branches must be created now.
Branch name &lt;span class="k"&gt;for &lt;/span&gt;production releases: &lt;span class="o"&gt;[&lt;/span&gt;master]
Branch name &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="s2"&gt;"next release"&lt;/span&gt; development: &lt;span class="o"&gt;[&lt;/span&gt;develop]

How to name your supporting branch prefixes?
Feature branches? &lt;span class="o"&gt;[&lt;/span&gt;feature/]
Release branches? &lt;span class="o"&gt;[&lt;/span&gt;release/]
Hotfix branches? &lt;span class="o"&gt;[&lt;/span&gt;hotfix/]
Support branches? &lt;span class="o"&gt;[&lt;/span&gt;support/]
Version tag prefix? &lt;span class="o"&gt;[]&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;git branch
&lt;span class="k"&gt;*&lt;/span&gt; develop
 master
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Las ramas que se crearan al inicio serán &lt;code&gt;master&lt;/code&gt; y &lt;code&gt;develop&lt;/code&gt;, profundicemos en ellas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ramas &lt;code&gt;master&lt;/code&gt; y &lt;code&gt;develop&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;En lugar de solamente usar la rama &lt;code&gt;master&lt;/code&gt;, este flujo de trabajo utiliza dos ramas para guardar el historial del proyecto. La rama &lt;code&gt;master&lt;/code&gt; almacena el historial de lanzamientos oficiales, y la rama &lt;code&gt;develop&lt;/code&gt; funciona como una rama de integración para nuevas características en desarrollo, también es conveniente etiquetar todos los commits que se hagan en la rama &lt;code&gt;master&lt;/code&gt; con un número de versión.&lt;/p&gt;

&lt;p&gt;El primer paso es complementar la rama &lt;code&gt;master&lt;/code&gt; con la rama &lt;code&gt;develop&lt;/code&gt;, la manera más sencilla es crear la rama &lt;code&gt;develop&lt;/code&gt; y hacer push al repositorio en el servidor ejecutando los siguientes comandos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git branch develop
git push origin develop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esa rama va a contener el historial completo del proyecto mientras que &lt;code&gt;master&lt;/code&gt; va a contener una versión reducida. A partir de este punto los compañeros de proyecto deberían clonar el repositorio central y crear una rama de seguimiento para la rama &lt;code&gt;develop&lt;/code&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  Ramas por caracteristicas (feature branches)
&lt;/h2&gt;

&lt;p&gt;Cada nueva característica debe residir en su propia rama, la cual puede ser guardada en el repositorio remoto para respaldo o colaboración. Pero, en vez de ramificar desde &lt;code&gt;master&lt;/code&gt;, las ramas &lt;code&gt;feature&lt;/code&gt; usen &lt;code&gt;develop&lt;/code&gt; como su rama padre. Cuando una característica esté completa, debe ser combinada con &lt;code&gt;develop&lt;/code&gt;. Las características nunca deberían ir directamente a la rama &lt;code&gt;master&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Tomen en cuenta que las ramas por característica combinadas con la rama de desarrollo (&lt;code&gt;develop&lt;/code&gt;) cumplen el propósito de ramificación por &lt;code&gt;feature&lt;/code&gt;, pero el flujo de trabajo git flow no termina ahí. &lt;/p&gt;

&lt;p&gt;Para crear una rama por característica, sin usar la herramienta git flow, podemos ejecutar los siguientes comandos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git checkout develop
git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; feature_branch

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pero cuando usamos la extensión git-flow, solamente debemos ejecutar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git flow feature start feature_branch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y continuamos usando git como siempre.&lt;/p&gt;

&lt;h3&gt;
  
  
  Terminar features:
&lt;/h3&gt;

&lt;p&gt;Una vez la característica (regularmente tickets asignados en los proyectos), el siguiente paso sería combinar la rama &lt;code&gt;feature&lt;/code&gt; con la rama de desarrollo (&lt;code&gt;develop&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Sin las extensiones de git flow, deberíamos ejecutar los siguientes comandos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git checkout develop
git merge feature_branch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pero teniendo gitflow instalado, solamente necesitamos ejecutar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git flow feature finish feature_branch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este comando hará automáticamente el cambio hacia &lt;code&gt;develop&lt;/code&gt; y luego el merge de la rama en la que estemos trabajando, y adicionalmente elimina la rama &lt;code&gt;feature&lt;/code&gt; que ya no necesitamos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ramas para lanzamiento:
&lt;/h2&gt;

&lt;p&gt;Una vez la rama de desarrollo haya adquirido suficientes características para un lanzamiento (o una fecha de lanzamiento está cerca), se hace una división (fork) de una rama de lanzamiento desde la rama &lt;code&gt;develop&lt;/code&gt;. Al crear la rama se inicia un nuevo ciclo de lanzamiento, lo cual significa que en esta rama no deberían agregarse nuevas características sino a la rama &lt;code&gt;develop&lt;/code&gt;, sin embargo, si se encuentran errores en este punto, estos deberían ser corregidos y actualizados en la rama de lanzamiento tanto como en la rama de desarrollo.&lt;/p&gt;

&lt;p&gt;Usar una rama dedicada a los lanzamientos hace posible que el equipo pueda pulir y revisar adecuadamente el proyecto sin afectar o detener el desarrollo de nuevas características, esto también nos permite crear fases bien definidas del desarrollo. &lt;/p&gt;

&lt;p&gt;Para poder crear ramas de lanzamiento también podemos hacerlo por nuestra cuenta, ejecutando los siguientes comandos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git checkout develop
git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; release/0.1.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pero si tenemos la extensión git-flow, también podemos hacer lo siguiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git flow release start 0.1.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lo cual nos dará como respuesta lo siguiente:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Switched to a new branch 'release/0.1.0'&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Una vez esta rama esté lista, (sin bugs, documentada y revisada), debe combinarse con la rama principal (&lt;code&gt;master&lt;/code&gt;) y etiquetada con un número de versión. Adicionalmente (no es obligacion) se sugiere que se haga merge a la rama &lt;code&gt;develop&lt;/code&gt; por si hay alguna modificación que se haya realizado que necesite ser actualizada en la rama de desarrollo. &lt;/p&gt;

&lt;p&gt;Para finalizar la rama de lanzamiento, podemos hacerlo, como siempre, de dos maneras, sin git-flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git checkout master
git merge release/0.1.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con git-flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git flow release finish &lt;span class="s1"&gt;'0.1.0'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Ramas de mantenimiento (hotfix branch):
&lt;/h2&gt;

&lt;p&gt;Las ramas de mantenimiento o “hotfix” son ramas que nos ayudan a corregir lanzamientos ya en producción, son muy parecidas a las ramas de lanzamiento excepto que ellas salen directamente de la rama &lt;code&gt;master&lt;/code&gt; y no de &lt;code&gt;develop&lt;/code&gt;. Nos ayudan a la hora de corregir errores pequeños como faltas de ortografías o una imagen que no se vea del todo bien. &lt;br&gt;
Una vez se haya finalizado el trabajo en esta rama, debe ser combinada de nuevo con &lt;code&gt;master&lt;/code&gt; pero también con &lt;code&gt;develop&lt;/code&gt; para mantener todos los cambios en las ramas principales del proyecto. &lt;/p&gt;
&lt;h3&gt;
  
  
  Inicializar una rama de revisión:
&lt;/h3&gt;

&lt;p&gt;Sin git flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git checkout master
git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; hotfix_branch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con git-flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git flow hotfix start hotfix_branch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;De manera similar a como se finaliza una rama de lanzamiento, las ramas de revisión se combinan en &lt;code&gt;master&lt;/code&gt; y en &lt;code&gt;develop&lt;/code&gt;, de la siguiente manera:&lt;/p&gt;

&lt;p&gt;Sin git-flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git checkout master
git merge hotfix_branch
git checkout develop
git merge hotfix_branch
git branch &lt;span class="nt"&gt;-D&lt;/span&gt; hotfix_branch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Utilizando git flow&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git flow hotfix finish hotfix_branch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este es basicamente el flujo de trabajo que se sigue cuando se utiliza git flow, es muy ordenado y nos permite llevar un mejor seguimiento del trabajo hecho, y una linea de tiempo mas entendible evitando en lo posible los conflictos a la hora de combinar el trabajo hecho.&lt;/p&gt;

</description>
      <category>git</category>
      <category>gitflow</category>
      <category>github</category>
      <category>spanish</category>
    </item>
  </channel>
</rss>
