<?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: Jorge Méndez Ortega</title>
    <description>The latest articles on DEV Community by Jorge Méndez Ortega (@jmz12).</description>
    <link>https://dev.to/jmz12</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%2F213415%2F624d8391-73b8-4503-a07b-6d6a54a09ba3.jpeg</url>
      <title>DEV Community: Jorge Méndez Ortega</title>
      <link>https://dev.to/jmz12</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jmz12"/>
    <language>en</language>
    <item>
      <title>De POO a SOLID explicado con Pokémon - Los cinco principios de SOLID</title>
      <dc:creator>Jorge Méndez Ortega</dc:creator>
      <pubDate>Sun, 06 Sep 2020 09:17:58 +0000</pubDate>
      <link>https://dev.to/jmz12/de-poo-a-solid-explicado-con-pokemon-2bn5</link>
      <guid>https://dev.to/jmz12/de-poo-a-solid-explicado-con-pokemon-2bn5</guid>
      <description>&lt;h6&gt;
  
  
  GUÍA PARA ENTENDER LOS CINCO PRINCIPIOS DE SOLID.
&lt;/h6&gt;

&lt;h4&gt;
  
  
  JavaScript — Los cinco principios de SOLID
&lt;/h4&gt;

&lt;p&gt;Genial estamos por terminar nuestra aventura &lt;strong&gt;Pokémon&lt;/strong&gt;, finalmente veremos los cinco principios de &lt;strong&gt;SOLID&lt;/strong&gt;, para poder llegar hasta este punto fue necesario pasar los siguientes retos.&lt;/p&gt;

&lt;p&gt;📕 El paradigma de la Programación Orientada a Objetos&lt;br&gt;
📗 Los cuatro principios de la Programación Orientada a Objetos&lt;/p&gt;

&lt;p&gt;Si seguiste el tema desde el primer artículo deja decirte gracias 👏, regresando al tema que nos compete y posible mente la pregunta que te estés realizando al igual que yo es, pero &lt;strong&gt;¿Que son los cinco principios de SOLID?&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📝 Nota: Para entender los principios de SOLID es recomendable tener bases de los temas anteriores.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h3&gt;
  
  
  Pero, 🤔 ¿Qué son los principios de SOLID?
&lt;/h3&gt;

&lt;p&gt;Es una serie de cinco reglas o principios que son aplicados en la &lt;strong&gt;POO&lt;/strong&gt; cuyas iniciales dan como resultado el acrónimo &lt;strong&gt;SOLID&lt;/strong&gt; este nombre es definido por &lt;a href="https://www.linkedin.com/in/michaelfeathers/"&gt;Michael Feathers&lt;/a&gt; el cual hace referencia a los principios definidos por &lt;a href="https://es.wikipedia.org/wiki/Robert_C._Martin"&gt;Robert C. Martín&lt;/a&gt; (&lt;strong&gt;Tío Bob&lt;/strong&gt;) y &lt;a href="https://es.wikipedia.org/wiki/Barbara_Liskov"&gt;Barbara Liskov&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Aplicar y conocer dichos principios tiene como consecuencia un desarrollo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lN8I1GUF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2720/1%2AYPdCb1_YqyrRiqV2PLI8Ew.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lN8I1GUF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2720/1%2AYPdCb1_YqyrRiqV2PLI8Ew.png" alt="Fig. 1: Beneficios de SOLID." width="800" height="165"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En términos más generales se puede conseguir un mejor diseño de arquitectura y un código de mayor calidad, cada una de las letras de &lt;strong&gt;SOLID&lt;/strong&gt; hace referencia a uno de sus principios.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sXEdjsg8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/3608/1%2AN8YzTFRrvoSaWlnMqv9-_g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sXEdjsg8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/3608/1%2AN8YzTFRrvoSaWlnMqv9-_g.png" alt="Fig.2: El acrónimo de SOLID." width="800" height="321"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Los principios de &lt;strong&gt;SOLID&lt;/strong&gt; no solo son aplicables a &lt;strong&gt;POO&lt;/strong&gt; también son aplicables en &lt;strong&gt;Funciones&lt;/strong&gt; (Programación funcional), pero es muy común verlo aplicado en &lt;strong&gt;POO&lt;/strong&gt;, Estos principios son aplicables a cualquier lenguaje de programación.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🔖 &lt;strong&gt;Nota&lt;/strong&gt;: Todos los ejemplos de código utilizados están basados en &lt;strong&gt;JavaScript&lt;/strong&gt; usando las especificaciones más actuales hasta el momento.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h3&gt;
  
  
  📕S: Single Responsability Principle / Principio de Responsabilidad Única
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OhjqrYKP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/5128/1%2AKMmxj_npKkze19bAdLfnfQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OhjqrYKP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/5128/1%2AKMmxj_npKkze19bAdLfnfQ.png" alt="Fig. 3: Single responsibility principle o Principio de responsabilidad única." width="800" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Una &lt;strong&gt;Clase&lt;/strong&gt; solo debe tener solo una razón para cambiar, esto quiere decir que una clase solo debe contar con una sola responsabilidad.&lt;/p&gt;

&lt;p&gt;Si una &lt;strong&gt;Clase&lt;/strong&gt; contara con múltiples responsabilidades esto puede implicar que al realizar un cambio de alguna de ellas puede tener como consecuencia la modificación de otras responsabilidades lo que aumenta la posibilidad de incluir errores y poder afectar otras partes del sistema sin saberlo.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔖 Nota&lt;/strong&gt;: &lt;strong&gt;Single Responsability Principle **también&lt;/strong&gt; &lt;strong&gt;se conoce como&lt;/strong&gt; SRP** por sus siglas en ingles.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Interesante, pero generemos un ejemplo utilizando la vieja confiable &lt;strong&gt;&lt;a href="https://gist.github.com/konami12/2359d276454cdcb81d291597a042e375"&gt;Clase Pokémon&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Como podemos apreciar el ejemplo anterior no está aplica &lt;strong&gt;SRP&lt;/strong&gt; ya que la &lt;strong&gt;Clase **consta de más de una **responsabilidad&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--je_AMKep--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2720/1%2AITVAfF8pOpmFFukKURHr2A.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--je_AMKep--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2720/1%2AITVAfF8pOpmFFukKURHr2A.png" alt="Fig. 5: Problemas de la clase Pokémon." width="800" height="136"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Al contar con múltiples &lt;strong&gt;responsabilidades&lt;/strong&gt; se complica aplicar cambios ya que es posible que insertemos un &lt;strong&gt;error&lt;/strong&gt; porque hacer un cambio de alguna responsabilidad, podría afectar a otras sin que nosotros lo sepamos, es momento de aplicar &lt;strong&gt;SRP.&lt;/strong&gt;&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Aplicando &lt;strong&gt;SRP&lt;/strong&gt; vemos que entra en juego una nueva clase llamada &lt;strong&gt;DataBase&lt;/strong&gt;la cual es encarga de manipular la Base de datos y por otro lado la &lt;strong&gt;&lt;a href="https://gist.github.com/konami12/3039456df210421462f07934cdd269bd"&gt;Clase Pokemon&lt;/a&gt;&lt;/strong&gt;solo se encarga de definir nuevos &lt;strong&gt;Pokémons&lt;/strong&gt;, de esta manera cada &lt;strong&gt;Clase&lt;/strong&gt;tiene una responsabilidad además podemos conseguir una &lt;strong&gt;alta cohesión&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  alta cohesión: Se refiere a la media que módulos de un sistema tiene una sola responsabilidad.
&lt;/h1&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  📗O: Open-Closed Principle/ Principio de Abierto-Cerrado
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sfNydqK9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/5128/1%2A3vcBbZSjRpKdwr_8QJcjOg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sfNydqK9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/5128/1%2A3vcBbZSjRpKdwr_8QJcjOg.png" alt="Fig. 7: Open-closed principle/ Principio de abierto-cerrado" width="800" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Una entidad de &lt;strong&gt;SoftWare&lt;/strong&gt; tiene que estar abierta para su extensión, pero cerrada para su modificación. Lo que establece este principio es que siempre que se desee realizar un cambio o nueva característica, se tendría que agregar código nuevo en lugar de modificar el existente.&lt;/p&gt;

&lt;p&gt;Si una se desea que una &lt;strong&gt;Clase&lt;/strong&gt; realice más funciones, lo ideal es extender las funcionalidades ya existentes y no modificarlas.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔖 Nota&lt;/strong&gt;: &lt;strong&gt;Open Closed Principle&lt;/strong&gt; también se conoce como &lt;strong&gt;OCP&lt;/strong&gt; por sus siglas en ingles.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nuevamente utilizaremos la vieja confiable &lt;strong&gt;&lt;a href="https://gist.github.com/konami12/2359d276454cdcb81d291597a042e375"&gt;Clase Pokémon&lt;/a&gt;&lt;/strong&gt;, para generar el ejemplo.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Como podemos apreciar el ejemplo anterior no está aplica &lt;strong&gt;OCP&lt;/strong&gt; ya que la &lt;strong&gt;Clase ProcessAtack&lt;/strong&gt; está abierta para recibir nuevos cambios.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UyD3PQ6S--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2720/1%2A-vOMQFMDWMruF7koEE04Pw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UyD3PQ6S--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2720/1%2A-vOMQFMDWMruF7koEE04Pw.png" alt="Fig. 8: Problemas de la clase ProcessAttack." width="800" height="136"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Al momento de que nuestra la &lt;strong&gt;Clase&lt;/strong&gt; está abierta a recibir nuevos cambios es posible que insertemos un &lt;strong&gt;error&lt;/strong&gt;, porque estaríamos modificando código ya existente, para aplicar &lt;strong&gt;OCP&lt;/strong&gt; utilizaremos el principio de &lt;strong&gt;Herencia y **Polimorfismo.&lt;/strong&gt;&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Al aplicar &lt;strong&gt;OCP&lt;/strong&gt; en la &lt;strong&gt;Clase ProcessAttack&lt;/strong&gt; lo primero que vemos es que ya no le importa saber el tipo de &lt;strong&gt;Pokémon&lt;/strong&gt; solo le interesa el resultado del método &lt;strong&gt;attack&lt;/strong&gt; para poder realizar la acción de ataque, con este nuevo diseño para poder agregar nuevos ataques por tipo de &lt;strong&gt;Pokémon&lt;/strong&gt; solo es necesario crear nuevas &lt;strong&gt;SubClases&lt;/strong&gt; de la &lt;strong&gt;Clase Pokémon&lt;/strong&gt;, esto es un diseño mucho más robusto y fácil de extender.&lt;/p&gt;




&lt;h3&gt;
  
  
  📘 L: Liskov Substitution Principle/Principio de Sustitución de Liskov
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sZJAWTnZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/6120/1%2A7goesHL3-wygzxMaAoo7rQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sZJAWTnZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/6120/1%2A7goesHL3-wygzxMaAoo7rQ.png" alt="Fig. 10: Liskov substitution principle / Principio de sustitución de Liskov" width="800" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Puede que por su nombre asuste un poco 😱, pero en realidad es más sencillo de lo que parece. Este principio lo que dice es, Si &lt;strong&gt;S&lt;/strong&gt; es un subtipo de &lt;strong&gt;T&lt;/strong&gt;, los objetos de tipo &lt;strong&gt;T&lt;/strong&gt; en un programa pueden reemplazarse por objetos de tipo** S** sin alterar ninguna de las propiedades del programa.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  Este …ehm… como te digo que eso no suena tan sencillo como lo imaginaba.
&lt;/h1&gt;
&lt;/blockquote&gt;

&lt;p&gt;De una manera más simple, el principio declara es que una, &lt;strong&gt;SubClase&lt;/strong&gt; (&lt;strong&gt;clase hija&lt;/strong&gt;) debe ser sustituible por su &lt;strong&gt;Super Clase&lt;/strong&gt; (&lt;strong&gt;clase padre&lt;/strong&gt;), si al hacer esto la clase falla estamos violando el principio🤯.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔖 Nota&lt;/strong&gt;: &lt;strong&gt;Liskov Substitution Principle&lt;/strong&gt; también se conoce como &lt;strong&gt;LSP&lt;/strong&gt; por sus siglas en ingles.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nuevamente utilizaremos la vieja confiable &lt;strong&gt;&lt;a href="https://gist.github.com/konami12/2359d276454cdcb81d291597a042e375"&gt;Clase Pokémon&lt;/a&gt;&lt;/strong&gt;, para generar el ejemplo.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;El ejemplo anterior está rompiendo el principio &lt;strong&gt;LSP&lt;/strong&gt; ya que como podemos apreciar la &lt;strong&gt;Sub-Clase&lt;/strong&gt; (&lt;strong&gt;Charmander&lt;/strong&gt;) tiene un comportamiento que difiere de la &lt;strong&gt;Clase-Padre&lt;/strong&gt; (&lt;strong&gt;Pokémon&lt;/strong&gt;),&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iMmt1ZBa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2720/1%2AaFeOrTAXPZdIQp3wKmECcQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iMmt1ZBa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2720/1%2AaFeOrTAXPZdIQp3wKmECcQ.png" alt="Fig. 12: Problemas de la Clase Charmander" width="800" height="108"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Al momento que una &lt;strong&gt;Sub-Clase&lt;/strong&gt; no puede realizar las mismas acciones que la &lt;strong&gt;Clase-Padre&lt;/strong&gt; esto puede provocar errores, para poder aplicar &lt;strong&gt;LSP&lt;/strong&gt;utilizaremos el principio de &lt;strong&gt;Herencia.&lt;/strong&gt;&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Al aplicar &lt;strong&gt;LSP&lt;/strong&gt; entra en juego &lt;strong&gt;PokemonFly&lt;/strong&gt; que hereda de &lt;strong&gt;Pokémon&lt;/strong&gt; y tiene el método &lt;strong&gt;canFly,&lt;/strong&gt; de esta manera podemos definir quién puede volar y quien no, este principio es una advertencia de que el polimorfismo es poderoso, pero no siempre es fácil de aplica correctamente.&lt;/p&gt;




&lt;h3&gt;
  
  
  📙 I: Interface Segregation Principle/ Principio de Segregación de Interfaces
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WMyFDcRl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/5304/1%2AMznwp9wgDpGvOsSS8WQBoA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WMyFDcRl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/5304/1%2AMznwp9wgDpGvOsSS8WQBoA.png" alt="Fig. 13: Interface Segregation Principle/ Principio de Segregación de Interfaces" width="800" height="374"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Los &lt;strong&gt;clientes&lt;/strong&gt; no tienen que verse forzados a depender de interfaces que no utilicen, en otras palabras, cuando un &lt;strong&gt;Cliente A&lt;/strong&gt; depende de una &lt;strong&gt;Clase&lt;/strong&gt; que implementa una &lt;strong&gt;interfaz&lt;/strong&gt; cuya funcionalidad el &lt;strong&gt;Cliente A&lt;/strong&gt; no utilice, pero otros si, él &lt;strong&gt;Cliente A&lt;/strong&gt; estará siendo afectados por los cambios que fuercen otros clientes.&lt;/p&gt;

&lt;p&gt;Este principio suena muy similar a &lt;strong&gt;SPR&lt;/strong&gt; ya que ambos están centrados en la &lt;strong&gt;cohesión&lt;/strong&gt; de &lt;strong&gt;responsabilidades.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  Este …ehm… pero en JavaScript no existen las interfaces genio.
&lt;/h1&gt;
&lt;/blockquote&gt;

&lt;p&gt;Por lo que este principio no es aplicable estrictamente como otros, lo ideal es implementar pequeñas &lt;strong&gt;interfaces simuladas.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔖 Nota&lt;/strong&gt;: &lt;strong&gt;Interface Segregation Principle&lt;/strong&gt; también se conoce como &lt;strong&gt;ISP&lt;/strong&gt; por sus siglas en ingles.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nuevamente utilizaremos la vieja confiable &lt;strong&gt;&lt;a href="https://gist.github.com/konami12/2359d276454cdcb81d291597a042e375"&gt;Clase Pokémon&lt;/a&gt;&lt;/strong&gt;, para generar el ejemplo.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Como podemos apreciar el ejemplo anterior no está aplica &lt;strong&gt;ISP&lt;/strong&gt; ya que la &lt;strong&gt;Clase Pokemon&lt;/strong&gt; tiene métodos que no son aplicables en todos las &lt;strong&gt;SubClases&lt;/strong&gt;las cuales se ven obligadas aplicar acepciones o comportamientos diferentes para los métodos que no utilizan.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GQG4lTk8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2720/1%2AG0EpAk7cn8_A8syjZU5MrA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GQG4lTk8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2720/1%2AG0EpAk7cn8_A8syjZU5MrA.png" alt="Fig: 15: Problemas de la clase Pokémon." width="800" height="136"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Al momento de que nuestra la &lt;strong&gt;Clase&lt;/strong&gt; consta de métodos que pueden o no aplicar a sus descendientes es muy fácil que insertemos &lt;strong&gt;errores&lt;/strong&gt;, la solución para poder implementar &lt;strong&gt;ISP&lt;/strong&gt; es necesario separar el código en pequeñas partes así de cada clase podrá usar los métodos que realmente utilice.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔖 Nota&lt;/strong&gt;: En &lt;strong&gt;JavaScript&lt;/strong&gt; solo se puede &lt;strong&gt;tener&lt;/strong&gt; una &lt;strong&gt;clase&lt;/strong&gt; &lt;strong&gt;padre&lt;/strong&gt;, por lo que la &lt;strong&gt;herencia&lt;/strong&gt; &lt;strong&gt;múltiple&lt;/strong&gt; de &lt;strong&gt;manera directa no es posible&lt;/strong&gt;, &lt;strong&gt;para&lt;/strong&gt; eso usaremos los &lt;strong&gt;&lt;a href="https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Classes#Mix-ins"&gt;mix-ins&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Al aplicar &lt;strong&gt;ISP&lt;/strong&gt; entran en juego el manejo de &lt;strong&gt;interfaces&lt;/strong&gt;, pero como sabemos en &lt;strong&gt;JavaScript&lt;/strong&gt; por lo que implementamos &lt;strong&gt;Mix-ins&lt;/strong&gt; con los cuales podremos simular un comportamiento parecido a las interfaces con lo que podremos agregar solo los métodos que realmente necesite nuestra &lt;strong&gt;Subclase.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  📒 D: Dependency Inversion Principle / Principio de Inversión de Dependencia
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mI3dRZcd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/5120/1%2A5FvvdM9QuyeLaBSIN55HjQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mI3dRZcd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/5120/1%2A5FvvdM9QuyeLaBSIN55HjQ.png" alt="Fig., 17:Dependency Inversion Principle / Principio de Inversión de Dependencia" width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Realmente este principio dicta dos puntos importantes los cuales son&lt;/p&gt;

&lt;blockquote&gt;
&lt;h4&gt;
  
  
  Los módulos de alto nivel no deben depender de los módulos de bajo nivel, Ambos tiene que depender de abstracciones.
&lt;/h4&gt;
&lt;h4&gt;
  
  
  Las abstracciones no deben depender de los detalles. Los detalles deben depender de abstracciones.
&lt;/h4&gt;
&lt;/blockquote&gt;

&lt;p&gt;Hay un momento puede que esto no suene tan sencillo inicialmente, pongamos en claro los términos utilizados.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Módulo de Alto Nivel (Clase):&lt;/strong&gt; &lt;strong&gt;Clase&lt;/strong&gt; con la que se ejecuta una acción utilizando una &lt;strong&gt;herramienta&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Módulo de Bajo Nivel (Clase): La **herramienta&lt;/strong&gt; necesaria para ejecutar la acción&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Abstracción:&lt;/strong&gt; Representa la interfaz que conecta a las 2 clases&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Detalles:&lt;/strong&gt; Cómo funciona la herramienta.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔖 Nota&lt;/strong&gt;: &lt;strong&gt;Dependency Inversion Principle&lt;/strong&gt; tambiénse conoce como &lt;strong&gt;DIP&lt;/strong&gt; por sus siglas en ingles.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;En este ejemplo crearemos una clase llamada &lt;strong&gt;Pokedex&lt;/strong&gt; ya que desde mi punto de vista es como el mejor ejemplo que se presta para la explicación.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Revisando el ejemplo podemos ver que la &lt;strong&gt;Clase Pokedex&lt;/strong&gt; tiene una dependencia directa a &lt;strong&gt;ApiPokemon.&lt;/strong&gt; por esta razón el principio de &lt;strong&gt;DIP&lt;/strong&gt; no se aplica ya que una de las &lt;strong&gt;Clases&lt;/strong&gt; tiene conocimiento de cómo se implementa &lt;strong&gt;ApiPokemon.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CiJ-_srY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2720/1%2AuwUD8CFps1J6I0ZqrJtKIg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CiJ-_srY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2720/1%2AuwUD8CFps1J6I0ZqrJtKIg.png" alt="Fig. 19: Problemas de la clase Pokedex." width="800" height="136"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para poder implementar &lt;strong&gt;DIP&lt;/strong&gt; utilizaremos inyección de dependencias así la &lt;strong&gt;Clase Pokedex&lt;/strong&gt; solo se encargará de solicitar data.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Al momento de realizar una inyección de &lt;strong&gt;Dependencias&lt;/strong&gt; la clase Pokedex, eliminamos la dependencia que se tenía de la clase &lt;strong&gt;ApiPokemon&lt;/strong&gt;, de esta manera cumpliríamos con el principio de &lt;strong&gt;DIP.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🔖 Nota: La implementación de &lt;strong&gt;DIP&lt;/strong&gt; regular mente puedes se utiliza con interfaces en este caso podríamos haber usado mix-in.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Conclusiones
&lt;/h3&gt;

&lt;p&gt;Como podemos ver cada uno de los principios de &lt;strong&gt;SOLID&lt;/strong&gt; consigue un objetivo en concreto.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Principio de Responsabilidad Única:&lt;/strong&gt; &lt;br&gt;
Su propósito es separar los comportamientos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Principio Abierto/Cerrado:&lt;/strong&gt; &lt;br&gt;
Su objetivo es ampliar el comportamiento de una clase sin modificar el comportamiento existente.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Principio de Sustitución de Liskov:&lt;/strong&gt;&lt;br&gt;
**Su objetivo es aplicar coherencia entre clases.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Principio de Segregación de la Interfaz:&lt;/strong&gt;&lt;br&gt;
**Su objetivo es dividir un conjunto de acciones en conjuntos más pequeños para ejecutar solo el conjunto de acciones que se requieren.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Principio de inversiones Dependencias:&lt;/strong&gt;&lt;br&gt;
**Su objetivo es reducir la dependencia de una clase de alto nivel en la clase de bajo nivel mediante la introducción de una interfaz.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por último, recordemos que &lt;strong&gt;SOLID&lt;/strong&gt; solo es una herramienta que nos ayuda a escribir mejor código, por lo que hay que tomar en cuenta que no hay que caer en el uso excesivo de &lt;strong&gt;SOLID&lt;/strong&gt; ya que puede que estos principios compliquen mucho el código si es así talvez solo sea necesario aplicar parte de estos.&lt;/p&gt;

</description>
      <category>oop</category>
      <category>javascript</category>
      <category>solid</category>
    </item>
    <item>
      <title>De POO a SOLID explicado con Pokémon - Los cuatro principios de POO</title>
      <dc:creator>Jorge Méndez Ortega</dc:creator>
      <pubDate>Wed, 26 Aug 2020 21:40:13 +0000</pubDate>
      <link>https://dev.to/jmz12/de-poo-a-solid-explicado-con-pokemon-1d0e</link>
      <guid>https://dev.to/jmz12/de-poo-a-solid-explicado-con-pokemon-1d0e</guid>
      <description>&lt;h6&gt;
  
  
  Guía para entender los cuatro principios de POO.
&lt;/h6&gt;

&lt;h4&gt;
  
  
  JavaScript - Los cuatro principios de POO
&lt;/h4&gt;

&lt;p&gt;En un post anterior hablamos sobre el paradigma de &lt;strong&gt;&lt;a href="https://dev.to/konami12/de-poo-a-solid-explicado-con-pokemons-3m3f"&gt;POO&lt;/a&gt;&lt;/strong&gt; aplicándolo a &lt;strong&gt;JavaScript&lt;/strong&gt;, de esta manera dimos el primer paso para poder comprender &lt;strong&gt;SOLID&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Con anterior hablamos sobre el paradigma de &lt;strong&gt;&lt;a href="https://dev.to/konami12/de-poo-a-solid-explicado-con-pokemons-3m3f"&gt;POO&lt;/a&gt;&lt;/strong&gt; aplicándolo a &lt;strong&gt;JavaScript&lt;/strong&gt;, de esta manera dimos el primer paso para poder comprender &lt;strong&gt;SOLID&lt;/strong&gt;. Si te perdiste el post anterior puedes consultarlo en el menú de arriba.&lt;/p&gt;

&lt;p&gt;Retomando nuestra aventura &lt;strong&gt;Pokémon&lt;/strong&gt; procederemos a entender los principios de &lt;strong&gt;&lt;a href="https://dev.to/konami12/de-poo-a-solid-explicado-con-pokemons-3m3f"&gt;POO&lt;/a&gt;&lt;/strong&gt;, para entrar en materia nos preguntaremos lo siguiente.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔖 Nota:&lt;/strong&gt; Todos los ejemplos de código utilizados están basados en &lt;strong&gt;JavaScript&lt;/strong&gt; usando las especificaciones más actuales hasta el momento.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🤔 ¿Cuáles son los principios de POO?
&lt;/h2&gt;

&lt;p&gt;Todo lo que es &lt;strong&gt;&lt;a href="https://dev.to/konami12/de-poo-a-solid-explicado-con-pokemons-3m3f"&gt;POO&lt;/a&gt;&lt;/strong&gt; es posible simplificarlos en cuatro grandes principios que permiten fundamentar dicho paradigma.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2AhXFebLehdhsUEP94jXIh7Q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2AhXFebLehdhsUEP94jXIh7Q.png" alt="Fig. 1: Los cuatro principios de POO."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  📕 Encapsulamiento
&lt;/h2&gt;

&lt;p&gt;Su propósito es que nadie se meta donde no le llaman, cada objeto es responsable de su propia información, estados los cuales solo pueden ser modificados por sus propios métodos, por lo cual sus atributos internos no tienen que ser accesibles desde fuera.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔖 Nota:&lt;/strong&gt; Cuando un atributo de un &lt;strong&gt;objeto&lt;/strong&gt; no es accesible desde fuera en &lt;strong&gt;&lt;a href="https://dev.to/konami12/de-poo-a-solid-explicado-con-pokemons-3m3f"&gt;POO&lt;/a&gt;&lt;/strong&gt; esto se conoce como privacidad.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Utilizando como base la clase &lt;strong&gt;&lt;a href="https://gist.github.com/konami12/2359d276454cdcb81d291597a042e375" rel="noopener noreferrer"&gt;Pokémon&lt;/a&gt;&lt;/strong&gt; que creamos en un &lt;strong&gt;&lt;a href="https://dev.to/konami12/de-poo-a-solid-explicado-con-pokemons-3m3f"&gt;POST&lt;/a&gt;&lt;/strong&gt; anterior procederemos a implementar el principio de encapsulamiento.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;¡Genial!&lt;/strong&gt; nuestra clase &lt;strong&gt;&lt;a href="https://gist.github.com/konami12/2359d276454cdcb81d291597a042e375" rel="noopener noreferrer"&gt;Pokémon&lt;/a&gt;&lt;/strong&gt; está utilizando &lt;strong&gt;privacidad&lt;/strong&gt; para que algunos de sus &lt;strong&gt;atributos&lt;/strong&gt; no san accesibles desde fuera y así es cómo funciona el principio de &lt;strong&gt;encapsulamiento😱&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔖 Nota:&lt;/strong&gt; Todas las &lt;strong&gt;métodos&lt;/strong&gt; y &lt;strong&gt;atributos&lt;/strong&gt; que no tienen el # son por defecto públicos, esto quiere decir que pueden ser consultados desde afuera de la &lt;strong&gt;clase&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  📗 Abstracción
&lt;/h2&gt;

&lt;p&gt;Hace pensar que los &lt;strong&gt;objetos&lt;/strong&gt; son similares a cajas negras, ya que sabremos cómo interactuar con ellos, pero no conocemos su comportamiento interno, esto trae como consecuencia la capacidad de modificar el comportamiento de un objeto sin afectar a quienes lo utilicen.&lt;/p&gt;

&lt;p&gt;Siguiendo con el tema de &lt;strong&gt;Pokémon&lt;/strong&gt;, imaginemos el funcionamiento de una &lt;strong&gt;Pokédex&lt;/strong&gt; el cual está &lt;strong&gt;abstraído&lt;/strong&gt; del usuario, pues basta solamente con saber cómo interactuar con él para realizar ciertas acciones, pero no tenemos ni la remota idea de cómo funciona internamente.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;¡Genial!&lt;/strong&gt; ya contamos con una nueva clase llamada &lt;strong&gt;Pokédex&lt;/strong&gt; con la que podemos consultar la información de un &lt;strong&gt;Pokémon&lt;/strong&gt;, como podemos apreciar en el ejemplo sin importar el origen de la &lt;strong&gt;data&lt;/strong&gt; el método &lt;strong&gt;getInfo&lt;/strong&gt; siempre muestra la información solicitada, por lo que la manera de interactuar con dicho método no cambia solo la clase padre es la que conoce sus cambios  y es así como funciona el principio de &lt;strong&gt;Abstracción&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  📘 Herencia
&lt;/h2&gt;

&lt;p&gt;Es la capacidad que permite crear &lt;strong&gt;objetos&lt;/strong&gt; a partir de otros ya existentes, los &lt;strong&gt;métodos&lt;/strong&gt; y &lt;strong&gt;atributos&lt;/strong&gt; del &lt;strong&gt;objeto&lt;/strong&gt; padre (&lt;strong&gt;Super Clase&lt;/strong&gt;) pasan a ser parte de los &lt;strong&gt;objetos&lt;/strong&gt; hijos (&lt;strong&gt;Sub-Clase&lt;/strong&gt;) los cuales son creados a partir de la &lt;strong&gt;Super Clase&lt;/strong&gt;, la herencia se basa en la reutilización de código.&lt;/p&gt;

&lt;p&gt;Imaginemos que se necesita crear un nuevo &lt;strong&gt;objeto&lt;/strong&gt; que permita definir a &lt;strong&gt;Pokémons&lt;/strong&gt; de &lt;strong&gt;Tipo Fuego&lt;/strong&gt;, pero este nuevo &lt;strong&gt;objeto&lt;/strong&gt; tiene que contar con las características de la clase &lt;strong&gt;&lt;a href="https://gist.github.com/konami12/2359d276454cdcb81d291597a042e375" rel="noopener noreferrer"&gt;Pokémon&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;¡Genial!&lt;/strong&gt; la clase &lt;strong&gt;TypeFire&lt;/strong&gt; entra a juego nos permite crear &lt;strong&gt;Pokémons&lt;/strong&gt; de tipo fuego y al mismo tiempo cuenta con todos los métodos y propiedades de la clase &lt;strong&gt;&lt;a href="https://gist.github.com/konami12/2359d276454cdcb81d291597a042e375" rel="noopener noreferrer"&gt;Pokémon&lt;/a&gt;&lt;/strong&gt;, además estamos reutilizando código😱 y así es cómo funciona el principio de &lt;strong&gt;Herencia&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔖 Nota:&lt;/strong&gt; Recordemos que la clase &lt;strong&gt;&lt;a href="https://gist.github.com/konami12/2359d276454cdcb81d291597a042e375" rel="noopener noreferrer"&gt;Pokémon&lt;/a&gt;&lt;/strong&gt; cuenta con atributos privados los cuales no pueden ser consultados directamente por la clase &lt;strong&gt;TypeFire&lt;/strong&gt; pero puede consultarlos gracias a los métodos que tienen acceso a dichos a tributos.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  📙 Polimorfismo
&lt;/h2&gt;

&lt;p&gt;Es la capacidad que tiene un &lt;strong&gt;objeto&lt;/strong&gt; de presentar diferentes comportamientos al momento de realizar una acción, el &lt;strong&gt;polimorfismo&lt;/strong&gt; se presenta cuando se aplica el principio de &lt;strong&gt;Herencia&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Utilizaremos nuevamente la clase &lt;strong&gt;TypeFire&lt;/strong&gt; ya que con anterioridad le aplicamos el principio de &lt;strong&gt;Herencia&lt;/strong&gt;, la clase &lt;strong&gt;&lt;a href="https://gist.github.com/konami12/2359d276454cdcb81d291597a042e375" rel="noopener noreferrer"&gt;Pokémon&lt;/a&gt;&lt;/strong&gt; tiene un método &lt;strong&gt;attack&lt;/strong&gt; con un comportamiento establecido, pero al utilizarlo dentro de la clase &lt;strong&gt;TypeFire&lt;/strong&gt; su comportamiento tiene que cambiar.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;¡Genial!&lt;/strong&gt; la clase &lt;strong&gt;TypeFire&lt;/strong&gt; define un nuevo comportamiento para el método &lt;strong&gt;attack&lt;/strong&gt; proveniente de la clase &lt;strong&gt;&lt;a href="https://gist.github.com/konami12/2359d276454cdcb81d291597a042e375" rel="noopener noreferrer"&gt;Pokémon&lt;/a&gt;&lt;/strong&gt;, de esta manera las dos clases comparten el método y cada una define un comportamiento diferente y así es como funciona el &lt;strong&gt;Polimorfismo&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔖 Nota:&lt;/strong&gt; Al igual que la herencia no podemos tener accesos a métodos y atributos privados.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🤔 Conclusiones
&lt;/h2&gt;

&lt;p&gt;Aprendimos los cuatro principios que le dan fundamento al &lt;strong&gt;&lt;a href="https://medium.com/@jmz12/javascript-el-paradigma-de-poo-b04d19b6322c" rel="noopener noreferrer"&gt;Paradigma de POO&lt;/a&gt;&lt;/strong&gt;, sabes cómo aplicarlos en nuestros desarrollos, es importante saber que JavaScript no cuenta con una implementación al 100 del paradigma de &lt;strong&gt;&lt;a href="https://medium.com/@jmz12/javascript-el-paradigma-de-poo-b04d19b6322c" rel="noopener noreferrer"&gt;Paradigma de POO&lt;/a&gt;&lt;/strong&gt; pero parece que busca dar el paso.&lt;/p&gt;

&lt;p&gt;Hemos dado un paso más para poder entender los cinco principios de &lt;strong&gt;SOLID&lt;/strong&gt; ya que hasta este punto podríamos decir que entendemos las bases de &lt;strong&gt;POO&lt;/strong&gt;, por lo que en el siguiente Articulo hablaremos de &lt;strong&gt;SOLID😱&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>oop</category>
      <category>javascript</category>
      <category>solid</category>
    </item>
    <item>
      <title>De POO a SOLID explicado con Pokémons - JavaScript - El paradigma de POO</title>
      <dc:creator>Jorge Méndez Ortega</dc:creator>
      <pubDate>Mon, 24 Aug 2020 21:37:40 +0000</pubDate>
      <link>https://dev.to/jmz12/de-poo-a-solid-explicado-con-pokemons-3m3f</link>
      <guid>https://dev.to/jmz12/de-poo-a-solid-explicado-con-pokemons-3m3f</guid>
      <description>&lt;h6&gt;
  
  
  Guía para entender el paradigma de POO.
&lt;/h6&gt;

&lt;h4&gt;
  
  
  JavaScript - El paradigma de POO
&lt;/h4&gt;

&lt;p&gt;En el &lt;a href="https://es.wikipedia.org/wiki/Paradigma" rel="noopener noreferrer"&gt;paradigma&lt;/a&gt; de la Programación Orientada a Objetos (&lt;strong&gt;POO&lt;/strong&gt; o &lt;strong&gt;OOP&lt;/strong&gt; en sus siglas en inglés) existen los principios o reglas &lt;strong&gt;SOLID&lt;/strong&gt; los cuales son una serie de normas que guían la forma en la que diseñamos nuestros sistemas. Aplicando dichos principios podemos encontrar los objetivos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1760%2F1%2A1__l-qufiqDtNmE19JLjvQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1760%2F1%2A1__l-qufiqDtNmE19JLjvQ.png" alt="Fig. 1: Objetivos de SOLID."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Un punto importante para poder comprender los principios de &lt;strong&gt;SOLID&lt;/strong&gt; es necesario comprender el &lt;a href="https://es.wikipedia.org/wiki/Paradigma" rel="noopener noreferrer"&gt;paradigma&lt;/a&gt; de &lt;strong&gt;POO&lt;/strong&gt;, tomando lo anterior en cuenta la pregunta que tenemos que hacernos es.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤔, Pero ¿Qué rayos es POO?
&lt;/h2&gt;

&lt;p&gt;Es un &lt;a href="https://es.wikipedia.org/wiki/Paradigma" rel="noopener noreferrer"&gt;paradigma&lt;/a&gt; de programación que utiliza la &lt;a href="https://es.wikipedia.org/wiki/Abstracci%C3%B3n_(filosof%C3%ADa)" rel="noopener noreferrer"&gt;abstracción&lt;/a&gt; para crear modelos de &lt;strong&gt;objetos&lt;/strong&gt; basados en el mundo real. Aplicando este paradigma podemos conseguir desarrollos más robustos y organizados además de conseguir beneficios tales como.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1760%2F1%2ARu9VSUzF1OBmb-G_kXHtlA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1760%2F1%2ARu9VSUzF1OBmb-G_kXHtlA.png" alt="Fig. 2: Beneficios de POO."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;El &lt;a href="https://es.wikipedia.org/wiki/Paradigma" rel="noopener noreferrer"&gt;paradigma&lt;/a&gt; de POO es considerado como el diseño de &lt;a href="https://es.wikipedia.org/wiki/Software" rel="noopener noreferrer"&gt;Software&lt;/a&gt; a través de conjuntos que cooperan entre sí, lo cual es muy diferente al antiguo &lt;a href="https://es.wikipedia.org/wiki/Programaci%C3%B3n_estructurada" rel="noopener noreferrer"&gt;paradigma de programación estructurada&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Muy interesante… si &lt;strong&gt;POO&lt;/strong&gt; se basa en &lt;strong&gt;objetos&lt;/strong&gt; la pregunta que tenemos que hacernos es.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔖 Nota:&lt;/strong&gt; Todos los ejemplos de código utilizados están basados en JavaScript usando las especificaciones más actuales hasta el momento.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🤔, Pero ¿Cómo logro pensar en Objetos?
&lt;/h2&gt;

&lt;p&gt;Pensar en &lt;strong&gt;objetos&lt;/strong&gt; es muy sencillo ya que es muy parecido a cómo lo haríamos en la vida real. Por ejemplo, imaginemos un &lt;strong&gt;Pokémon&lt;/strong&gt; el cual, para poder pasarlo a un &lt;strong&gt;modelo&lt;/strong&gt; de &lt;strong&gt;POO&lt;/strong&gt;, diríamos que el elemento principal (también conocido como &lt;strong&gt;clase&lt;/strong&gt;) es Pokémon, tomando esto en cuenta podemos realizarnos las siguientes preguntas.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤔 ¿Qué propiedades tiene un Pokémon?
&lt;/h2&gt;

&lt;p&gt;Todas las propiedades y características de un &lt;strong&gt;Pokémon&lt;/strong&gt; se conocen como &lt;strong&gt;atributos&lt;/strong&gt; los cuales cuentan con un identificador (nombre de la propiedad) y un tipo (conocido como tipo de dato).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1760%2F1%2ACCreUUtzuxKt_qTjq1lShw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1760%2F1%2ACCreUUtzuxKt_qTjq1lShw.png" alt="Fig. 3: Ejemplo Listado de atributos."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🤔 ¿Qué capacidades tiene un Pokémon?
&lt;/h2&gt;

&lt;p&gt;Todas las capacidades que definan el posible comportamiento de nuestro &lt;strong&gt;Pokémon&lt;/strong&gt; se conocen como &lt;strong&gt;métodos&lt;/strong&gt; los cuales pueden modificar a los atributos o llamar a otros &lt;strong&gt;métodos&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1760%2F1%2AkrpMjPULIEvSJzEBS60iWA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1760%2F1%2AkrpMjPULIEvSJzEBS60iWA.png" alt="Fig. 4: Ejemplo de listado de métodos."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔖 Nota:&lt;/strong&gt; Por cuestiones de practicidad solo tomaremos algunas de las capacidades y propiedades de un Pokémon.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🤔, Pero ¿Que rayos es una Clase?
&lt;/h2&gt;

&lt;p&gt;Funciona como un &lt;strong&gt;molde&lt;/strong&gt; que nos permite crear &lt;strong&gt;objetos&lt;/strong&gt; individuales en este caso del tipo &lt;strong&gt;Pokémon&lt;/strong&gt; permitiendo así definir los atributos y métodos que describen su comportamiento y estados.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1760%2F1%2AIXC6lgv0OoEFtduwpks9QA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1760%2F1%2AIXC6lgv0OoEFtduwpks9QA.png" alt="Fig. 5: Representación de la clase Pokémon."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¡Genial!&lt;/strong&gt; Poco a poco esto toma forma… ¡Ey! un momento falta realizarnos una pregunta la cual es.&lt;/p&gt;

&lt;h2&gt;
  
  
  🤔 ¿Entonces qué es un Objeto en POO?
&lt;/h2&gt;

&lt;p&gt;Es la representación &lt;a href="(https://es.wikipedia.org/wiki/Abstracci%C3%B3n_(filosof%C3%ADa))"&gt;abstracta&lt;/a&gt; de cualquier elemento de la vida real; mediante un componente de Software por lo que un &lt;strong&gt;objeto&lt;/strong&gt; es una &lt;strong&gt;instancia&lt;/strong&gt; de una &lt;strong&gt;clase&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F2600%2F1%2Aom0FfpzXNbTdqSOn3eOm6Q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F2600%2F1%2Aom0FfpzXNbTdqSOn3eOm6Q.png" alt="Fig. 6: Creando instancias de la clase Pokémon."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔖 Nota:&lt;/strong&gt; Se conoce como instancia a todo objeto que derive de otro. De esta forma todos los objetos son instancias menos la &lt;strong&gt;Clase&lt;/strong&gt; padre que es el origen.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;¡Genial!&lt;/strong&gt; ya conocemos algunos conceptos base del &lt;a href="https://es.wikipedia.org/wiki/Paradigma" rel="noopener noreferrer"&gt;paradigma&lt;/a&gt; de &lt;strong&gt;POO&lt;/strong&gt; es momento de aplicar lo aprendió y convertirlo en código, &lt;strong&gt;¡Manos a la obra!&lt;/strong&gt;&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;¡Genial!&lt;/strong&gt; hasta este punto ya generamos nuestra primera &lt;strong&gt;Clase&lt;/strong&gt; aplicando los conceptos básicos del paradigma de &lt;strong&gt;POO&lt;/strong&gt;, el código generado está basado en los diagramas utilizados.&lt;/p&gt;

&lt;p&gt;Si quiere aprender un poco más sobre el uso de clase en &lt;strong&gt;JavaScript&lt;/strong&gt; te recomiendo leer el siguiente &lt;strong&gt;POST&lt;/strong&gt;.&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="https://medium.com/@jmz12/usando-clases-en-javascript-e07f0e25c67d" class="ltag__link__link" rel="noopener noreferrer"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fv2%2Fresize%3Afill%3A88%3A88%2F1%2A8By4zHoqh7Q0In_tH_0xSw.jpeg" alt="Jorge Mendez Ortega"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://medium.com/@jmz12/usando-clases-en-javascript-e07f0e25c67d" class="ltag__link__link" rel="noopener noreferrer"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Usando Clases en JavaScript. Actualmente con las nuevas… | by Jorge Mendez Ortega | Medium&lt;/h2&gt;
      &lt;h3&gt;Jorge Mendez Ortega ・ &lt;time&gt;Jun 3, 2018&lt;/time&gt; ・ 
      &lt;div class="ltag__link__servicename"&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fmedium-f709f79cf29704f9f4c2a83f950b2964e95007a3e311b77f686915c71574fef2.svg" alt="Medium Logo"&gt;
        Medium
      &lt;/div&gt;
    &lt;/h3&gt;
&lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  Conclusiones
&lt;/h2&gt;

&lt;p&gt;Aprendimos los conceptos base del &lt;a href="https://es.wikipedia.org/wiki/Paradigma" rel="noopener noreferrer"&gt;paradigma&lt;/a&gt; de &lt;strong&gt;POO&lt;/strong&gt; y los beneficios que podemos obtener cuando se aplica en nuestros desarrollos, es importante saber que gracias a las nuevas características de &lt;strong&gt;JavaScript&lt;/strong&gt; podemos utilizar dicho paradigma.&lt;/p&gt;

&lt;p&gt;Iniciamos el camino para poder entender los cinco principios de &lt;strong&gt;SOLID&lt;/strong&gt;, pero antes de poder pasar al tema tenemos que conocer los cuatro principios que le dan sentido a &lt;strong&gt;POO&lt;/strong&gt;, este tema lo expondremos en el siguiente Articulo.&lt;/p&gt;

</description>
      <category>oop</category>
      <category>javascript</category>
      <category>solid</category>
    </item>
    <item>
      <title>Creando un deploy desde GitHub</title>
      <dc:creator>Jorge Méndez Ortega</dc:creator>
      <pubDate>Mon, 20 Jul 2020 05:21:11 +0000</pubDate>
      <link>https://dev.to/jmz12/creando-un-deploy-desde-github-3o27</link>
      <guid>https://dev.to/jmz12/creando-un-deploy-desde-github-3o27</guid>
      <description>&lt;h6&gt;
  
  
  GUÍA PARA GENERAR UN DEPLOY USANDO GITHUB Y SERVICIOS ONLINE
&lt;/h6&gt;

&lt;h3&gt;
  
  
  Usando Heroku, Glitch o CodeSandBox para desplegar un proyecto desde un repositorio.
&lt;/h3&gt;

&lt;p&gt;Actualmente sigo experimentando servicios online que permitan desplegar un proyecto desde &lt;em&gt;&lt;a href="http://github.com/"&gt;GitHub&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Anterioridad, probé &lt;em&gt;&lt;a href="https://www.mongodb.com/cloud/atlas"&gt;MongoDB Atlas&lt;/a&gt;&lt;/em&gt; para generar una Base de Datos y su respectiva conexión utilizando &lt;em&gt;&lt;a href="https://developer.mozilla.org/es/docs/Web/JavaScript"&gt;JavaScript&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;para saber más sobre el tema se puede consultar el post.&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;div class="ltag__link__content"&gt;
    &lt;div class="missing"&gt;
      &lt;h2&gt;Article No Longer Available&lt;/h2&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Existen algunos servicios que facilitan realizar un deploy desde un repositorio. La magia de estos servicios radica en que con poco esfuerzo podemos tener nuestro proyecto online🤯.&lt;/p&gt;




&lt;h2&gt;
  
  
  👐 Manos a la obra
&lt;/h2&gt;

&lt;p&gt;Lo primero es contar con el repositorio del proyecto al que deseamos dar salida. En este caso, utilizaremos el código generado el Post mencionado anteriormente.&lt;/p&gt;

&lt;h4&gt;
  
  
  ¿Pero por qué utilizar este código?
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Cuenta con una conexión con MongoDB Atlas&lt;/li&gt;
&lt;li&gt;Se requiere de la creación de Variables de entorno&lt;/li&gt;
&lt;li&gt;El desarrollo en si es un servidor básico&lt;/li&gt;
&lt;li&gt;Cuenta con los comandos básicos para levantar el servidor.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;🔖Nota: Es opcional el uso del código que comparto por este medio ya que posiblemente quieras generar el deploy de un proyecto personal.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9-wwsHG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/OrcaPracticas"&gt;
        OrcaPracticas
      &lt;/a&gt; / &lt;a href="https://github.com/OrcaPracticas/workshop-deploy"&gt;
        workshop-deploy
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      🛠 Taller para generar Deploys en servicios gratuitos.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;workshop-deploy&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;Ejemplo de como hacer deploy en varios servicios online&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/OrcaPracticas/workshop-deploy"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;Al contar con el repositorio, procederemos realizar el deploy de nuestro proyecto. Es importante tomar en cuenta que nuestro proyecto tiene que contar con tres características importantes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;El package.json tiene que contar con el comando start el cual permita levantar tu aplicación ya que este es el comando que usaran por defecto los servicios que utilizaremos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;En el caso de utilizar express o algún tipo de servidor es recomendable que el puerto que se utiliza para escuchar tiene que estar configurado en una variable de entorno.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Todo el código de nuestro proyectó es necesario que se encuentra en la rama master.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Principalmente nos enfocaremos en tres servicios, los cuales son fáciles de configurar y no es necesario ser un gurú para lograr nuestro objetivo, es importante crear o contar con una cuenta en los servicios que utilizaremos.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🔖 Nota: Otros servicios interesantes son &lt;em&gt;&lt;a href="https://vercel.com/"&gt;VERCEL&lt;/a&gt;&lt;/em&gt; y &lt;em&gt;&lt;a href="https://www.netlify.com/"&gt;NETTLIFY&lt;/a&gt;&lt;/em&gt;, considero que seria bueno dedicar un post solo para ellos.&lt;/p&gt;


&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  👨🏻‍💻 CodeSandBox
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fwph0sil9uh5qh4iqg2gp.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fwph0sil9uh5qh4iqg2gp.jpeg" alt="CodeSandBox" width="750" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Desde mi punto de vista es uno de los servicios mas populares ya que prácticamente es todo un entorno de desarrollo online ademas de que permite integrar nuestros proyectos con otros servicios, lo primero que procederemos hacer es ir directamente al sitio oficial de &lt;em&gt;&lt;a href="https://codesandbox.io/index2"&gt;CodeSandBox&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  📦 Cargando nuestro proyecto
&lt;/h2&gt;

&lt;p&gt;Al contar con el acceso a nuestro dashboard podremos crear un nuevo SandBox y visualizar todos los proyectos con los que estamos trabajando.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Flxem0tt1viexaidfw0e9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Flxem0tt1viexaidfw0e9.png" alt="Fig 1: DashBoard" width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para poder realizar el deploy es necesario seguir los siguientes pasos.&lt;/p&gt;

&lt;p&gt;1.- Dar click en la opción Create SandBox.&lt;br&gt;
2.- En el modal seleccionaremos Import Project.&lt;br&gt;
3.- En la caja de texto que aparece colocaremos la URL del repositorio.&lt;br&gt;
4.- Podemos seleccionar la opción Copy Link o Import and Fork.&lt;br&gt;
5.- Por ultimo se mostrara la integración de nuestro proyecto.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fpaukxv7po6rldchd36x5.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fpaukxv7po6rldchd36x5.gif" alt="Fig 2: Cargando nuestro proyecto en CodeSandBox." width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;¡Genial! haste este punto nuestro proyecto se cargo satisfactoriamente. Solo resta configurar el servidor ya que aún no levanta correctamente y esto es por qué no contamos con las variables de entorno las cuales son:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fhv648rjr2fq4fka51w24.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fhv648rjr2fq4fka51w24.png" alt="Fig 3: Variables de entorno para CodeSandBox" width="800" height="136"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dichas variables permiten que nuestro desarrollo pueda funcionar correctamente, existe un variable especial la cual es llamada &lt;strong&gt;ENV&lt;/strong&gt; esta nos funciona para detectar desde que servicio se esta generando un nuevo registro en nuestra base de datos. Para generar las variables de entorno es necesario seguir los siguientes pasos:&lt;/p&gt;

&lt;p&gt;1.- En las opciones de lado izquierdo seleccionaremos la opción que esta debajo del engrane.&lt;br&gt;
2.- En las opciones del panel que se muestra seleccionaremos la opción &lt;em&gt;Secret Keys&lt;/em&gt;.&lt;br&gt;
3.- En la primera caja de texto que se muestra colocaremos el nombre la variable en la segunda su valor correspondiente.&lt;br&gt;
4.- Daremos click en la opción &lt;em&gt;Add Secret&lt;/em&gt;.&lt;br&gt;
5 .- Al crear todas las variables, daremos click en la opción &lt;em&gt;Restart Server&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fa4yjssmslqn17k8oomzr.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fa4yjssmslqn17k8oomzr.gif" alt="Fig 4: Registrando variables de entorno" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;¡Excelente! nuestro proyecto ya esta disponible online, podemos compartir la &lt;em&gt;&lt;a href="https://kmbk6.sse.codesandbox.io/"&gt;url&lt;/a&gt;&lt;/em&gt; para que terceros puedan revisar nuestra implementación, para finalizar compartimos el resultado conseguido el cual cuenta con dos puntos de entrada los cuales son:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;//Listar datos
https://kmbk6.sse.codesandbox.io/

//Crear un nuevo registro
https://kmbk6.sse.codesandbox.io/random
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;iframe src="https://codesandbox.io/embed/working-shop-deploy-kmbk6?runonclick=1"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🔖 Nota: Es posible utilizar CodeSandBox sin la necesidad de registrarse pero algunas funciones no estarán disponibles por ejemplo la creación de variables de entorno.&lt;/p&gt;


&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  🐠 Glitch
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fuxrjkjxxxl40kq3mx7jc.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fuxrjkjxxxl40kq3mx7jc.jpeg" alt="Glitch" width="750" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Es un servicio bastante interesante, ya que nos brinda una interacción similar a CodeSandBox. Quizá un poco limitado en comparación a otros servicios y con una interfaz radical, pero poderoso y sencillo de utilizar. Lo primero que procederemos hacer, es ir directamente al sitio oficial de &lt;em&gt;&lt;a href="https://glitch.com/"&gt;glitch&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  📦 Cargando nuestro proyecto
&lt;/h2&gt;

&lt;p&gt;Al contar con el accesos a nuestro perfil podremos crear un nuevo proyecto y visualizar todos los proyectos con los que estamos interactuando.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0dumbywtn948u4gab7pq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0dumbywtn948u4gab7pq.png" alt="Fig 6: Panel de configuración de gltich." width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para poder realizar el deploy es necesario seguir los siguientes pasos.&lt;/p&gt;

&lt;p&gt;1.- Dar click en la opción New Project.&lt;br&gt;
2.- En el menú de opciones seleccionaremos Import from GitHub.&lt;br&gt;
3.- En el prompt que aparece colocaremos la Url del repositorio.&lt;br&gt;
4.- Dar click en la opción aceptar.&lt;br&gt;
5.- Por ultimo se iniciara la integración de nuestro proyecto.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fpwri892tu4ngz0p4nmj8.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fpwri892tu4ngz0p4nmj8.gif" alt="Fig 7:Importando un repositorio" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;¡Genial! haste este punto nuestro proyecto se cargo satisfactoriamente. Al igual como en el caso de CodeSandBox el servidor aún no levanta correctamente y esto es por qué no contamos aun con las variables de entorno las cuales son:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ffoyrv6sq2he08cpvcepg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ffoyrv6sq2he08cpvcepg.png" alt="Fig 8: Variables de entorno para Glitch." width="800" height="136"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como ya sabemos estas variables permiten el correcto funcionamiento del proyecto, al igual como en el caso anterior existe una variable especial la cual es llamada &lt;em&gt;ENV&lt;/em&gt;. Para generar las variables de entorno es necesario seguir los siguientes pasos:&lt;/p&gt;

&lt;p&gt;1.- En las opciones de lado izquierdo seleccionaremos el file .env.&lt;br&gt;
2.- Seleccionaremos la opción Add a Variable.&lt;br&gt;
3.- En la primera caja de texto colocaremos el nombre de la variable y en la segunda su valor correspondiente.&lt;br&gt;
4.- Al terminar de agregar las variables, seleccionaremos la opción share que se encuentra en el panel izquierdo.&lt;br&gt;
5 .- En el menu seleccionaremos la opción Live App y la opción Copy.&lt;br&gt;
6.- Abrimos una nueva pestaña y pegamos la url.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F9m3txnkh4dkc97fkstgx.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F9m3txnkh4dkc97fkstgx.gif" alt="Fig 9: Creando variables de Entorno para Glitch" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Excelente! nuestro proyecto ya esta disponible también en Glitch, ya contamos con una url para compartir, para finalizar compartimos el resultado conseguido el cual cuenta con 2 puntos de entrada los cuales son:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;//Listar datos
https://treasure-certain-goal.glitch.me
//Crear un nuevo registro
https://treasure-certain-goal.glitch.me/random
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="glitch-embed-wrap"&gt;
  &lt;iframe src="https://glitch.com/embed/#!/embed/treasure-certain-goal?previewSize=0&amp;amp;path=index.html" alt="treasure-certain-goal on glitch"&gt;&lt;/iframe&gt;
&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;🔖 Nota: Glitch tiene la posibilidad de utilizarse sin la necesidad de tener una cuenta pero su funcionalidad es un poco limitada.&lt;/p&gt;


&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  👨🏻‍💻Heroku
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fm6ebe9bt6g5b4gkxmgwb.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fm6ebe9bt6g5b4gkxmgwb.jpeg" alt="heroku" width="750" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Es una plataforma la cual facilita crear un deploy ya que solo basta con decirle que lenguaje de backend se está utilizando o qué motor de base de datos se esta utilizando para así solo preocuparnos por el desarrollo, lo primero que realizaremos es ir al sitio oficial de &lt;em&gt;&lt;a href="https://www.heroku.com/"&gt;heroku&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  📦 Cargando nuestro proyecto
&lt;/h2&gt;

&lt;p&gt;Al contar con el acceso a nuestro dashboard podremos crear nuevas aplicaciones y ver un listado de las que estan disponibles.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fff7r68pt5pt02hj72tmp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fff7r68pt5pt02hj72tmp.png" alt="Fig 11: Panel de control para heroku." width="800" height="254"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para poder realizar el deploy es necesario seguir los siguientes pasos.&lt;/p&gt;

&lt;p&gt;1.- Seleccionar la opción new.&lt;br&gt;
2.- Seleccionar la opción Create new App.&lt;br&gt;
3.- En la caja de texto colocaremos el nombre de nuestra app es importante que la caja de texto este en color verde.&lt;br&gt;
4.- Seleccionaremos la Región por defecto podemos dejar la opción seleccionada.&lt;br&gt;
5.- Por seleccionamos la opción Create App.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fx1wobobo5sthaah54ik9.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fx1wobobo5sthaah54ik9.gif" alt="Fig 12: Creando una nueva App" width="1660" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;¡Genial! haste este punto contamos con el espacio listo para poder cargar nuestro proyecto, por lo que procederemos a realizar las configuraciones pertinentes como crear las siguientes variables de entorno:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0jg2xgxmdownr6mrmq2h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0jg2xgxmdownr6mrmq2h.png" alt="Fig 13: Variables de entorno para Heroku" width="800" height="136"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como ya sabemos estas variables permiten el correcto funcionamiento del proyecto, al igual que en los casos anteriores existe una variable especial la cual es llamada &lt;em&gt;ENV&lt;/em&gt;. Para generar las variables de entorno es necesario seguir los siguientes pasos:&lt;/p&gt;

&lt;p&gt;1.- Seleccionar la opción Settings.&lt;br&gt;
2.- En la nueva pantalla seleccionar Reveal Config Var.&lt;br&gt;
3.- En la primera caja de texto colocaremos el nombre de la variable y en la segunda su valor correspondiente.&lt;br&gt;
4.- Seleccionar la opción add.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fcfi1hmu1patopm4cvk3x.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fcfi1hmu1patopm4cvk3x.gif" alt="Fig 14: Creando variables de entorno" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ya contamos con la configuración necesaria para realizar el deploy de nuestro proyecto, para poder realizar esta tarea es necesario conectar GitHub siguiendo los siguientes pasos.&lt;/p&gt;

&lt;p&gt;1.- Seleccionar la opción Deploy.&lt;br&gt;
2.- Seleccionar la opción GitHub.&lt;br&gt;
3.- Seleccionar la opción Connect to GitHub.&lt;br&gt;
4.- En el modal que se muestra seleccionar la opción Authorize heroku.&lt;br&gt;
5.- En caso de que aparezca un error basta con recargar.&lt;br&gt;
6.- En las nuevas opciones que aparecen indicaremos en que cuenta o organización esta el repositorio.&lt;br&gt;
7.- Buscamos y seleccionamos el repositorio se mostraran dos nuevas opciones.&lt;br&gt;
8.- Las nuevas opciones permiten seleccionar que rama utilizaremos así como indicar si queremos un Automatic Deploy o Manual Deploy.&lt;br&gt;
9.- Al seleccionar una alguna opción se iniciara el deploy .&lt;br&gt;
10.- Al terminar seleccionaremos la opción view para ver el resultado.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgk8l3f7pzx5b105qxiis.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgk8l3f7pzx5b105qxiis.gif" alt="Fig 15: Integrando el proyecto." width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;¡Excelente! nuestro proyecto ya esta disponible también en Heroku, ya contamos con una url para compartir, para finalizar compartimos el resultado conseguido al igual que los otros casos esta también cuenta con dos puntos de entrada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;//Listar datos
https://work-shop-deploy.herokuapp.com/
//Crear un nuevo registro
https://work-shop-deploy.herokuapp.com/random
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;🔖 Nota: Heroku cuenta con una opción de integración continua al esta opción solo esta disponible para Automatic Deploy esta opción puede generar deploy automáticos siempre que detecte un cambio en la rama que estemos utilizando.&lt;/p&gt;


&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  📝 Conclusiones
&lt;/h2&gt;

&lt;p&gt;Los tres servicios que revisamos cada uno tienes sus peculiaridades y poderes por ejemplo.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;CodeSandBox: Prácticamente es un editor online el caul te permite configurar tu entorno de desarrollo lo que da mucha agilidad al momento de proptotipar un proyecto.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Glitch: Es un editor mas limitado pero desde mi punto de vista es como si trabajaras con Vim, glitch cuenta con una integración de terminal la cual te da mucha flexibilidad al momento de iniciar tu desarrollo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Heroku: Este es mas un PaaS ya que solo tenemos que preocuparnos por configurar lo mínimo para que nuestro proyecto funcione correctamente.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Desde mi punto de vista no existe un servicio ideal pero sí muchas soluciones las cuales al unirlas pueden darte el resultado deseado, como recomendación es bueno que veas las capacidades de cada uno de los servicios y explotarlos al máximo.&lt;/p&gt;

&lt;p&gt;Es importante recordar que los tres servicios al no contar con trafico por un determinado tiempo estos se bajaran temporal mente hasta que sean consultados nuevamente.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>github</category>
      <category>mongodb</category>
      <category>node</category>
    </item>
    <item>
      <title>Jugando Con MongoDB Atlas y un poco con JavaScript</title>
      <dc:creator>Jorge Méndez Ortega</dc:creator>
      <pubDate>Sat, 04 Jul 2020 05:29:03 +0000</pubDate>
      <link>https://dev.to/jmz12/jugando-con-mongodb-atlas-y-un-poco-con-javascript-1bfb</link>
      <guid>https://dev.to/jmz12/jugando-con-mongodb-atlas-y-un-poco-con-javascript-1bfb</guid>
      <description>&lt;p&gt;Actualmente estoy jugando con algunos servicios en la nube como &lt;a href="https://dashboard.heroku.com/"&gt;heroku&lt;/a&gt;, &lt;a href="https://www.netlify.com/"&gt;netlifly&lt;/a&gt;, &lt;a href="https://vercel.com/?utm_source=next-site&amp;amp;utm_medium=banner&amp;amp;utm_campaign=next-website"&gt;vercel&lt;/a&gt; y &lt;a href="https://www.mongodb.com/cloud/atlas"&gt;MoongoDB Atlas&lt;/a&gt;, este ultimo me agrado ya que es muy intuitivo al momento de generar bases de datos, &lt;em&gt;cluster&lt;/em&gt; entre otras cosas, su versión &lt;strong&gt;&lt;em&gt;free&lt;/em&gt;&lt;/strong&gt; me parece muy completa, por lo cual decide generar una breve guía de como usarlo.&lt;/p&gt;

&lt;h3&gt;
  
  
  🤔 ¿Que es MongoDB Atlas?
&lt;/h3&gt;

&lt;p&gt;Es un servicio en la nube para bases de datos desarrollado por el equipo de &lt;strong&gt;&lt;em&gt;mongoDB&lt;/em&gt;&lt;/strong&gt;, es posible crear bases de datos las cuales son expuestas online lo cual permite conectar nuestras aplicaciones, Atlas se encarga de todos los aspectos de &lt;em&gt;hosting&lt;/em&gt;, &lt;em&gt;instalación&lt;/em&gt; y &lt;em&gt;actualizaciones&lt;/em&gt;, por lo que solo nos encargaremos de las configuraciones básicas, como gestionar accesos, crear bases de datos, crear alertas, etc.&lt;/p&gt;

&lt;h3&gt;
  
  
  👐 Manos a la obra
&lt;/h3&gt;

&lt;p&gt;El primer paso es crear una cuenta en el sitio de &lt;a href="https://www.mongodb.com/cloud/atlas"&gt;MongoDB Atlas&lt;/a&gt;. Al entrar en enlace anterior se mostrar la pagina principal en la que procederemos a seleccionar la opción &lt;strong&gt;&lt;em&gt;Sign In&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fb3sdkim3oo3mccrxr78u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fb3sdkim3oo3mccrxr78u.png" alt="Fig 1: Página principal de MongoDB Atlas." width="800" height="283"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dicha opción nos mostrara una pantalla de &lt;strong&gt;&lt;em&gt;Login&lt;/em&gt;&lt;/strong&gt; en la que se tienen las siguientes opciones.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Acceder en el caso de tener una cuenta existente.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Acceder con una cuenta de &lt;strong&gt;&lt;em&gt;Google&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Sign up&lt;/em&gt;&lt;/strong&gt; la cual permite generar nuestro registro.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;🔖 &lt;strong&gt;Nota:&lt;/strong&gt; La opción de login dependerá de las preferencias del lector.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Si el registro se creo correctamente al iniciar sesión podremos ver el panel de administración, en el cual se mostrara el &lt;em&gt;proyecto&lt;/em&gt; y &lt;em&gt;cluster&lt;/em&gt; por defecto.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fab2q2zr94ygncrw33ep6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fab2q2zr94ygncrw33ep6.png" alt="Fig 2: Página principal de la cuenta" width="800" height="283"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;h4&gt;
  
  
  Podemos utilizar el botón “Create a New Cluster” pero con esta acción se solicitara un pago.
&lt;/h4&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  🚫 Borrando un Cluster
&lt;/h3&gt;

&lt;p&gt;Por cuestiones didácticas procederemos a borrar el &lt;em&gt;cluster&lt;/em&gt; y el &lt;em&gt;proyecto&lt;/em&gt; creados por defecto al momento de crear nuestra cuenta, para esto seguiremos el flujo siguiente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F4gyngc6n5evluwr8chiy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F4gyngc6n5evluwr8chiy.gif" alt="Fig 3: Borrando el cluster por defecto" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔖 Nota:&lt;/strong&gt; El proyecto es borrado ya que es la base para poder tener un cluster y por fines didácticos procederemos a borrar todo.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  🛠 Creando un Cluster
&lt;/h3&gt;

&lt;p&gt;Al borrar el &lt;em&gt;proyecto&lt;/em&gt; y &lt;em&gt;cluster&lt;/em&gt; procederemos a crear los propios, como la vez anterior seguiremos el siguiente flujo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rFJW2rWp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://cdn-images-1.medium.com/max/3284/1%2Ah5zOkyXiDHsqe52-ruYX9Q.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rFJW2rWp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://cdn-images-1.medium.com/max/3284/1%2Ah5zOkyXiDHsqe52-ruYX9Q.gif" alt="Fig 4: Creando un nuevo proyecto y Cluster." width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Una de las ventajas de crear el &lt;em&gt;cluster&lt;/em&gt; es que podemos indicar a uno de los siguientes proveedores &lt;em&gt;AWS, Google CloudPlatform o Azure&lt;/em&gt;, otro punto importante es que nos muestra los tipos de &lt;em&gt;cluster&lt;/em&gt; que se pueden crear.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h4&gt;
  
  
  Shared Clusters: Para el desarrollo de aplicaciones pequeñas o para equipos que inician con MongoDB, prácticamente para poder probar el producto.
&lt;/h4&gt;
&lt;h4&gt;
  
  
  Dedicated Clusters: Para desarrollos avanzados o entornos de producción.
&lt;/h4&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Dedicated Multi-Region Clusters: Para el desarrollo de aplicaciones de clase mundial que requieren soporte multiregional o una &lt;a href="https://es.wikipedia.org/wiki/Latencia"&gt;latencia&lt;/a&gt; muy baja.
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔖 Nota:&lt;/strong&gt; Al contar con una cuenta free procederemos a seleccionar la opción Shared Clusters.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  ⚙️ Configurando Network Access
&lt;/h3&gt;

&lt;p&gt;Al finalizar la creación procederemos a brindar el acceso a ciertas &lt;em&gt;ip’s&lt;/em&gt; en pocas palabras generaremos un &lt;strong&gt;&lt;em&gt;whitelist&lt;/em&gt;&lt;/strong&gt;, para realizar esta tarea seguiremos el flujo siguiente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uttr2nOd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://cdn-images-1.medium.com/max/3284/1%2AP1Zx3ndwJl0nEoWCK5IfNw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uttr2nOd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://cdn-images-1.medium.com/max/3284/1%2AP1Zx3ndwJl0nEoWCK5IfNw.gif" alt="Fig 5: Creando un WhiteList" width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Al generar nuestro &lt;em&gt;WhiteList&lt;/em&gt; cómo se puede ver en el flujo anterior se muestran algunas opciones las cuales son.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h4&gt;
  
  
  Add Current IP Address: Con esta opción se agrega la ip publica del equipo con en el que estamos trabajando.
&lt;/h4&gt;
&lt;h4&gt;
  
  
  Allow Access From AnyWhere: Esta opción permite agregar la opción de darle acceso a cualquier IP.
&lt;/h4&gt;
&lt;/blockquote&gt;

&lt;p&gt;Existe otra opción la cual es “&lt;em&gt;This entry is temporary and will be deleted in&lt;/em&gt;” la cual permite generar el acceso por un limite de tiempo a cualquiera delas opciones mencionadas anteriormente.&lt;/p&gt;

&lt;h3&gt;
  
  
  📡 Conectando una Aplicación
&lt;/h3&gt;

&lt;p&gt;Para poder tener accesos al cluster creado tenemos que generar un nuevo usuarios y crear la cadena de conexión, por lo que para esta acción seguiremos el siguiente flujo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TZUvz8Fx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://cdn-images-1.medium.com/max/3284/1%2A3Bb32xQ8g5FFpLBhf06Wmw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TZUvz8Fx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://cdn-images-1.medium.com/max/3284/1%2A3Bb32xQ8g5FFpLBhf06Wmw.gif" alt="Fig 6: Creando un nuevo usuario y cadena de conexión." width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Al generar un nuevo usuario procederemos a indicar cómo realizaremos la conexión para este caso tenemos 3 opciones las cuales son.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h4&gt;
  
  
  Connect with the mongo shell: Permite conectarnos a mongoBD desde la consola del sistema siempre y cuando lo tengamos instalado
&lt;/h4&gt;
&lt;h4&gt;
  
  
  Connect your application: Permite generar la cadena de conexión a utilizarla en nuestra aplicación.
&lt;/h4&gt;
&lt;h4&gt;
  
  
  Connect using MongoDB Compass: Esta opción permite conectarnos usando la aplicación oficial de atlas.
&lt;/h4&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  👨🏻‍💻 Creando la aplicación
&lt;/h3&gt;

&lt;p&gt;Antes de iniciar nuestra aplicación se es necesario contar son una instalación de &lt;strong&gt;NodeJS&lt;/strong&gt; y se recomienda la siguiente estructura de carpetas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5hwQZ_Wr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2ATAdcruSFcx8XoKEug6y3XQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5hwQZ_Wr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2ATAdcruSFcx8XoKEug6y3XQ.png" alt="Fig 7: Estructura de carpetas." width="348" height="222"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Inicial mente procederemos a crear el &lt;em&gt;package.json&lt;/em&gt; en el cual procederemos a a instalar las siguientes dependencias&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;moongose&lt;/strong&gt;: Con esta dependencia procederemos a realizar la conexión con &lt;a href="https://www.mongodb.com/cloud/atlas"&gt;*MongoDB Atlas&lt;/a&gt; &lt;em&gt;y podremos interactuar con la *Base de Datos&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;expressjs&lt;/strong&gt;: Lo utilizaremos para crear un servidor muy sencillo con el cual podremos ver las respuestas que nos mande &lt;em&gt;Atlas&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;nodemon&lt;/strong&gt;: Se utilizara para que cada vez que generamos un cambio se genere un &lt;em&gt;auto-reload&lt;/em&gt;.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔖 Nota:&lt;/strong&gt; Los próximos archivos todos serán generados dentro del directorio /src/.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;El paso siguiente es crear el archivo &lt;em&gt;schema.js&lt;/em&gt; el cual se puede considerar como un mapa de los campos a crear ademas podemos indicar el tipo de dato de cada unos de estos, en pocas palabras es el cuerpo de la colección a crear.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h4&gt;
  
  
  Una colección dentro de mongoDB es el equivalente a las tablas que se manejan en MySql o SqlServer.
&lt;/h4&gt;
&lt;/blockquote&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Por cuestiones didácticas vamos a crear un &lt;em&gt;JSON&lt;/em&gt; llamado &lt;em&gt;fakeData.json&lt;/em&gt; en el cual tendremos nombres y apellidos que tomaremos de manera aleatoria para crear registros dentro de &lt;em&gt;MongoDB.&lt;/em&gt;&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Como paso final hay que generar el &lt;em&gt;index.js&lt;/em&gt;  en el cual se establecerá la conexión y contara con 2 rutas que nos permitirán consultar la Base de Datos o crear nuevos registros.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;En el script anterior la conexión realizada esta envolviendo a la inicialización del servidor esto es para que dicha conexión este disponible al iniciar el server, al crear el servidor se generar dos rutas las cuales son.&lt;/p&gt;

&lt;p&gt;Consultar los datos.&lt;br&gt;
&lt;a href="https://lr836.sse.codesandbox.io/"&gt;https://lr836.sse.codesandbox.io/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Crear un nuevo registro de manera aleatoria, esta ruta como se muestra en el código tiene el ejemplo base de para generar un registro.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://lr836.sse.codesandbox.io/random"&gt;https://lr836.sse.codesandbox.io/random&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En el caso de que se tenga problemas ejecutando el código se cuenta con esta muestra para probarlo directamente o puede ir a &lt;a href="https://codesandbox.io/s/mongodbatlas-lr836"&gt;codeSandBox&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;iframe src="https://codesandbox.io/embed/mongodbatlas-lr836"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  📝 Conclusiones
&lt;/h3&gt;

&lt;p&gt;Atlas es una herramienta muy completa y potente ademas esta respaldada por el mismo equipo que creo MongoDB😱, entre otras de sus fortalezas es la seguridad que nos brinda con él control de accesos y creación de usuarios.&lt;/p&gt;

&lt;p&gt;La conectividad con nuestra aplicación que generamos no fue compleja fue de los mas sencillo y transparente, com recomendación te sugiero leas la documentación de &lt;a href="https://mongoosejs.com/docs/guide.html"&gt;Mongoose&lt;/a&gt; ya que tiene muchas funciones que permiten explotar a MongoDB Atlas.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>mongodb</category>
      <category>node</category>
    </item>
    <item>
      <title>Jugando con Git y Github (Parte-1)</title>
      <dc:creator>Jorge Méndez Ortega</dc:creator>
      <pubDate>Wed, 12 Feb 2020 08:32:58 +0000</pubDate>
      <link>https://dev.to/jmz12/jugando-con-git-y-github-parte-1-44o</link>
      <guid>https://dev.to/jmz12/jugando-con-git-y-github-parte-1-44o</guid>
      <description>&lt;p&gt;La idea de generar este post ayudar a todos aquellos que desean aprender como utilizar &lt;strong&gt;&lt;a href="https://git-scm.com/"&gt;Git&lt;/a&gt;&lt;/strong&gt; y **&lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt; por lo cual para poder empezar a jugar con estos nuevos juguetes es necesario aprender algunas bases las cuales facilitaran el entendimiento de cómo trabajan.&lt;/p&gt;

&lt;p&gt;Actualmente &lt;strong&gt;&lt;a href="https://git-scm.com/"&gt;Git&lt;/a&gt;&lt;/strong&gt; y &lt;strong&gt;&lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt;&lt;/strong&gt; forman parte importante en el día a día de un desarrollador especialmente cuando se trabaja en un equipo, dichas herramienta son utilizadas mucho en la industria del software, la primera pregunta qué tenemos que hacer es.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤔 ¿Qué es un sistema de control de versiones?
&lt;/h2&gt;

&lt;p&gt;Es un sistema que controla y organiza todos los cambios realizados en un archivo o conjunto de estos a lo largo del tiempo, de modo que facilita la recuperación de versiones especificas, de una manera mas fácil permite movernos en la linea de tiempo del archivo o conjunto.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  Sistema de control de versiones también conocido como VCS del inglés Version Control System.
&lt;/h1&gt;
&lt;/blockquote&gt;

&lt;p&gt;Este tipo de control es muy común en la industria informática para llevar el control del código fuente desarrollado lo cual da la pauta para los &lt;strong&gt;&lt;em&gt;sistemas de control de código.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  Sistema de control de versiones también conocido como SCM del inglés Source Code Management.
&lt;/h1&gt;
&lt;/blockquote&gt;

&lt;h6&gt;
  
  
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--D15h28No--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AhQil9l4Sgo_J3QtdXJ7GhA.png" alt="**Fig 1. Ejemplo base de un sistema de control de código.**" width="789" height="393"&gt;&lt;strong&gt;&lt;em&gt;Fig 1. Ejemplo base de un sistema de control de código.&lt;/em&gt;&lt;/strong&gt;
&lt;/h6&gt;

&lt;p&gt;Como se puede ver en la &lt;strong&gt;Fig 1&lt;/strong&gt; se muestra el flujo de trabajo de un &lt;strong&gt;VCS&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Se muestra la línea de tiempo del proyecto en el se marcan las fechas donde se generaron los cambios.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Se muestra el avance del proyecto conforme a la línea de tiempo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Se muestra la manera en la que se lleva en el control de los cambios, donde se destaca el registro de actividades mediante una breve descripción del cambio y el registro de la actividad realizada.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Para poder llegar a lo que es un sistema de control de versiones como los conocemos hoy en día todo inicio con.&lt;/p&gt;




&lt;h2&gt;
  
  
  Control de versiones locales
&lt;/h2&gt;

&lt;h6&gt;
  
  
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6w5i5F76--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2ADVmiRxSkbi4323KF8HgMbw.png" alt="**Fig 2. Diagrama del Sistema de control de versiones locales**" width="428" height="192"&gt;&lt;strong&gt;Fig 2. Diagrama del Sistema de control de versiones locales&lt;/strong&gt;
&lt;/h6&gt;

&lt;p&gt;Como su nombre lo dice las versiones se manejan de manera local y en vez de mantener las versiones como archivos independientes se almacenaban en bases de datos &lt;strong&gt;(BullShit😱)&lt;/strong&gt; por lo que cuando se necesitaba revisar una versión anterior del proyecto se usaba el *VSC *para acceder directamente al archivo, de esta manera solo se tenia una copia del proyecto lo cual elimina la posibilidad de confundir o eliminar versiones.&lt;/p&gt;

&lt;p&gt;Hasta este o punto el control de versiones se llevaba en la computadora de cada uno de los desarrolladores por lo que no existía una manera eficiente de compartir código entre ellos.&lt;/p&gt;




&lt;h2&gt;
  
  
  Control de Versiones Centralizados
&lt;/h2&gt;

&lt;h6&gt;
  
  
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qqb3SECI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AePqdC6Tzj2GCkyHkvZHoNA.png" alt="**Fig 2. Diagrama del Sistema Control de Versiones Centralizados**" width="370" height="377"&gt;&lt;strong&gt;&lt;em&gt;Fig 2. Diagrama del Sistema Control de Versiones Centralizados&lt;/em&gt;&lt;/strong&gt;
&lt;/h6&gt;

&lt;p&gt;Este sistema fue una gran evolución ya que proporcionan la facilidad de colaboración de múltiples desarrolladores en un solo proyectó, por lo que los cambios ya no se guardaban de manera local, con esta actualización los cambios se almacenan en un servidor central.&lt;/p&gt;

&lt;p&gt;Aunque el avance contra los &lt;strong&gt;sistemas de versionado local&lt;/strong&gt; fue muy grande. los sistemas centralizados trajeron consigo nuevos retos, &lt;strong&gt;¿Cómo trabajaban múltiples usuarios en un mismo archivo al mismo tiempo?&lt;/strong&gt;, lo cual era muy complejo ya que se presentaba la posibilidad de inhabilitar los cambios de otros, por lo que este tipo de sistema funcionaba muy bien donde el proyecto no sufre cambios de manera constante constantemente.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  Hasta este punto el dios digital nos odiaba 🖕🏼.
&lt;/h1&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Control de Versiones Distribuidos
&lt;/h2&gt;

&lt;h6&gt;
  
  
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---idIQIVo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AelF8QQFAMNEKE_WO5Bjj_w.png" alt="**Fig 3. Diagrama del Sistema Control de Versiones Distribuidos**" width="428" height="608"&gt;&lt;strong&gt;&lt;em&gt;Fig 3. Diagrama del Sistema Control de Versiones Distribuidos&lt;/em&gt;&lt;/strong&gt;
&lt;/h6&gt;

&lt;p&gt;En este punto bajo el &lt;strong&gt;diosito digital y dijo&lt;/strong&gt; ya no existirá un solo repositorio centralizado por lo que cada miembro del equipo contara con una copia local de todo el proyecto, de esta manera se contara con una red distribuida de repositorios.&lt;/p&gt;

&lt;p&gt;Al no contar con un repositorio centralizado, cada desarrollador puede trabajar a su propio ritmo y almacenar sus cambios de manera local por lo que al mezclar lo cambios de otros los conflictos que se presentan son menores, como cada desarrollador tiene una copia completa del proyecto los riesgos de caída del servidor, un repositorio dañado.&lt;/p&gt;

&lt;p&gt;Si lo se la teoría es muy aburrida en ocaciones pero puede ser buena cuando queremos conseguir un entendimiento completo de lo que esta pasando.&lt;/p&gt;

&lt;h3&gt;
  
  
  🤯 Git y GitHub diferentes
&lt;/h3&gt;

&lt;h6&gt;
  
  
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hquTDz-j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2ACSlNpnP80TtOmx16uyaRfg.png" alt="**Fig 4. Git y GitHub no es lo mismo**" width="394" height="182"&gt;&lt;strong&gt;&lt;em&gt;Fig 4. Git y GitHub no es lo mismo&lt;/em&gt;&lt;/strong&gt;
&lt;/h6&gt;

&lt;p&gt;Si como lo acabas de leer son dos cosas completamente diferentes por lo que es importante entender las principales diferencias de estos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://git-scm.com/"&gt;Git&lt;/a&gt;&lt;/strong&gt; es utilizado para trabajar de manera local pero cuando se desea colaborar con otras personas de manera remota, utilizar una interfaz web o publicar tus proyectos se utiliza &lt;strong&gt;&lt;a href="https://github.com/"&gt;Github&lt;/a&gt;&lt;/strong&gt; es un sistema que guarda nuestro proyectó y los cambios de cada una de las versiones, &lt;strong&gt;&lt;a href="https://github.com/"&gt;Github&lt;/a&gt;&lt;/strong&gt; es tan popular que es la &lt;strong&gt;red social del código&lt;/strong&gt;(Como FaceBook o Twitter pero para programadores), &lt;strong&gt;es una hoja de vida (CV)&lt;/strong&gt; que de muestra lo que sabes.&lt;/p&gt;

&lt;h3&gt;
  
  
  👨🏻‍💻 Jugando con la consola
&lt;/h3&gt;

&lt;p&gt;Después de un poco de teoría creo que ya es bueno iniciar con le uso de comandos básicos en &lt;strong&gt;&lt;a href="https://git-scm.com/"&gt;Git&lt;/a&gt;🙌&lt;/strong&gt; por lo que para iniciar seguiremos los pasos siguientes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Paso 1:&lt;/strong&gt; Descargar Git e Instalarlo, lo podemos descargar directamente de su sitio web(&lt;a href="https://git-scm.com/"&gt;Descargar Git&lt;/a&gt;), para el caso de &lt;strong&gt;Windows&lt;/strong&gt; y &lt;strong&gt;Mac&lt;/strong&gt; se cuenta con un asistente de instalación por lo que no se tiene mayor problema para la instalación, para el caso de &lt;strong&gt;Linux&lt;/strong&gt; se puede utilizar &lt;strong&gt;apt-get install git.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Paso 2:&lt;/strong&gt; Para el caso de &lt;strong&gt;Linux&lt;/strong&gt; y &lt;strong&gt;Mac&lt;/strong&gt; podemos abrir la terminal propia del sistema, en el caso de &lt;strong&gt;Windows&lt;/strong&gt; utilizaremos el &lt;strong&gt;GitBash(nos permite usar comandos de linux 🤯)&lt;/strong&gt; que se instalo al realizar la instalación de git.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Paso 3:&lt;/strong&gt; Al encontrarnos en la consola iniciaremos escribiremos los siguientes comandos.&lt;/p&gt;

&lt;h6&gt;
  
  
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gaUfdrki--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2720/1%2AYqHJqiOOCdLxBPqc1hP9iw.png" alt="**Fig 5. Creando la estructura de carpetas**" width="800" height="152"&gt;&lt;strong&gt;&lt;em&gt;Fig 5. Creando la estructura de carpetas&lt;/em&gt;&lt;/strong&gt;
&lt;/h6&gt;

&lt;p&gt;&lt;strong&gt;Paso 4:&lt;/strong&gt; Procederemos a configurar nuestro &lt;strong&gt;nombre&lt;/strong&gt; y &lt;strong&gt;email&lt;/strong&gt; de manera global(para todos los repositorios) con los comandos.&lt;/p&gt;

&lt;h6&gt;
  
  
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--R9WbNYR0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2720/1%2ANoqOZgxNiUseiiGzhy5rkw.png" alt="**Fig 6. Configurando nuestro nombre y e-mail**" width="800" height="102"&gt;&lt;strong&gt;&lt;em&gt;Fig 6. Configurando nuestro nombre y e-mail&lt;/em&gt;&lt;/strong&gt;
&lt;/h6&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔖 Nota&lt;/strong&gt;: Si necesitaremos que cada repositorio tenga un nombre o correo diferente solo tenemos que cambiar &lt;strong&gt;&lt;em&gt;— global&lt;/em&gt;&lt;/strong&gt; por &lt;strong&gt;&lt;em&gt;— local&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Paso 5:&lt;/strong&gt; Para poder iniciar el uso de &lt;strong&gt;&lt;em&gt;Git&lt;/em&gt;&lt;/strong&gt; vasta con que ejecutemos el siguiente comando.&lt;/p&gt;

&lt;h6&gt;
  
  
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Fvxlc9o_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2720/1%2ARAEWlSXNwYE8Zw1jFommOw.png" alt="**Fig 7. Iniciando nuestro primer repositorio**" width="800" height="78"&gt;&lt;strong&gt;&lt;em&gt;Fig 7. Iniciando nuestro primer repositorio&lt;/em&gt;&lt;/strong&gt;
&lt;/h6&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔖 Nota&lt;/strong&gt;: Se creara una carpeta oculta llamada .git esta es la que llevara el control de cambios.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Paso 6:&lt;/strong&gt; Agregamos algo de contenido nuevo a nuestro repositorio esto lo lograremos utilizando los comandos.&lt;/p&gt;

&lt;h6&gt;
  
  
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AF9r_QMz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2720/1%2A14Jk3R2vCUHNHu1_1cpxPA.png" alt="**Fig 8. Creamos un archivo**" width="800" height="102"&gt;&lt;strong&gt;&lt;em&gt;Fig 8. Creamos un archivo&lt;/em&gt;&lt;/strong&gt;
&lt;/h6&gt;

&lt;p&gt;&lt;strong&gt;Paso 7:&lt;/strong&gt; Para ver el estado del repositorio, o lo que es lo mismo un informe de los cambios realizados a archivos/directorios, vasta con que ejecutemos el siguiente comando.&lt;/p&gt;

&lt;h6&gt;
  
  
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TRkmOBhv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2740/1%2AIMSGWBM1Lk5rEXUYV3ti9A.png" alt="**Fig 8. Revisando el estado de nuestros cambios.**" width="800" height="371"&gt;&lt;strong&gt;&lt;em&gt;Fig 8. Revisando el estado de nuestros cambios.&lt;/em&gt;&lt;/strong&gt;
&lt;/h6&gt;

&lt;blockquote&gt;
&lt;p&gt;El comando anterior nos mostrara la información siguiente.&lt;br&gt;
&lt;strong&gt;Rama en la que nos encontramos:&lt;/strong&gt; Git promueve el uso de ramas, y en este punto nos indica en qué rama estamos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cambios que serán publicados:&lt;/strong&gt; Los archivos que hemos modificado y serán enviados.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cambios que no serán publicados:&lt;/strong&gt; Si hemos hecho cambios a en un archivo pero no serán enviados.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Archivos a los que no se les esta haciendo seguimiento (untracked):&lt;/strong&gt; Son los archivos que se encuentran presentes en el directorio, pero que aun no han sido añadidos a git para hacerles seguimiento. Inicialmente todos los archivos se encuentran de esta manera.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Paso 8:&lt;/strong&gt; Procederemos a agregar nuestros cambios los cuales pasaran al apartado de los cambios que podrán ser enviados, , vasta con que ejecutemos el siguiente comando.&lt;/p&gt;

&lt;h6&gt;
  
  
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aBY0_lw6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2720/1%2AJp0QteC260h0efFxS1GFAA.png" alt="**Fig 9. Preparando cambios que serán enviados.**" width="800" height="448"&gt;&lt;strong&gt;&lt;em&gt;Fig 9. Preparando cambios que serán enviados.&lt;/em&gt;&lt;/strong&gt;
&lt;/h6&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔖Nota:&lt;/strong&gt; git add tiene variantes como &lt;br&gt;
&lt;strong&gt;git add . o git add -A&lt;/strong&gt; : Prepara todos los archivos que serán enviados.&lt;br&gt;
&lt;strong&gt;git add ./[nombre]&lt;/strong&gt;: Prepara solo el archivo que se le indique.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Paso 9:&lt;/strong&gt; Mandaremos los cambios realizados a nuestro repositorio, vasta con que ejecutemos el siguiente comando.&lt;/p&gt;

&lt;h6&gt;
  
  
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nSi0J04M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2720/1%2AHq1RA19LG1XXtJ7f1y2Enw.png" alt="**Fig 10. Creando el primer commit.**" width="800" height="152"&gt;&lt;strong&gt;&lt;em&gt;Fig 10. Creando el primer commit.&lt;/em&gt;&lt;/strong&gt;
&lt;/h6&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔖 Nota:&lt;/strong&gt; el comando commit tiene un parámetro(&lt;strong&gt;-m&lt;/strong&gt;) el cual indica que el mensaje que acompañara a los archivos enviados. Si se necesitara que un archivo no se encuentre en la área de espera se puede utilizar el comando &lt;strong&gt;git reset HEAD nombre_del_archivo&lt;/strong&gt; de esta manera el archivo cambiara de posición.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Paso 10:&lt;/strong&gt; Para poder dar seguimiento a los cambios que han sido enviados, vasta con que ejecutemos el siguiente comando.&lt;/p&gt;

&lt;h6&gt;
  
  
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LuIUbxml--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2720/1%2A7XMpOs3qtTraA8N_ASSKMQ.png" alt="**Fig 11.Mostrando el listado de logs .**" width="800" height="201"&gt;&lt;strong&gt;&lt;em&gt;Fig 11.Mostrando el listado de logs .&lt;/em&gt;&lt;/strong&gt;
&lt;/h6&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔖 Nota:&lt;/strong&gt; Este comando muestra información básica correspondiente al commit enviado.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Hasta este punto contamos con nuestro &lt;strong&gt;primer commit&lt;/strong&gt; en nuestro repositorio local.&lt;/p&gt;

&lt;h2&gt;
  
  
  🌳 Manejo de Ramas
&lt;/h2&gt;

&lt;p&gt;El uso de ramas es sencillo y poderoso en git, los comando que podemos utilizar son:&lt;/p&gt;

&lt;h6&gt;
  
  
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Vk6cC_5q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2720/1%2Ak-B3TOUmpO8iOxm2n8o_0w.png" alt="**Fig 12.Listando ramas .**" width="800" height="102"&gt;&lt;strong&gt;&lt;em&gt;Fig 12.Listando ramas .&lt;/em&gt;&lt;/strong&gt;
&lt;/h6&gt;

&lt;h6&gt;
  
  
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A1l6D9NY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2720/1%2AHZpNXi0SDECqunLldLZZAg.png" alt="**Fig 13. Creando una rama.**" width="800" height="102"&gt;&lt;strong&gt;&lt;em&gt;Fig 13. Creando una rama.&lt;/em&gt;&lt;/strong&gt;
&lt;/h6&gt;

&lt;h3&gt;
  
  
  🔄 Combinar ramas
&lt;/h3&gt;

&lt;p&gt;Para combinar una rama con otra, debemos primero pasarnos a la rama destino, y luego ejecutar el comando merge:&lt;/p&gt;

&lt;h6&gt;
  
  
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AU8OYEzh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2720/1%2AyMnkIn6LR7ah-07svTmoBg.png" alt="**Fig 14. Mezclando ramas.**" width="800" height="102"&gt;&lt;strong&gt;&lt;em&gt;Fig 14. Mezclando ramas.&lt;/em&gt;&lt;/strong&gt;
&lt;/h6&gt;

&lt;h3&gt;
  
  
  ☠️ Eliminar una rama
&lt;/h3&gt;

&lt;p&gt;Para eliminar una rama, existen dos métodos:&lt;/p&gt;

&lt;h6&gt;
  
  
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zbFBypWx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2720/1%2Ak0x2EMeBhojzWUF9YFBzqw.png" alt="**Fig 15. Borrando ramas de forma segura.**" width="800" height="102"&gt;&lt;strong&gt;&lt;em&gt;Fig 15. Borrando ramas de forma segura.&lt;/em&gt;&lt;/strong&gt;
&lt;/h6&gt;

&lt;h6&gt;
  
  
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--f4falvhQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2720/1%2AKU7tiC1zeTNKGbrXrAiqrA.png" alt="**Fig 16. Borrando ramas.**" width="800" height="102"&gt;&lt;strong&gt;&lt;em&gt;Fig 16. Borrando ramas.&lt;/em&gt;&lt;/strong&gt;
&lt;/h6&gt;

&lt;p&gt;Hasta este punto tenemos los conceptos básicos del manejo de &lt;strong&gt;Git&lt;/strong&gt; y conocemos ls diferencias que tiene con &lt;strong&gt;GitHub&lt;/strong&gt; ademas conocemos los diferentes tipos de &lt;strong&gt;VSC&lt;/strong&gt; que existieron antes de llegar al control de versiones que conocemos hoy en día, en la segunda parte de este post veremos.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Como clono un repositorio existente.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Como se trabaja con múltiples usuarios.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Como subo mi repositorio a &lt;strong&gt;&lt;em&gt;GitHub.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Espero les guste la entrada y recuerda dejar tus comentarios o de ser posible manda un email a jorge.mendez.ortega@gmail, no olvides dejar tus comentarios.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Recomendaciones para el manejo de ramas</title>
      <dc:creator>Jorge Méndez Ortega</dc:creator>
      <pubDate>Tue, 12 Nov 2019 21:14:09 +0000</pubDate>
      <link>https://dev.to/jmz12/recomendaciones-para-el-manejo-de-ramas-3hmi</link>
      <guid>https://dev.to/jmz12/recomendaciones-para-el-manejo-de-ramas-3hmi</guid>
      <description>&lt;p&gt;Durante el desarrollo de un proyecto es muy común que el equipo tenga la necesidad de crear branches/ramas para poder trabajar de manera aislada todos los cambios, correcciones y nuevas características del proyecto a realizar esto para no afectar el flujo de trabajo de terceros, esto evitará mezclar código de distintas líneas de desarrollo. Por lo que como se comenta en el post anterior llamado &lt;strong&gt;&lt;a href="https://dev.to/konami12/recomendaciones-para-generar-un-buen-commit-544i"&gt;Recomendaciones para generar un buen commit&lt;/a&gt;&lt;/strong&gt;, para el manejo de branches también es recomendable contar con una guía de buenas prácticas.&lt;/p&gt;

&lt;h3&gt;
  
  
  🚨Recordatorio
&lt;/h3&gt;

&lt;p&gt;Siempre que un &lt;code&gt;branch&lt;/code&gt; ya sea utilizado es necesario borrarla del repositorio esto es con la finalidad de contar con un repositorio limpia y evitar tener muchos &lt;code&gt;branches&lt;/code&gt; que no sean útiles.&lt;/p&gt;

&lt;h3&gt;
  
  
  🏗 Estructura
&lt;/h3&gt;

&lt;p&gt;El nombre de una &lt;code&gt;rama&lt;/code&gt; se estructura de 2 partes diferentes el &lt;code&gt;tipo&lt;/code&gt; y &lt;code&gt;nombre&lt;/code&gt; estas partes son divididas usando / como se muestra en nuestra en el ejemplo siguiente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kA99sUH9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2720/1%2A8qn1iKK7kzYcEmhGg-6Aug.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kA99sUH9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2720/1%2A8qn1iKK7kzYcEmhGg-6Aug.png" alt="Ejemplo estructura de una rama (**Fig-01**)." width="800" height="141"&gt;&lt;/a&gt;&lt;em&gt;Ejemplo estructura de una rama (&lt;/em&gt;&lt;em&gt;Fig-01&lt;/em&gt;*).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nota:&lt;/strong&gt; Los nombres de las ramas tienen que ser escritos en &lt;strong&gt;lowerCamelCase&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  🔖 Type/Tipo
&lt;/h3&gt;

&lt;p&gt;El tipo es la primer parte de la estructura del &lt;code&gt;branch&lt;/code&gt; y este puede ser ser de los siguientes tipos.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;add:&lt;/strong&gt; Se generan una nuevas funcionalidades.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;fix:&lt;/strong&gt; Se realizan correción de Bugs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;refactor:&lt;/strong&gt; Refactorización de funcionalidades y mejoras.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;delete:&lt;/strong&gt; Se eliminan funciones o archivos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;docs:&lt;/strong&gt; Se generar cambios en la documentación.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;hotfix:&lt;/strong&gt; Esta tipo se utiliza cuando se quiere hacer un contrato con el diablo jaja, practicamente es cuando queremos meter cambios directamente a la rama de producción.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;como podemos ver los tipos son similares a los que manejamos en los &lt;strong&gt;&lt;a href="https://medium.com/@jmz12/buenas-pr%C3%A1cticas-para-commits-5eb4c86b9a47"&gt;commits&lt;/a&gt;&lt;/strong&gt; la pequeña diferencia es que estos tiene que ser escritos en minúsculas.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔖 Nota:&lt;/strong&gt; los tipos que se recomiendan en este caso pueden varias dependiendo del proyecto.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  🗂 Name/Nombre
&lt;/h3&gt;

&lt;p&gt;El nombre es la segunda parte de la estructura del &lt;code&gt;branch&lt;/code&gt; y este tiene que ser subjetivo y el nombre de una rama no tiene que ser mayor a &lt;code&gt;30 caracteres&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;🔖 Ejemplo&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Tomando en cuentas las reglas anteriores podemos ver que nuestra rama la estructura de nuestro &lt;code&gt;branch&lt;/code&gt; quedaría de la manera siguiente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--O7SWE3pI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2720/1%2A6ij4N939mZyCOPhMG8thuA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--O7SWE3pI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2720/1%2A6ij4N939mZyCOPhMG8thuA.png" alt="Estructura final del branch(**Fig-02**)." width="800" height="247"&gt;&lt;/a&gt;&lt;em&gt;Estructura final del branch(&lt;/em&gt;&lt;em&gt;Fig-02&lt;/em&gt;&lt;em&gt;).&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  💻 Generando ramas
&lt;/h3&gt;

&lt;p&gt;Para poder generar una rama se recomienda siempre se tiene que tomar como base el &lt;code&gt;branch&lt;/code&gt; en el cual se tienen que generar los cambios por ejemplo podríamos tomar como base la rama **master **y así nuestra nuevo **branch **contará con los últimos cambios, para crear el nuevo &lt;code&gt;branch&lt;/code&gt; se utilizarán los comandos siguientes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xO1xC2RR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://miro.medium.com/max/2720/1%2AucD2B--INktIXwkp6q8J7g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xO1xC2RR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://miro.medium.com/max/2720/1%2AucD2B--INktIXwkp6q8J7g.png" alt="Comandos para crear nuestra nueva rama (**Fig-03**)." width="800" height="512"&gt;&lt;/a&gt;&lt;em&gt;Comandos para crear nuestra nueva rama (&lt;/em&gt;&lt;em&gt;Fig-03&lt;/em&gt;&lt;em&gt;).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;usando los comandos anteriores verificamos que el &lt;code&gt;branch&lt;/code&gt; cuente con los últimos cambios, mientras se generan los cambios se recomienda actualizar constantemente el &lt;code&gt;branch&lt;/code&gt;esto para estar al día con los cambios para esta tarea podemos utilizar el siguiente comando.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4ptIR9Rp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2720/1%2AFmPqgvNa5ja0jp8q93DceQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4ptIR9Rp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2720/1%2AFmPqgvNa5ja0jp8q93DceQ.png" alt="Comando para actualizar el branch (**Fig-04**)" width="800" height="141"&gt;&lt;/a&gt;&lt;em&gt;Comando para actualizar el branch (&lt;/em&gt;&lt;em&gt;Fig-04&lt;/em&gt;&lt;em&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Asi siempre nuestra rama contará con los últimos cambios que tenga &lt;code&gt;master&lt;/code&gt; y también reducirá el riesgo de tener conflictos al momento de mandar los cambios que se realicen.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🔖&lt;strong&gt;Nota:&lt;/strong&gt; Al generar una nueva rama se recomienda no mezclarla con otros desarrollos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  🗞Extras
&lt;/h3&gt;

&lt;p&gt;Cuando generamos un nuevo repositorio es recomendable contar con ciertas ramas creadas por defecto las cuales pueden ser.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Develop :&lt;/strong&gt; Esta rama es utilizada por el equipo de desarrollo principalmente para probar todos los nuevos desarrollos o refactors grandes, prácticamente es nuestro parque de diversiones.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Staging :&lt;/strong&gt; Esta rama es utilizada para que el equipo encargado de realizar el &lt;code&gt;QA&lt;/code&gt;se encargue de generar todas las pruebas pertinentes que correspondan a nuevos desarrollos y correcciones, en ocasiones los cambios que pasan a esta rama pueden provenir de la rama &lt;code&gt;develop&lt;/code&gt; y esto puede pasar cuando el equipo de desarrollo terminó de realizar pruebas en el &lt;code&gt;branch&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;UAT :&lt;/strong&gt; También conocido como &lt;code&gt;User Acceptance Tests,&lt;/code&gt; en este punto el &lt;strong&gt;QA&lt;/strong&gt; realizado en &lt;strong&gt;Staging&lt;/strong&gt; a finalizado satisfactoriamente y los cambios están listo para que los usuarios finales puedan dar su &lt;code&gt;Vo Bo&lt;/code&gt; y dependiendo de su &lt;code&gt;Re-Test&lt;/code&gt; validar si los cambios pasan a la rama &lt;code&gt;master&lt;/code&gt;&lt;strong&gt;(producción)&lt;/strong&gt;, o se tiene que realizar alguna corrección.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Master :&lt;/strong&gt; Haste este punto todos los cambios y correcciones se encuentran listos para ser mandados a un ambiente de producción.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📓 Nota&lt;/strong&gt;: Es muy común que las ramas de que utilizamos en el repositorio del proyecto cuenten con integración continua, la rama &lt;code&gt;develop&lt;/code&gt; puede ser opcional esto depende del modo de trabajo de cada equipo.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  😺 Conclusión
&lt;/h2&gt;

&lt;p&gt;Contar con estándares y reglas dentro de nuestro equipo de trabajo al momento de manejar &lt;code&gt;branches&lt;/code&gt; es algo que nos puede evitar muchos dolores de cabeza, las recomendaciones mostradas anteriormente pueden ser modificadas ya que la intención es brindar una base para poder generar nuestras propias reglas.&lt;/p&gt;

</description>
      <category>github</category>
      <category>bestpractices</category>
      <category>git</category>
      <category>gitbranch</category>
    </item>
    <item>
      <title>Recomendaciones para generar un buen commit</title>
      <dc:creator>Jorge Méndez Ortega</dc:creator>
      <pubDate>Mon, 04 Nov 2019 06:18:34 +0000</pubDate>
      <link>https://dev.to/jmz12/recomendaciones-para-generar-un-buen-commit-544i</link>
      <guid>https://dev.to/jmz12/recomendaciones-para-generar-un-buen-commit-544i</guid>
      <description>&lt;p&gt;Durante el desarrollo de un proyecto es muy recomendable contar con una guía de buenas prácticas la cual nos facilite redactar &lt;strong&gt;&lt;em&gt;commits&lt;/em&gt;&lt;/strong&gt; que sean claros y puedan ayudar a cualquier miembro del equipo, esto para evitar que a medida que un proyecto se prolonga, los mensajes de los &lt;strong&gt;&lt;em&gt;commits&lt;/em&gt;&lt;/strong&gt; de mi &lt;strong&gt;&lt;em&gt;git&lt;/em&gt;&lt;/strong&gt; se vuelven cada vez menos informativos y podemos encontrar mensajes como &lt;em&gt;**ya funciona x parte&lt;/em&gt;* &lt;em&gt;los cuales en ocasiones no son ni descriptivos y peor aún en ocasiones ni el *&lt;/em&gt;&lt;em&gt;responsable&lt;/em&gt;** recuerda o sabe lo que generó😒.&lt;/p&gt;

&lt;p&gt;Por lo que para poder llevar de la mejor forma un proyecto es recomendable que todos los miembros del &lt;strong&gt;&lt;em&gt;equipo&lt;/em&gt;&lt;/strong&gt; adopten un estándar que les permite la redacción de &lt;strong&gt;&lt;em&gt;commits&lt;/em&gt;&lt;/strong&gt;, con base a mi experiencia comparto las siguientes recomendaciones.&lt;/p&gt;

&lt;h3&gt;
  
  
  🚧 Estructura
&lt;/h3&gt;

&lt;p&gt;El mensaje de un &lt;strong&gt;&lt;em&gt;commit&lt;/em&gt;&lt;/strong&gt; se divide en 3 partes diferentes el &lt;em&gt;**título&lt;/em&gt;&lt;em&gt;, **el cuerpo&lt;/em&gt;* y &lt;strong&gt;pie&lt;/strong&gt;* como se muestra en el siguiente ejemplo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1N5UbKvu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2A8zfZ8IPD88vt5oL5JVFahA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1N5UbKvu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2A8zfZ8IPD88vt5oL5JVFahA.png" alt="Ejemplo de estructura de un commit (**Fig-01**)." width="320" height="217"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como se puede apreciar en la imagen anterior el título se conforma de dos partes las cuales son el &lt;em&gt;tipo y del asunto&lt;/em&gt; del mensaje.&lt;/p&gt;

&lt;h3&gt;
  
  
  📓 Type/ Tipo
&lt;/h3&gt;

&lt;p&gt;El tipo es contenido en el título y puede ser de alguno de los siguientes casos:&lt;/p&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  *&lt;em&gt;➕ADD *&lt;/em&gt;: Se genera una nueva funcionalidad.
&lt;/h1&gt;
&lt;h1&gt;
  
  
  *&lt;em&gt;🛠 FIX *&lt;/em&gt;: Se soluciona un bug.
&lt;/h1&gt;
&lt;h1&gt;
  
  
  &lt;strong&gt;♻️ REFACTOR&lt;/strong&gt; : Refactorización y mejoras.
&lt;/h1&gt;
&lt;h1&gt;
  
  
  &lt;strong&gt;☠️ DELETE&lt;/strong&gt; : Se eliminan funciones o archivos.
&lt;/h1&gt;
&lt;h1&gt;
  
  
  &lt;strong&gt;📚 DOCS&lt;/strong&gt; : Se generar cambios en la documentación.
&lt;/h1&gt;
&lt;/blockquote&gt;

&lt;p&gt;Es importante notar que el &lt;strong&gt;&lt;em&gt;Type&lt;/em&gt;&lt;/strong&gt; se escribe en mayúsculas y se puede utilizar emoji el cual es opcional en mi caso los utilizo ya que me facilita de primera vista saber el tipo de &lt;strong&gt;&lt;em&gt;commit&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔖 Nota&lt;/strong&gt;: los tipos que se recomiendan en este caso pueden varias dependiendo del proyecto.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  ✉️ Subject/Asunto
&lt;/h3&gt;

&lt;p&gt;El asunto no debe contener más de &lt;strong&gt;&lt;em&gt;50 caracteres&lt;/em&gt;&lt;/strong&gt;, debe iniciar con una letra mayúscula y no terminar con un punto. Debemos ser &lt;em&gt;imperativos&lt;/em&gt; al momento de &lt;em&gt;redactar&lt;/em&gt; nuestro &lt;strong&gt;&lt;em&gt;commit&lt;/em&gt;&lt;/strong&gt;, es decir, hay que ser &lt;strong&gt;&lt;em&gt;objetivos&lt;/em&gt;&lt;/strong&gt; y muy importante tenemos que acostumbrarnos a escribirlos en Inglés esto es una de las mejores prácticas que podemos tener.&lt;/p&gt;

&lt;h3&gt;
  
  
  📝 Body/Cuerpo
&lt;/h3&gt;

&lt;p&gt;Se utiliza para explicar el &lt;strong&gt;&lt;em&gt;¿Qué?&lt;/em&gt;&lt;/strong&gt; y &lt;strong&gt;&lt;em&gt;¿Por qué?&lt;/em&gt;&lt;/strong&gt; del &lt;strong&gt;&lt;em&gt;commit&lt;/em&gt;&lt;/strong&gt; y no el &lt;strong&gt;&lt;em&gt;¿Cómo?&lt;/em&gt;&lt;/strong&gt;, Al escribir el cuerpo, requerimos de una línea en blanco entre el título y el cuerpo, además debemos limitar la longitud de cada línea a no más de &lt;strong&gt;&lt;em&gt;72 caracteres.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  👣 Footer/Pie
&lt;/h3&gt;

&lt;p&gt;Esta parte es muy importante ya que es donde se coloca el seguimiento de los &lt;em&gt;**issues *&lt;/em&gt;&lt;em&gt;o&lt;/em&gt;** tickets ***relacionados con los cambios generados.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❗️Ejemplo
&lt;/h3&gt;

&lt;p&gt;Tomando en cuenta las recomendaciones mencionadas la estructura de nuestro &lt;strong&gt;commit&lt;/strong&gt; se vería de la siguiente manera.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--i8butkz0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2Ar78c6kM2aYnaKz18yEUX5w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--i8butkz0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2Ar78c6kM2aYnaKz18yEUX5w.png" alt="Estructura final del commit (**Fig-02**)." width="700" height="199"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔖 Nota&lt;/strong&gt;: Para poder referencias un &lt;strong&gt;issue&lt;/strong&gt; en el &lt;strong&gt;commit&lt;/strong&gt; siempre se tiene que colocar &lt;strong&gt;#&lt;/strong&gt; seguida del número de issue.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  🤩Extra
&lt;/h3&gt;

&lt;p&gt;Se recomienda generar &lt;strong&gt;&lt;em&gt;commit&lt;/em&gt;&lt;/strong&gt; por cambio este puede tener de uno a varios archivos lo recomendable es no tener demasiados archivos relacionados en un solo &lt;strong&gt;&lt;em&gt;commit&lt;/em&gt;&lt;/strong&gt; esto facilita la visibilidad al momento de realizar el &lt;em&gt;**Code Review *&lt;/em&gt;&lt;em&gt;ya que se puede realizar revisión por *&lt;/em&gt;&lt;em&gt;commit.&lt;/em&gt;**&lt;/p&gt;

&lt;h3&gt;
  
  
  😺 Conclusión
&lt;/h3&gt;

&lt;p&gt;Contar con estándares y reglas dentro de nuestro equipo de trabajo al momento de redactar un &lt;em&gt;**commit&lt;/em&gt;* *es algo que nos puede evitar muchos dolores de cabeza al tratar de identificar o dar seguimiento a los cambios generados por el equipo, las recomendaciones mostradas anteriormente pueden ser modificadas ya que la intención es brindar una base para poder generar nuestras propias reglas.&lt;/p&gt;

</description>
      <category>github</category>
      <category>semanticcommits</category>
      <category>git</category>
    </item>
    <item>
      <title>Expresiones Regulares</title>
      <dc:creator>Jorge Méndez Ortega</dc:creator>
      <pubDate>Sun, 18 Aug 2019 18:33:42 +0000</pubDate>
      <link>https://dev.to/jmz12/expresiones-regulares-bd4</link>
      <guid>https://dev.to/jmz12/expresiones-regulares-bd4</guid>
      <description>&lt;p&gt;Como desarrollador es muy común trabajar con cadenas de texto, lo cual inicialmente puede parecer algo muy sencillo, pero conforme las cadenas se vuelven más complejas es inevitable ignorar el uso de las «&lt;strong&gt;evil regular expressions 😈&lt;/strong&gt;» (muahahaha). Esto ya no suena tan sencillo, ya que para este punto un problema se convierte en 2, además de resultar un poco frustrante.&lt;/p&gt;

&lt;p&gt;Tranquilo, antes de iniciar, tírate al suelo y repite después de mi:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zfss1XHQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AiOnm7Yw1d6RXj4nKodLMYA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zfss1XHQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AiOnm7Yw1d6RXj4nKodLMYA.png" alt="Tutorial de como llorar (**Fig-01**)" width="367" height="339"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  😿 Las expresiones regulares son buenas, no son el diablo…
&lt;/h3&gt;

&lt;h3&gt;
  
  
  🙀 Las expresiones regulares son buenas,no son el diablo…
&lt;/h3&gt;

&lt;h3&gt;
  
  
  😸 Las expresiones regulares son buenas, no son el diablo…
&lt;/h3&gt;

&lt;p&gt;Tranquilo, respira hondo y exhala… listo. El momento feo ya pasó, la pregunta que te puedes estar haciendo es:&lt;/p&gt;

&lt;p&gt;### ¿En verdad las «&lt;strong&gt;evil regular expressions 😈&lt;/strong&gt;» son buenas?&lt;/p&gt;

&lt;p&gt;A lo que te podría contestar, claro que son muy buenas &lt;strong&gt;😇&lt;/strong&gt; y poderosas, ya que con la combinación correcta de caracteres podemos realizar desde una búsqueda muy sencilla, hasta una muy compleja; en pocas palabras tenemos la &lt;strong&gt;navaja suiza&lt;/strong&gt; para el manejo de cadenas.&lt;/p&gt;

&lt;h2&gt;
  
  
  📚 Un poco de historia
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mGZ1wFmO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2A1hGSGEsR4NmyCa2H5TMYIA.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mGZ1wFmO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2A1hGSGEsR4NmyCa2H5TMYIA.jpeg" alt="Expresión regular en el antiguo Egipto (**Fig-02**)" width="551" height="290"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Antes de entrar en materia es bueno conocer un poco de historia sobre la primer aparición de &lt;strong&gt;expresiones regulares&lt;/strong&gt; en el campo de la computación las cuales surgen nada más y nada menos que dentro de un editor de líneas llamado &lt;a href="https://es.wikipedia.org/wiki/Ed_(Unix)"&gt;Ed&lt;/a&gt;&lt;em&gt;, creado por el ingeniero&lt;/em&gt; &lt;a href="https://es.wikipedia.org/wiki/Ken_Thompson"&gt;Ken Thompson&lt;/a&gt;&lt;em&gt;, quién entonces se encontraba trabajando en los laboratorios de &lt;a href="https://es.wikipedia.org/wiki/Bell_Labs"&gt;Bell Labs&lt;/a&gt;&lt;/em&gt; allá por 1969.&lt;/p&gt;

&lt;p&gt;Aquel editor de líneas apareció por primera vez como una utilidad para el sistema operativo de &lt;strong&gt;&lt;a href="https://es.wikipedia.org/wiki/Unix"&gt;UNIX&lt;/a&gt;&lt;/strong&gt; y era el encargado de suplir las labores para editar archivos. Similar a como se hace en la actualidad, la instrucción que había que escribir para que &lt;a href="https://es.wikipedia.org/wiki/Ed_(Unix)"&gt;Ed&lt;/a&gt;realizará una búsqueda de texto era algo parecido a.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dtbZr9tZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2Al2Vat6WBzDoYL0_o1M2JXw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dtbZr9tZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2Al2Vat6WBzDoYL0_o1M2JXw.png" alt="Comando para Ed (**Fig-03**)" width="640" height="120"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En el comando utilizado por &lt;a href="https://es.wikipedia.org/wiki/Ed_(Unix)"&gt;Ed&lt;/a&gt; se colocaba al inicio &lt;strong&gt;g(global)&lt;/strong&gt; y &lt;strong&gt;p(print)&lt;/strong&gt; al final, ambas letras son conocidas como modificadores y lo que queda en la parte central es la combinación de caracteres que conforman las expresión regular.&lt;/p&gt;

&lt;p&gt;En este punto surge algo muy interesante ya que la instrucción anterior da como resultado la frase &lt;strong&gt;“Global Regular Expression Print”&lt;/strong&gt; &lt;em&gt;cuya abreviatura conforma la palabra&lt;/em&gt; &lt;strong&gt;grep&lt;/strong&gt;, a partir de esta característica de &lt;a href="https://es.wikipedia.org/wiki/Ed_(Unix)"&gt;Ed&lt;/a&gt; nace el comando &lt;a href="https://es.wikipedia.org/wiki/Grep"&gt;grep&lt;/a&gt;(comando presente en todos los S.O basados en &lt;a href="https://es.wikipedia.org/wiki/Unix"&gt;UNIX&lt;/a&gt;) el cual nos permite realizar búsquedas a nivel del sistema de archivos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---GsOYDz_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2ApQjVdfJlPy53Osix-8NQqw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---GsOYDz_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2ApQjVdfJlPy53Osix-8NQqw.png" alt="Ejemplo de uso de grep (**Fig-04**)" width="467" height="316"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Actualmente muchos lenguajes de programación modernos cuentan con el soporte necesario para el uso de expresiones regulares aunque la sintaxis puede cambiar para cada lenguaje,&lt;/em&gt; en esencia podremos hacer soluciones similares para cada uno, con todo lo anterior iniciaremos con lo divertido todos los ejemplos mostrados serán escritos en &lt;em&gt;JS.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠️ Estructura
&lt;/h2&gt;

&lt;p&gt;Antes de iniciar a jugar con las **«*evil regular expressions *😈» **y descubrir que solo son incomprendidas iniciaremos conociendo la estructura básica.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yK1yLd0M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2ApKZNFYlfZblyWzqfhxQO5A.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yK1yLd0M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2ApKZNFYlfZblyWzqfhxQO5A.png" alt="Estructura base (**Fig-05**)" width="640" height="120"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como podemos ver las estructura es muy sencilla solo solicita 2 parámetros de momento no tomaremos en cuenta el parámetro de los modificadores ya que iniciaremos con ejemplos básicos y conforme avancemos subiremos el nivel de complejidad, como primer ejemplo realizaremos la búsqueda de caracteres.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AUlrpJfR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AQl7RfyXPm1AexYlFYvWFBQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AUlrpJfR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AQl7RfyXPm1AexYlFYvWFBQ.png" alt="Ejemplo búsqueda de caracteres (**Fig-06**)" width="800" height="79"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hasta este punto el primer ejemplo no es nada sorprendente ya que esto lo puede realizar cualquier buscador, si lo vemos un poco más a fondo podemos ver que la búsqueda está recibiendo un patrón el cual se traduce a una *expresión regular *en su expresión básica.&lt;/p&gt;

&lt;h2&gt;
  
  
  📗 Metacaracteres
&lt;/h2&gt;

&lt;p&gt;Los «&lt;strong&gt;metacaracteres&lt;/strong&gt;» o también conocidos como &lt;em&gt;clases&lt;/em&gt; son una alternativa para poder representar grupos enteros de caracteres que se encuentren relacionados entre sí de manera semántica, para poder utilizarlos es necesario el uso de &lt;em&gt;backslash&lt;/em&gt; seguido del nombre de la clase en minúsculas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JPlfsZ39--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2At_JyknU5WmVwl0dkGG3vBA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JPlfsZ39--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2At_JyknU5WmVwl0dkGG3vBA.png" alt="Sintaxis para el uso de metacaracteres (**Fig-07**)" width="640" height="120"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📓 Nota:&lt;/strong&gt; Cuando el nombre del metacaracter se escribe en mayúsculas se considera como una negación por lo que su comportamiento será diferente a lo habitual.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tomando en cuenta la sintaxis y la nota anterior podríamos iniciar con la evangelización de **«*evil regular expressions *😈» **para lo que iniciaremos utilizando las reglas siguientes.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡&lt;strong&gt;Recordatorio&lt;/strong&gt;: Todos los ejemplos utilizan el modificador &lt;strong&gt;“g”&lt;/strong&gt; el cual permite buscar de manera global coincidencias dentro de una cadena, está opción se utiliza con fines demostrativos ya que cada metacaracter solo tomara un solo carácter.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  🔖 metacaracter \w
&lt;/h3&gt;

&lt;p&gt;Realiza una búsqueda de &lt;strong&gt;caracteres alfanuméricos&lt;/strong&gt; es importante mencionar que también toma el &lt;strong&gt;underscore&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rmQgj-1U--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AME2ltRve03PIEAtwIFI15Q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rmQgj-1U--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AME2ltRve03PIEAtwIFI15Q.png" alt="Ejemplo del uso del metacaracter** \w** (**Fig-08**)" width="469" height="303"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;La clase &lt;strong&gt;«\w»&lt;/strong&gt; cuenta con su equivalente ya consigue el mismo resultado.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XhGiS3rN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AGMebN3nkpAIsPVtEJOL5Gw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XhGiS3rN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AGMebN3nkpAIsPVtEJOL5Gw.png" alt="Expresión equivalente al metacaracter **\w** (**Fig-09**)" width="471" height="303"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;El metacaracter &lt;strong&gt;«\w»&lt;/strong&gt; cuenta con su variante de negación que es &lt;strong&gt;«\W»&lt;/strong&gt; la cual permite buscar todo aquello que sea diferente a &lt;em&gt;caracteres alfanuméricos&lt;/em&gt; y al &lt;strong&gt;underscore&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Uc-AlxAS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2Ay2H6SQBOLDpdd66a-CEIGg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Uc-AlxAS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2Ay2H6SQBOLDpdd66a-CEIGg.png" alt="Ejemplo de negación de usando el metacaracter **\W **(**Fig-10**)" width="471" height="302"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🔖 metacaracter \d
&lt;/h3&gt;

&lt;p&gt;Permite realizar la búsqueda exclusiva de caracteres numéricos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Sai5qgia--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2A9hxpxL2GYOGCBg65gpCLuw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Sai5qgia--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2A9hxpxL2GYOGCBg65gpCLuw.png" alt="Ejemplo del uso del metacaracter** \d** (**Fig-11**)" width="471" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;El metacaracter &lt;strong&gt;«\d»&lt;/strong&gt; también cuenta con su equivalente ya que consigue el mismo resultado.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nAabA93A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AAb4_MJquSyShVVg3BU9BHA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nAabA93A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AAb4_MJquSyShVVg3BU9BHA.png" alt="Expresión regular equivalente al metacaracter **\d **(**Fig-12**)" width="469" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;El metacaracter &lt;strong&gt;«\d»&lt;/strong&gt; también cuenta con su variante de negación que es &lt;strong&gt;«\D»&lt;/strong&gt; la cual permite buscar todo aquello que sea diferente a caracteres* numéricos.*&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aDloThWQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AlnE33j7I-zjfcWW6H8gUcA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aDloThWQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AlnE33j7I-zjfcWW6H8gUcA.png" alt="Ejemplo de negación usando el metacaracter **\D **(**Fig-13**)" width="471" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🔖 metacaracter \s
&lt;/h3&gt;

&lt;p&gt;Permite realizar la búsqueda de los &lt;strong&gt;espacios en blanco&lt;/strong&gt; que existen dentro de una cadena.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VyD85KPG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2A1qBo2mJAaK9xGAVqFywQ-g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VyD85KPG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2A1qBo2mJAaK9xGAVqFywQ-g.png" alt="Ejemplo del uso del metacaracter** \s** (**Fig-14**)" width="469" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;El metacaracter &lt;strong&gt;«\s»&lt;/strong&gt; también cuenta con su variante de negación que es &lt;strong&gt;«\S»&lt;/strong&gt; la cual permite buscar todo aquello que sea diferente a espacios en blanco&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uZCZ_AjM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AWGgJCfytG4Hm9h9Sat7hvQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uZCZ_AjM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AWGgJCfytG4Hm9h9Sat7hvQ.png" alt="Ejemplo de negación usando el metacaracter **\S **(**Fig-15**)" width="471" height="302"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🔖 metacaracter .
&lt;/h3&gt;

&lt;p&gt;Este es uno de los más especiales ya que podemos hacerlo coincidir con cualquier carácter que se nos ocurra, con excepción de un salto de línea.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ayoAJTG_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AajuPFnnZDgro1l17Xc6FHw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ayoAJTG_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AajuPFnnZDgro1l17Xc6FHw.png" alt="Ejemplo del uso del metacaracter** . **(**Fig-16**)" width="469" height="303"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Muy interesante las &lt;strong&gt;«_evil regular expressions 😈»&lt;/strong&gt;ya no parecen tan maléficas (mmm muy interesante creo que me estoy enamorando 😍). Hasta este punto podemos decir que estamos en el camino del &lt;strong&gt;«Dios Digital»&lt;/strong&gt;por lo que procederemos a realizar nuestra primera plegaria(ejemplo).&lt;/p&gt;

&lt;h3&gt;
  
  
  🤩 Extra
&lt;/h3&gt;

&lt;p&gt;para el caso de &lt;strong&gt;«\d y \w»&lt;/strong&gt; cuentan con patrones equivalentes estos patrones cuentan con una similitud muy curiosa la cual es el uso de &lt;strong&gt;«[]»(mmm muy interesante)&lt;/strong&gt; los cuales facilitan una gama de posibilidades.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Rango de dígitos [0–9]&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Rango de letras [a-zA-Z]&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Listado de caracteres [\&lt;/em&gt;-]&lt;/strong&gt;*&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Vg4DyOpp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2Ay5NeoVrXlhwhMCwrxlrDIQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Vg4DyOpp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2Ay5NeoVrXlhwhMCwrxlrDIQ.png" alt="Ejemplo usando **[] **(**Fig-18**)" width="418" height="214"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como podemos ver en el ejemplo se utilizan caracteres especiales los cuales se escapan utilizando el siempre confiable &lt;strong&gt;backslash&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  📕 Ejemplo
&lt;/h3&gt;

&lt;p&gt;Para este ejemplo realizaremos una combinación de los metacaracteres que ya explicamos con anterioridad, el reto es realizar una búsqueda de un número telefónico dentro de un párrafo, el numero a buscar es &lt;strong&gt;&lt;em&gt;«(55–30–80 77–82)»&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;seria muy interesante que intentaras dar tu propia solución&lt;/em&gt; para lo cual te recomiendo el sitio siguiente &lt;a href="https://regexr.com/"&gt;RegEx&lt;/a&gt;&lt;a href="https://regexr.com"&gt;.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zLv-ZH7p--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AuZncW0LZ75D3qpNcQk9JUw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zLv-ZH7p--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AuZncW0LZ75D3qpNcQk9JUw.png" alt="[Ejemplo usando metacaracteres combinados para buscar el teléfono (55–30–80 77–82) (**Fig-17**)](https://regexr.com/40tps)" width="586" height="412"&gt;&lt;/a&gt;&lt;em&gt;]&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📓&lt;strong&gt;Nota&lt;/strong&gt; : Si quieres realizar cambios sobre la solución propuesta puedes hacerlo en el siguiente link &lt;a href="https://regexr.com/40tps"&gt;plegaria&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Como se muestra en el ejemplo anterior se utiliza el uso combinado de metacaracteres para dar forma a la primera plegaria realizada hacia el &lt;strong&gt;«Dios Digital»&lt;/strong&gt;🙌 (la solución puede variar dependiendo de la locura del lector).&lt;/p&gt;

&lt;h2&gt;
  
  
  📗 Contadores
&lt;/h2&gt;

&lt;p&gt;Los &lt;strong&gt;&lt;em&gt;«contadores»&lt;/em&gt;&lt;/strong&gt; o también conocidos como *cuantificadores *permiten especificar el número de apariciones que puede tener un carácter o patrón dentro de una expresión regular, la sintaxis a utilizar es.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wPqI3TQA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AoXndO_VdXvWKsBrbuOfhhw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wPqI3TQA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AoXndO_VdXvWKsBrbuOfhhw.png" alt="Sintaxis para el uso de metacaracteres y cuantificadores(**Fig-19**)" width="637" height="91"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tomando en cuenta la sintaxis mostrada podemos ver de primera vista que se utiliza una combinación entre &lt;strong&gt;&lt;em&gt;metacaracteres&lt;/em&gt;&lt;/strong&gt; y &lt;strong&gt;&lt;em&gt;un contador&lt;/em&gt;&lt;/strong&gt;, hasta este punto solo nos importa lo que está entre “&lt;strong&gt;{}&lt;/strong&gt;“.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;Cota Inferior&lt;/strong&gt;: Permite indicar el número mínimo de apariciones de un carácter o patrón.
&lt;/h2&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;Cota Superior&lt;/strong&gt;: Permite indicar el número máximo de apariciones de un carácter o patrón, esta cota trabaja en conjunto con la cota superior lo cual se convierte en un rango de posibles apariciones.
&lt;/h2&gt;
&lt;/blockquote&gt;

&lt;p&gt;Con lo anterior establecido podemos seguir por el camino de la salvación y seguir en con la evangelización de &lt;strong&gt;«evil regular expressions 😈»&lt;/strong&gt;, &lt;em&gt;para entender el uso de contadores es necesario comprender las siguientes reglas&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔖 Contador {x}
&lt;/h3&gt;

&lt;p&gt;Este opción es la forma más básica ya que solo se utiliza la *cota inferior *esta variante es muy válida en algunos lenguajes de programación y en otros casos no ya que es obligatorio colocar las dos cotas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KpFCw6IZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2Aixv9LJlqIaXc9-7ZiN5-Vw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KpFCw6IZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2Aixv9LJlqIaXc9-7ZiN5-Vw.png" alt="Ejemplo usando la cota inferior(**{x}**) para indicar que busque dos dígitos(**Fig-20**)" width="521" height="232"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📓 Nota:&lt;/strong&gt; Las dos opciones son válidas pero como somos muy buenos programadores siempre utilizaremos la opción de la derecha 😇 y esto es por que por buenas prácticas siempre es necesario declarar la &lt;strong&gt;«&lt;/strong&gt;cota superior*&lt;em&gt;»&lt;/em&gt;*.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  🔖 Contador {x,}
&lt;/h3&gt;

&lt;p&gt;Esta opción permite indicar un rango infinito de incidencias las cuales iniciarán desde el número que se indique en la &lt;em&gt;cota inferior.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fDyZMI0C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2A6BH2Uf8uzqAt-qzGSLSUDg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fDyZMI0C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2A6BH2Uf8uzqAt-qzGSLSUDg.png" alt="Ejemplo usando la cota superior con , (**Fig-21**)" width="346" height="210"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como se muestra en el ejemplo anterior al utilizar la sintaxis &lt;strong&gt;«{x,}»&lt;/strong&gt; no le importa las incidencias que aparezcan después de cumplir la condición de la &lt;em&gt;cota inferior&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔖 Contador {x ,y}
&lt;/h3&gt;

&lt;p&gt;Esta opción utiliza la &lt;em&gt;cota inferior(x)&lt;/em&gt; como la &lt;em&gt;cota superior(y)&lt;/em&gt; esto permite indicar un rango de apariciones de un carácter o patrón cual se puede traducir como &lt;strong&gt;&lt;em&gt;«entre “x” y “y” veces»&lt;/em&gt;&lt;/strong&gt; esta notación es la más común que se maneja la comunidad.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ssTwPjQU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2ALOLQAz3qaCbGeAFRm6e0YQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ssTwPjQU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2ALOLQAz3qaCbGeAFRm6e0YQ.png" alt="Ejemplo Usando las dos cotas (**Fig-22**)" width="346" height="285"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;como se muestra en el ejemplo anterior podemos se utilizan las 2 cotas las cuales permiten establecer el rango de posibles apariciones de un carácter o patrón, si esto lo comparamos con la variante anterior se puede ver que en este caso si se cuenta con una limitante.&lt;/p&gt;

&lt;h3&gt;
  
  
  🤩 Extra
&lt;/h3&gt;

&lt;p&gt;Dentro de los contadores también existen caracteres que facilitan el conteo de las incidencias estos también se conocen como &lt;strong&gt;&lt;em&gt;delimitadores&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h2&gt;
  
  
  Delimitador: secuencia de uno o más caracteres utilizados para especificar el límite entre regiones independientes e independientes en texto sin formato u otras secuencias de datos.
&lt;/h2&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;? : Puede estar o no estar&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ypZKjfRG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2Akds_uNGg7b-ZYYeTU-EyPQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ypZKjfRG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2Akds_uNGg7b-ZYYeTU-EyPQ.png" alt="Ejemplo utilizando **?, **como se puede ver se cumplen la regla propuesta** **(**Fig-23**)" width="538" height="179"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;+ : Puede estar una vez o muchas veces&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6_5RkNFz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AUn04r6nHu4feDdl4otuBHA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6_5RkNFz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AUn04r6nHu4feDdl4otuBHA.png" alt="Ejemplo utilizando **+, **como se puede ver se cumplen la regla propuesta** **(**Fig-24**)" width="352" height="203"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;**** : Puede no estar o estar muchas veces***&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NDgSjTvI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AZtZE0XTL3tPrRHDnHmir2Q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NDgSjTvI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AZtZE0XTL3tPrRHDnHmir2Q.png" alt="Ejemplo utilizando ***, **como se puede ver se cumplen la regla propuesta** **(**Fig-25**)" width="353" height="199"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;(): Conocido como paréntesis de captura, permite recordar una expresión regular, la funcionalidad es muy parecida a los [] solo que en este caso el rango se sustituye por una expresión regular.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AaWBuTQw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AkWO9NUeVgXo6gxQuU6OwGg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AaWBuTQw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AkWO9NUeVgXo6gxQuU6OwGg.png" alt="Ejemplo utilizando **(), **como se puede ver se cumplen la regla propuesta** **(**Fig-25**)" width="334" height="238"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  📕 Ejemplo
&lt;/h3&gt;

&lt;p&gt;Para este ejemplo realizaremos la misma práctica que se realizó en el apartado de &lt;strong&gt;&lt;em&gt;«metacaracteres»&lt;/em&gt;&lt;/strong&gt; pero en este caso utilizaremos &lt;strong&gt;&lt;em&gt;«contadores»&lt;/em&gt;&lt;/strong&gt;,&lt;br&gt;
como recordamos el ejemplo anterior consiste en la búsqueda de un número telefónico«&lt;strong&gt;(55–30–80 77–82)&lt;/strong&gt;», &lt;strong&gt;&lt;em&gt;seria muy interesante&lt;/em&gt;&lt;/strong&gt; ***que intentaras dar tu propia solución para lo cual te recomiendo el sitio siguiente &lt;a href="https://regexr.com/"&gt;RegEx&lt;/a&gt;&lt;a href="https://regexr.com"&gt;.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CXEEGSKr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2360/1%2AFegXBdCu7MIw7Hn6A95Lww.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CXEEGSKr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2360/1%2AFegXBdCu7MIw7Hn6A95Lww.png" alt="E[jemplo usando metacaracteres y contadores combinados para buscar el teléfono (55–30–80 77–82) (**Fig-26**)](https://regexr.com/419am)" width="800" height="559"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📓&lt;strong&gt;Nota&lt;/strong&gt; : Si quieres realizar cambios sobre la solución propuesta puedes hacerlo en el siguiente link &lt;a href="https://regexr.com/419am"&gt;plegaria&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Como se muestra en el ejemplo anterior ya estamos aplicando los evangelios aprendidos, lo cual nos permitirá crear una plegaria mas potente la cual satisfacerá al &lt;strong&gt;«Dios Digital»&lt;/strong&gt;🙌 (la solución puede variar dependiendo de la locura del lector).&lt;/p&gt;

&lt;h2&gt;
  
  
  📗 Modificadores
&lt;/h2&gt;

&lt;p&gt;Con anterioridad los mencionamos y utilizamos en algunos de los ejemplos mostrados, los modificadores nos permiten redefinir los términos de búsqueda de una expresión ya que en ocasiones las búsquedas son sensibles a mayúsculas, terminan al encontrar la primera coincidencia etc, por lo que para poder modificar este comportamiento podemos utilizar la sintaxis.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yK1yLd0M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2ApKZNFYlfZblyWzqfhxQO5A.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yK1yLd0M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2ApKZNFYlfZblyWzqfhxQO5A.png" alt="Estructura base (**Fig-27**)" width="640" height="120"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lo se es la misma imagen del inicio pero hasta este punto hace sentido ya que estamos respetando la sintaxis que se necesita para utilizar los modificadores junto con nuestra expresión regular.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📓 &lt;strong&gt;Nota&lt;/strong&gt; : Los modificadores son opcionales, ademas de que son acomulables esto quiere decir que podemos utilizar más de uno al mismo tiempo.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  🔖 Modificador i
&lt;/h3&gt;

&lt;p&gt;Este modificador se conoce como &lt;strong&gt;&lt;em&gt;«Búsqueda insensible a mayúsculas»,&lt;/em&gt;&lt;/strong&gt; este realiza una búsqueda sin importar el uso de mayúsculas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MSc3pa2A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2A5_CQZzNR5Wshh6r4Jvyuxw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MSc3pa2A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2A5_CQZzNR5Wshh6r4Jvyuxw.png" alt="Ejemplo utilizando el modificador **i **(**Fig-28**)" width="470" height="187"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como se muestra en ejemplo cuando se utiliza el &lt;em&gt;modificador i&lt;/em&gt; la selección inicia tomando la letra mayúsculas, en caso contrario iniciará la búsqueda desde las letras minúsculas.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔖 Modificador g
&lt;/h3&gt;

&lt;p&gt;Es modificador se conoce como &lt;strong&gt;«Búsqueda global»&lt;/strong&gt; (utilizado en los ejemplos), este realiza una búsqueda el mayor número de coincidencias no se detiene en el primer resultado que encuentra.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_aCDFX7d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2232/1%2A-scstAWr8oC_3v_ORE--5A.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_aCDFX7d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2232/1%2A-scstAWr8oC_3v_ORE--5A.png" alt="Ejemplo utilizando el modificador **g** (**Fig-29**)" width="800" height="229"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como se muestra en el ejemplo al utilizar el &lt;strong&gt;modificador g&lt;/strong&gt; la búsqueda se realiza en todo el texto del párrafo en el caso de no colocar el modificador la búsqueda se queda en la primera incidencia que encuentra.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔖 Modificador m
&lt;/h3&gt;

&lt;p&gt;Es modificador se conoce como &lt;strong&gt;&lt;em&gt;«Búsqueda multilínea»,&lt;/em&gt;&lt;/strong&gt; este realiza una búsqueda de manera individual en cada renglón de un texto, este modificador trabaja en conjunto con los metacaracteres&lt;/p&gt;

&lt;blockquote&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;^&lt;/strong&gt;: Se utiliza para indicar el inicio de una línea.
&lt;/h2&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;$&lt;/strong&gt;: Se utiliza para indicar el final de una línea
&lt;/h2&gt;
&lt;/blockquote&gt;

&lt;p&gt;Dichos caracteres permiten indicar la posición de la línea donde debe hacerse la búsqueda otra de las ventajas es que permite realizar el match de líneas completas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8XJdSjl9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AJ44f7wHVADL4rF4k6HDkGg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8XJdSjl9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AJ44f7wHVADL4rF4k6HDkGg.png" alt="Ejemplo utilizando el modificador **m **(**Fig-30**)" width="580" height="299"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como se muestra en el ejemplo al utilizar el* modificador m *la búsqueda se realiza línea por línea por lo que solo tomo como resultado la incidencia que cumple con la petición a buscar.&lt;/p&gt;

&lt;h3&gt;
  
  
  🤩 Extra
&lt;/h3&gt;

&lt;p&gt;En el caso de modificador multilínea se utilizaron los &lt;em&gt;metacaracteres ^,$&lt;/em&gt; de los cuales el carácter ^ cuenta con una variante la cual sirve para realizar una negación la sintaxis es la siguiente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--p3cbgid3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AOyIWqBMAdyoTlymeMUJhug.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--p3cbgid3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AOyIWqBMAdyoTlymeMUJhug.png" alt="Sintaxis de negación usando **^ **(**Fig-31**)" width="640" height="120"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como se muestra en el ejemplo para poder utilizar la negación es necesario utilizar &lt;strong&gt;«[]»&lt;/strong&gt; en los cuales se indica los caracteres a negar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--N-8YsGI5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2A_IIa2Ya7_y0sbeZHipzI2w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--N-8YsGI5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2A_IIa2Ya7_y0sbeZHipzI2w.png" alt="Ejemplo de negación utilizando **^ **(**Fig-33**)" width="800" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como se muestra en el ejemplo anterior al momento de que su utiliza ^ dentro de los corchetes automáticamente ignora las letras y toma los valores restantes.&lt;/p&gt;

&lt;h3&gt;
  
  
  📕 Ejemplo
&lt;/h3&gt;

&lt;p&gt;Para este ejemplo realizaremos la misma práctica que se realizó en el apartado de &lt;strong&gt;&lt;em&gt;«contadores»&lt;/em&gt;&lt;/strong&gt; pero en este caso utilizaremos &lt;strong&gt;&lt;em&gt;«modificadores»&lt;/em&gt;&lt;/strong&gt;,&lt;br&gt;
como recordamos el ejemplo anterior consiste en la búsqueda de un número telefónico«(&lt;strong&gt;&lt;em&gt;55–30–80 77–82&lt;/em&gt;&lt;/strong&gt;)», seria muy interesante que intentaras dar tu propia solución para lo cual te recomiendo el sitio siguiente &lt;a href="https://regexr.com/"&gt;RegEx&lt;/a&gt;&lt;a href="https://regexr.com"&gt;.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NESgSZa9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AjYx8KJqLuzn2gb-FyxbBpQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NESgSZa9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AjYx8KJqLuzn2gb-FyxbBpQ.png" alt="[Ejemplo usando la combinación de lo aprendido para buscar el teléfono (55–30–80 77–82) (**Fig-34**)](https://regexr.com/41l1g)" width="709" height="496"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📓&lt;strong&gt;Nota&lt;/strong&gt; : Si quieres realizar cambios sobre la solución propuesta puedes hacerlo en el siguiente link &lt;a href="https://regexr.com/41l1g"&gt;plegaria.&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  😼 Conclusión
&lt;/h3&gt;

&lt;p&gt;Como se muestra en los ejemplos mostrados durante toda la entrada podemos decir que ya estamos evangelizados por lo que toda cadena que necesitemos utilizar las «&lt;strong&gt;&lt;em&gt;evil regular expressions *😈» **podremos aplicarles un exorcismo gracias al *&lt;/em&gt;«Dios Digital»&lt;/strong&gt; 🙌 ya que contamos con el conocimiento para crear las plegarias, es importante ver que desde este momento cuando utilicemos las &lt;em&gt;expresiones regulares&lt;/em&gt; ya no tendremos 2 problemas lo que tendremos desde este momento es un solución robusta y duradera.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h2&gt;
  
  
  👍 Las expresiones regulares si son mis amigas.
&lt;/h2&gt;
&lt;h2&gt;
  
  
  🙌 Las expresiones regulares si son mis amigas.
&lt;/h2&gt;
&lt;h2&gt;
  
  
  🤟 Las expresiones regulares si son mis amigas.
&lt;/h2&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Gracias por darte una vuelta por esta entrada&lt;/strong&gt;. Todo comentario es bien recibido en &lt;a href="https://twitter.com/Konami12Jorge"&gt;@Konami12Jorge&lt;/a&gt;, no olvides ayudar con 👏 y compartir este material si consideras que alguien más necesita ser evangelizado.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>regex</category>
      <category>node</category>
    </item>
    <item>
      <title>Patrones de diseño en JavaScript</title>
      <dc:creator>Jorge Méndez Ortega</dc:creator>
      <pubDate>Fri, 16 Aug 2019 22:34:04 +0000</pubDate>
      <link>https://dev.to/jmz12/patrones-de-diseno-en-javascript-4jh4</link>
      <guid>https://dev.to/jmz12/patrones-de-diseno-en-javascript-4jh4</guid>
      <description>&lt;p&gt;En este post, se mostraran algunas de las implementaciones de JavaScript y se explicarán algunos de sus patrones de diseño (para todos los ejemplo realizados se utilizará &lt;strong&gt;ecma2016&lt;/strong&gt; o 262).&lt;/p&gt;

&lt;p&gt;En la actualidad es muy común que como desarrolladores nos preguntemos cuál es una de las mejores formas de implementar un flujo de trabajo utilizando JavaScript, realmente no existe una respuesta concreta a esta pregunta, ya que cada aplicación tiene sus propias necesidades individuales por lo que es necesario pensar cuando consideramos que un patrón nos pueda ofrecer una solución ideal, teniendo lo anterior en cuenta realicé la siguiente pregunta.&lt;/p&gt;

&lt;h2&gt;
  
  
  🤔 ¿Qué es un patrón de diseño?
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Es la base para la búsqueda de soluciones a problemas muy comunes en el desarrollo de aplicativos y otros ámbitos referentes al diseño de interacciones o interfaces. (Fuente wikipedia).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Se podría resumir de una manera más sencilla como "una manera de resolver una problemática", un patrón de diseño tiene que cumplir por lo menos con los siguientes objetivos.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Estandarizar el lenguaje entre desarrolladores.&lt;/li&gt;
&lt;li&gt;Evitar perder tiempo en soluciones a problemas ya resueltos o conocidos.&lt;/li&gt;
&lt;li&gt;Crear código que se pueda reutilizar.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Manos a la obra
&lt;/h2&gt;

&lt;p&gt;Después de un poco de teoría empecemos con lo divertido, hablemos de código 😁. Existen varios patrones de diseño en este caso solo hablaremos de 3 patrones.&lt;/p&gt;

&lt;h2&gt;
  
  
  Patrón Object Literals
&lt;/h2&gt;

&lt;p&gt;Tal cual su nombre lo dice este patrón se conforma con la creación de un objeto que prácticamente es un &lt;strong&gt;JSON&lt;/strong&gt;. Una de las bondades de este patrón es que nos permite escribir el código de una manera organizada y no se corrompe el &lt;strong&gt;scope&lt;/strong&gt;(&lt;strong&gt;alcance&lt;/strong&gt;) global con nombres innecesarios, lo cual es una muy buena práctica sobre todo para los proyectos muy grandes.&lt;/p&gt;

&lt;p&gt;Como se comenta al principio la notación de este patrón es muy similar a la construcción de un &lt;strong&gt;JSON&lt;/strong&gt;, ya que cuenta con identificadores que permite el acceso al contenido de cada uno de ellos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Se inicia la declaracion del patron ObjectLiteral&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;MyObjectLiteral&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;suma&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;valor_a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;valor_b&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;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;valor_a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;valor_b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;EL resultado de &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;valor_a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;+&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;valor_b&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; = &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;resultado&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;resta&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;valor_a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;valor_b&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;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;valor_a&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;valor_b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;EL resultado de&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;valor_a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;valor_b&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; = &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;resultado&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="c1"&gt;// invocando a la funcion suma&lt;/span&gt;
&lt;span class="nx"&gt;MyObjectLiteral&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;suma&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// invocando a la funcion resta&lt;/span&gt;
&lt;span class="nx"&gt;MyObjectLiteral&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como podemos ver en el ejemplo anterior tenemos el ejemplo base del patrón, 😖hey un momento se supone que los ejemplos se escribirían con las nuevas mejoras que nos brinda &lt;em&gt;EcmaScript&lt;/em&gt;, tomando en cuenta el comentario realizaremos las mejoras para que nuestro código se vea de la manera siguiente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Se inicia la declaracion del patron ObjectLiteral&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;MyObjectLiteral&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;suma&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;valor_a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;valor_b&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;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;valor_a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;valor_b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`EL resultado de &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;valor_a&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; + &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;valor_b&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; = &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;resultado&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nf"&gt;resta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;valor_a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;valor_b&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;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;valor_a&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;valor_b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`EL resultado de &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;valor_a&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; - &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;valor_b&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; = &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;resultado&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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;span class="c1"&gt;// Destructuración&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;suma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;resta&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;MyObjectLiteral&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// invocando a la funcion suma&lt;/span&gt;
&lt;span class="nf"&gt;suma&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// invocando a la funcion resta&lt;/span&gt;
&lt;span class="nf"&gt;resta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🤩Genial nuestro código ya tiene muchas de las mejoras que ofrece &lt;em&gt;JavaScript&lt;/em&gt; entre las mejoras que encontramos son. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/template_strings" rel="noopener noreferrer"&gt;📝Literal Strings(Plantillas de Cadena de texto)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Operadores/Destructuring_assignment" rel="noopener noreferrer"&gt;🧩Destructuring (Asignación destructuración)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tomando en cuento lo anterior los ejemplo siguientes utilizaran las nuevas mejoras de &lt;em&gt;JavaScript&lt;/em&gt;&lt;em&gt;, es importante mencionar que el patrón _Object Literals&lt;/em&gt; es la base para el siguiente patrón, ya que lo utilizaremos para el manejo de la lógica.&lt;/p&gt;




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

&lt;p&gt;Para poder comprender este patrón es necesario entender el siguiente concepto de esta función.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Módulo anónimo&lt;/span&gt;
&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Me ejecuto de manera inmediata . . . . 😬&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;Ese tipo de declaración se conoce como &lt;strong&gt;&lt;em&gt;IIFE (Immediately-Invoked-Function-Expressions)&lt;/em&gt;&lt;/strong&gt;, y como su nombre lo dice es una función que se ejecuta de manera inmediata. Esta función crea un nuevo scope y genera "privacidad", sin embargo JavaScript no maneja el concepto de "privacidad", pero al generar un nuevo scope podemos simularlo, esto se logra envolviendo toda la lógica del aplicativo dentro de un contenedor. La idea es solo retornar las partes que nosotros necesitamos, y dejar las otras partes del código fuera del scope global.&lt;/p&gt;

&lt;p&gt;Después de crear el nuevo scope, necesitaremos un namespace para tener acceso al código que el módulo anónimo retorne.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;NameSpace : Variable con la que se genera la referencia a nuestro módulo anónimo.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Modulo anónimo&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;MyModule&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Me ejecuto de manera inmediata . . . . 😬&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)();&lt;/span&gt;
&lt;span class="c1"&gt;// Ejecutamos el módulo anónimo&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;MyModule&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hasta este momento podemos tener acceso a lo que retorne el módulo anónimo.&lt;/p&gt;

&lt;p&gt;Con anterioridad se habló de &lt;em&gt;"privacidad"&lt;/em&gt; dentro de este patrón, para poder mostrar este concepto funcionando analizaremos el siguiente ejemplo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Modulo anónimo&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;MyModule&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// generamos el objeto que tendra todas las funciones publicas&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;publicFunction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
    &lt;span class="c1"&gt;// esta variable es privada&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;//=========================================//&lt;/span&gt;
    &lt;span class="c1"&gt;// Metodos Privados                        //&lt;/span&gt;
    &lt;span class="c1"&gt;//=========================================//&lt;/span&gt;

    &lt;span class="nx"&gt;privateFunction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;total&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;//=========================================//&lt;/span&gt;
    &lt;span class="c1"&gt;// Metodos Publicos                        //&lt;/span&gt;
    &lt;span class="c1"&gt;//=========================================//&lt;/span&gt;

    &lt;span class="nx"&gt;publicFunction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;suma&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;valor_a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;valor_b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;SUMA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;valor_a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;valor_b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;total&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;SUMA&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`El resultado de la suma es = &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;SUMA&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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;// Retornamos nuestras funciones publicas&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;publicFunction&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;})();&lt;/span&gt;

&lt;span class="c1"&gt;// Ejecutando nuestro metodo publico&lt;/span&gt;
&lt;span class="nx"&gt;MyModule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;suma&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// el resultado es 500&lt;/span&gt;

&lt;span class="c1"&gt;// Intentando acceder a nuestra funcion privada&lt;/span&gt;
&lt;span class="nx"&gt;MyModule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;privateFunction&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// esto nos manda un error&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como se muestra en el ejemplo generamos un módulo el cual nos permite realizar una suma sin embargo a simple vista podemos ver un código común y corriente, lo interesante es que ya se está manejando el concepto de &lt;em&gt;"privacidad"&lt;/em&gt;, y no podemos tener acceso al método &lt;em&gt;privateFunction&lt;/em&gt;, pero si al método suma&lt;/p&gt;

&lt;p&gt;Esto se debe a que solo estamos retornando todo lo que contenga la &lt;em&gt;variable publicFunction&lt;/em&gt; y lo que no se encuentre dentro de ésta será privado por lo que solo se tendrá acceso dentro del scope de nuestro módulo 🙀😺.&lt;/p&gt;

&lt;p&gt;La pregunta que te puedes estar realizando hasta este momento es &lt;em&gt;¿Cómo consulto la respuesta de privateFunction?&lt;/em&gt;, para esto tendríamos que generar una función pública que obtenga el resultado que retorna "privateFunction", como se muestra a continuación.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Modulo anónimo&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;MyModule&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// generamos el objeto que tendra todas las funciones publicas&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;publicFunction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
    &lt;span class="c1"&gt;// esta variable es privada&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;//=========================================//&lt;/span&gt;
    &lt;span class="c1"&gt;// Metodos Privados                        //&lt;/span&gt;
    &lt;span class="c1"&gt;//=========================================//&lt;/span&gt;

    &lt;span class="nx"&gt;privateFunction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;total&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;//=========================================//&lt;/span&gt;
    &lt;span class="c1"&gt;// Metodos Publicos                        //&lt;/span&gt;
    &lt;span class="c1"&gt;//=========================================//&lt;/span&gt;

    &lt;span class="nx"&gt;publicFunction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;suma&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;valor_a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;valor_b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;SUMA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;valor_a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;valor_b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;total&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;SUMA&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`El resultado de la suma es = &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;SUMA&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="nx"&gt;publicFunction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getPrivateFunction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Valor de privateFunction =&amp;gt; &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;privateFunction&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Retornamos nuestras funciones publicas&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;publicFunction&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;})();&lt;/span&gt;

&lt;span class="c1"&gt;// Ejecutando nuestro metodo publico&lt;/span&gt;
&lt;span class="nx"&gt;MyModule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;suma&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// el resultado es 500&lt;/span&gt;

&lt;span class="c1"&gt;// Consiguiendo el valor de private function&lt;/span&gt;
&lt;span class="nx"&gt;MyModule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getPrivateFunction&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// esto nos regresa 500000&lt;/span&gt;

&lt;span class="c1"&gt;// Intentando acceder a nuestra funcion privada&lt;/span&gt;
&lt;span class="nx"&gt;MyModule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;privateFunction&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// esto nos manda un error&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Podemos ver que este patrón nos permite manipular el concepto de &lt;em&gt;"privacidad"&lt;/em&gt;, el cual resulta muy útil cuando no queremos que toda la funcionalidad del aplicativo esté expuesta.&lt;/p&gt;

&lt;p&gt;Existen diversas maneras de poder escribir el código del patrón module, algunas de ellas se muestran en el siguiente ejemplo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F2000%2F1%2AC_K4wLReFYhfT-AiaOpZrQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F2000%2F1%2AC_K4wLReFYhfT-AiaOpZrQ.png" alt="Maneras de escribir el patrón module"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Nota : en este patrón es común ver que todos los métodos privados cuentan con el prefijo &lt;strong&gt;_&lt;/strong&gt;. Tomando en cuenta la recomendación anterior nuestro código de ejemplo quedaría de la manera siguiente.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Modulo anónimo&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;MyModule&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// generamos el objeto que tendra todas las funciones publicas&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;publicFunction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
    &lt;span class="c1"&gt;// esta variable es privada&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;_total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;//=========================================//&lt;/span&gt;
    &lt;span class="c1"&gt;// Metodos Privados                        //&lt;/span&gt;
    &lt;span class="c1"&gt;//=========================================//&lt;/span&gt;

    &lt;span class="nx"&gt;_privateFunction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;_total&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;//=========================================//&lt;/span&gt;
    &lt;span class="c1"&gt;// Metodos Publicos                        //&lt;/span&gt;
    &lt;span class="c1"&gt;//=========================================//&lt;/span&gt;

    &lt;span class="nx"&gt;publicFunction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;suma&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;valor_a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;valor_b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;SUMA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;valor_a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;valor_b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;_total&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;SUMA&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`El resultado de la suma es = &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;SUMA&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="nx"&gt;publicFunction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getPrivateFunction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Valor de privateFunction =&amp;gt; &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;_privateFunction&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Retornamos nuestras funciones publicas&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;publicFunction&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;})();&lt;/span&gt;

&lt;span class="c1"&gt;// Ejecutando nuestro metodo publico&lt;/span&gt;
&lt;span class="nx"&gt;MyModule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;suma&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// el resultado es 500&lt;/span&gt;

&lt;span class="c1"&gt;// Consiguiendo el valor de private function&lt;/span&gt;
&lt;span class="nx"&gt;MyModule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getPrivateFunction&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// esto nos regresa 500000&lt;/span&gt;

&lt;span class="c1"&gt;// Intentando acceder a nuestra funcion privada&lt;/span&gt;
&lt;span class="nx"&gt;MyModule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;privateFunction&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// esto nos manda un error&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Este patrón de diseño tiene como finalidad crear nuevos objetos duplicándolos, clonando una instancia creada previamente, en resumen se podría decir que el uso de este patrón es lo más cercano a &lt;em&gt;POO (Programación Orientada a Objetos)&lt;/em&gt;, con los nuevas funciones de &lt;em&gt;EcmaScript&lt;/em&gt; esto puede armarce usando class, extends, etc.&lt;/p&gt;

&lt;p&gt;Otra de las características es que todos los objetos en JavaScript cuentan con la propiedad &lt;em&gt;proto&lt;/em&gt;, lo cual facilita crear nuevas funciones para clases ya existentes, prácticamente este patrón es la onda jejeje.&lt;/p&gt;

&lt;p&gt;Para poder comprender mejor este patrón vamos a crear un ejemplo usando prototype y otro utilizando las nuevas funciones de &lt;em&gt;EcmaScript&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Paso 1:
&lt;/h3&gt;

&lt;p&gt;Creando la clase Persona usando &lt;code&gt;prototype&lt;/code&gt; y &lt;code&gt;Class&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Creamos la clase usando prototype&lt;/span&gt;

&lt;span class="cm"&gt;/**
 * Constructor
*/&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Persona&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;apellido&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;apellido&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;apellido&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nombre&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="cm"&gt;/**
 * Permite obtener el apellido
 *
 * @return void.
 */&lt;/span&gt;
&lt;span class="nx"&gt;Persona&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getApellido&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Mi appelido es &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;apellido&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt; 

&lt;span class="cm"&gt;/**
 * Permite obtener el Nombre
 *
 * @return void.
 */&lt;/span&gt;
&lt;span class="nx"&gt;Persona&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getNombre&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Mi Nombre es &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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;// Generamos la instancia de la clase&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;persona&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Persona&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Clark&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Kent&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// invocamos los metodos&lt;/span&gt;
&lt;span class="nx"&gt;persona&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getNombre&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Mi nombre es Kent&lt;/span&gt;
&lt;span class="nx"&gt;persona&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getApellido&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Mi apellido es Clarck&lt;/span&gt;

&lt;span class="c1"&gt;// ========================================================================= //&lt;/span&gt;

&lt;span class="c1"&gt;// Creando la clase usando la palabra reservada class&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Persona&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="cm"&gt;/**
     * Constructor
    */&lt;/span&gt;
    &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(){}&lt;/span&gt;

    &lt;span class="cm"&gt;/**
     * Permite obtener el apellido
     *
     * @return void.
     */&lt;/span&gt;
    &lt;span class="nf"&gt;getApellido&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Mi appelido es &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;apellido&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="cm"&gt;/**
     * Permite obtener el Nombre
     *
     * @return void.
     */&lt;/span&gt;
    &lt;span class="nf"&gt;getNombre&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Mi Nombre es &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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;span class="c1"&gt;// Generamos la instancia de la clase&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;persona&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Persona&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Clark&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Kent&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// invocamos los metodos&lt;/span&gt;
&lt;span class="nx"&gt;persona&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getNombre&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Mi nombre es Kent&lt;/span&gt;
&lt;span class="nx"&gt;persona&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getApellido&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Mi apellido es Clarck&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Paso 2:
&lt;/h3&gt;

&lt;p&gt;Para el manejo de la herencia en EmacScript 2016 ya se puede utilizar extends, en versiones anteriores la herencia se manejaba de una manera más compleja.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Creamos la clase y una herencia usando prototype &lt;/span&gt;

&lt;span class="cm"&gt;/**
 * Constructor
*/&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;PersonaUsandoPrototype&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;apellido&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;apellido&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;apellido&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nombre&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="cm"&gt;/**
 * Permite obtener el apellido
 *
 * @return void.
 */&lt;/span&gt;
&lt;span class="nx"&gt;PersonaUsandoPrototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getApellido&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Mi appelido es &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;apellido&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt; 

&lt;span class="cm"&gt;/**
 * Permite obtener el Nombre
 *
 * @return void.
 */&lt;/span&gt;
&lt;span class="nx"&gt;PersonaUsandoPrototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getNombre&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Mi Nombre es &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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;// Generando herencia&lt;/span&gt;

&lt;span class="cm"&gt;/**
 * Constructor
*/&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;SuperHeroUsandoPrototype&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;apellido&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;powers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Se genera el llamado al constructor de la clase persona&lt;/span&gt;
    &lt;span class="nx"&gt;PersonaUsandoPrototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;apellido&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;powers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;powers&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// generamos la herencia&lt;/span&gt;
&lt;span class="nx"&gt;SuperHeroUsandoPrototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;PersonaUsandoPrototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="cm"&gt;/** 
 * Permite comnseguir los datos de nuestro heroe
 *
 * return void.
 */&lt;/span&gt;
&lt;span class="nx"&gt;SuperHeroUsandoPrototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getSuperHero&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// invocamos los metodos de las clase person&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getNombre&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getApellido&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Mi super poder es &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;powers&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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;// Generamos la instancia de la clase&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;HERO_PROTO&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;SuperHeroUsandoPrototype&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Jorge&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Mendez&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Programar como Loco 🤪&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// invocamos los métodos&lt;/span&gt;
&lt;span class="nx"&gt;HERO_PROTO&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getSuperHero&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="c1"&gt;// Mi nombre es Jorge&lt;/span&gt;
&lt;span class="c1"&gt;// Mi apellido es Mendez&lt;/span&gt;
&lt;span class="c1"&gt;// Mi super poder es Programar como Loco 🤪&lt;/span&gt;

&lt;span class="c1"&gt;// ========================================================================= //&lt;/span&gt;

&lt;span class="c1"&gt;// Creando la clase y herencias utilizando las class y extends&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Persona&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="cm"&gt;/**
     * Constructor
    */&lt;/span&gt;
    &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;apellido&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nombre&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;apellido&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;apellido&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="cm"&gt;/**
     * Permite obtener el apellido
     *
     * @return void.
     */&lt;/span&gt;
    &lt;span class="nf"&gt;getApellido&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Mi appelido es &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;apellido&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="cm"&gt;/**
     * Permite obtener el Nombre
     *
     * @return void.
     */&lt;/span&gt;
    &lt;span class="nf"&gt;getNombre&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Mi Nombre es &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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;span class="c1"&gt;// Generando la herencia&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SuperHero&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Persona&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="cm"&gt;/**
     * Constructor
    */&lt;/span&gt;  
    &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;apellido&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;powers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// llamando al constructor de la clase persona&lt;/span&gt;
        &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;apellido&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;powers&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;powers&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="cm"&gt;/** 
     * Permite comnseguir los datos de nuestro heroe
     *
     * return void.
     */&lt;/span&gt;
    &lt;span class="nf"&gt;getSuperHero&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// invocamos los metodos de las clase person&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getNombre&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getApellido&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Mi super poder es &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;powers&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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;span class="c1"&gt;// Generamos la instancia de la clase&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;heroe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;SuperHero&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Jorge&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Mendez&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Programar como Loco 🤪&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;heroe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getSuperHero&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; 
&lt;span class="c1"&gt;// Mi nombre es Jorge&lt;/span&gt;
&lt;span class="c1"&gt;// Mi apellido es Mendez&lt;/span&gt;
&lt;span class="c1"&gt;// Mi super poder es Programar como Loco 🤪&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El manejo del patrón &lt;em&gt;prototype&lt;/em&gt; es era lo más cercano a &lt;em&gt;POO&lt;/em&gt; actualmente con las mejoras que a tenido &lt;code&gt;JavaScript&lt;/code&gt; ya contamos con un &lt;em&gt;POO&lt;/em&gt; mas robusto, pero si recuerdan anteriormente comentamos que todos los objetos de JavaScript cuentan con la propiedad proto, por lo que podríamos agregar nuevas funcionalidades a objetos ya establecidos, por ejemplo podríamos crear una nueva función para el Objeto String.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cleanString&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;STRING&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;SPECIAL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;á&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;a&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;é&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;e&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;í&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;i&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ó&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;o&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ú&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;u&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ñ&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;n&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="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;STRING&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;newString&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;char&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;SPECIAL&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ASCII&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;char&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;charCodeAt&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;request&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ASCII&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ASCII&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;48&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;ASCII&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;57&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ASCII&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;97&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;ASCII&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;122&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;char&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;newString&lt;/span&gt;&lt;span class="p"&gt;}${&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;request&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; &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="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Boolean&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;CLEAN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Jorge Méndez Ortega ^$#%#$%^#%$&amp;amp;*%&amp;amp;^&amp;amp;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cleanString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;CLEAN&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// jorge-mendez-ortega&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;Los patrones de diseño son un camino para solucionar una problemática de maneras distintas, pero siempre obtendremos una solución que se podrá adaptar a nuestro aplicativo. Se podría decir que para construir nuestro aplicativo no existe un camino correcto, pero sí un patrón que nos facilite acercarnos al camino que buscamos.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>design</category>
      <category>patronesdediseño</category>
      <category>node</category>
    </item>
  </channel>
</rss>
