<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Desarrollo</title>
	<atom:link href="https://samaniel.com/docs-category/desarrollo/feed/" rel="self" type="application/rss+xml" />
	<link>https://samaniel.com</link>
	<description></description>
	<lastBuildDate>Thu, 03 Oct 2024 10:31:36 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.1</generator>
	<item>
		<title>Uso de Submódulos en Git</title>
		<link>https://samaniel.com/docs/uso-de-submodulos-en-git/</link>
		
		<dc:creator><![CDATA[Samaniel]]></dc:creator>
		<pubDate>Thu, 26 Sep 2024 22:46:19 +0000</pubDate>
				<guid isPermaLink="false">https://samaniel.com/?post_type=docs&#038;p=422</guid>

					<description><![CDATA[Hoy vamos a hablar de una característica poco utilizada de git. ¿Sabías que puedes gestionar dependencias de repositorios en Git [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Hoy vamos a hablar de una característica poco utilizada de git. ¿Sabías que puedes gestionar dependencias de repositorios en Git utilizando <strong>submódulos</strong>?.</p>



<h4 class="wp-block-heading">Características</h4>



<p>En esencia, hay un proyecto padre que es un repositorio. Contiene submódulos, los cuales a su vez también son repositorios por derecho propio, con todas las características propias de un repositorio.</p>



<p>Dentro del repositorio que contenga un submódulo, habrá un archivo <strong>.gitmodules</strong> que define los submódulos.</p>



<h4 class="wp-block-heading">¿Cómo crear y usar un submódulo desde cero?</h4>



<ul class="wp-block-list">
<li><strong>Crear un repositorio principal y el submódulo:</strong></li>
</ul>



<pre class="wp-block-code"><code><code>  git init super-proyecto</code></code></pre>



<ul class="wp-block-list">
<li><strong>Luego, crea el repositorio que será el submódulo:</strong></li>
</ul>



<pre class="wp-block-code"><code><code>  git init mi-submodulo</code></code></pre>



<ul class="wp-block-list">
<li><strong>o bien clónalo:</strong></li>
</ul>



<pre class="wp-block-code"><code>   git submodule add &lt;url-del-submodulo&gt;</code></pre>



<p></p>



<p>Ahora hay dos opciones:</p>



<ul class="wp-block-list">
<li><strong>Si lo has creado con git submodule add</strong> sobre un repositorio online que ya existe, te habrás bajado su contenido a local, y se habrá creado un archivo .gitmodules en el parent. Ya estás listo para hacer commits en el submódulo y subirlos.</li>



<li><strong>Si lo has iniciado manualmente</strong>, crea, el repositorio online y copia la url. Haz el primer commit, y pushea el repositorio que será un submódulo a su correspondiente repositorio online. Ahora deberás posicionarte en la carpeta/repositorio parent y añadir el repositorio como un submódulo. De esta manera crearás el archivo .gitmodules:</li>
</ul>



<pre class="wp-block-code"><code>   git submodule add &lt;url-del-submodulo></code></pre>



<ul class="wp-block-list">
<li><strong>Finalmente</strong>, y de ahora en adelante, cuando hayas subido cambios al repositorio del submódulo, sube a la carpeta superior, en este caso <strong>super-proyecto</strong>, y haz lo mismo con los cambios del submódulo en el repositorio de <strong>super-proyecto</strong>. Esto es necesario porque ambos repositorios son distintos, aunque uno esté conectado dentro de otro.</li>
</ul>



<h2 class="wp-block-heading">Otras operaciones que podrías necesitar</h2>



<ul start="3" class="wp-block-list">
<li><strong>Clonar un repositorio con submódulos</strong>:</li>
</ul>



<pre class="wp-block-code"><code>   git clone --recurse-submodules &lt;url-del-repo&gt;</code></pre>



<ul start="4" class="wp-block-list">
<li><strong>Actualizar submódulos</strong>:</li>
</ul>



<pre class="wp-block-code"><code>   git submodule update --remote</code></pre>



<h2 class="wp-block-heading">Conclusión</h2>



<p>Con los submódulos, puedes mantener tu código modular y reutilizable, utilizando repositorios como dependencias externas de otros repositorios.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Filtros en Spring Boot</title>
		<link>https://samaniel.com/docs/filtros-en-spring-boot/</link>
		
		<dc:creator><![CDATA[Samaniel]]></dc:creator>
		<pubDate>Mon, 16 Sep 2024 13:49:24 +0000</pubDate>
				<guid isPermaLink="false">https://samaniel.com/?post_type=docs&#038;p=390</guid>

					<description><![CDATA[Usando Filtros en Spring Boot Los filtros en Spring Boot son una forma de interceptar, redirigir y modificar las solicitudes [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">Usando Filtros en Spring Boot</h3>



<p>Los filtros en Spring Boot son una forma de interceptar, redirigir y modificar las solicitudes HTTP antes de que lleguen a los controladores, y también para manipular las respuestas antes de que se envíen al cliente. Esto es útil para una variedad de tareas, como autenticación, logging, y modificación de solicitudes o respuestas. Pueden aplicarse a todas las urls, o a urls específicas.</p>



<p>En Spring Boot, los filtros se implementan generalmente mediante la interfaz<code> Filter</code>.</p>



<h4 class="wp-block-heading">Cómo funciona</h4>



<p>Actúa como un middleware entre el servidor web de spring, y el DispatcherServlet. Al realizar una solicitud, el cliente envía una solicitud al servidor del spring, y ahí entra en acción el filtro. Al terminar la cadena de filtros, el DispatcherServlet de Spring recibe la solicitud. Cada filtro de dicha cadena puede operar sobre la solicitud o la respuesta, por ejemplo modificando los encabezados o verificando la autenticación. El orden en que se aplican los filtros se puede especificar en la configuración de la aplicación. Si es una response, el proceso es exactamente igual, pero a la inversa.</p>



<h4 class="wp-block-heading">Métodos</h4>



<p>En versiones anteriores era obligatorio sobreescribir estos dos métodos, pero ahora son opcionales:</p>



<ul class="wp-block-list">
<li><code><strong>init:</strong></code> Se sobreescribe la implementación por defecto cuando es necesaria alguna tarea previa, como acceso a algún recurso.</li>



<li><code><strong>destroy</strong></code>: Se sobreescribe la implementación por defecto cuando por ejemplo es necesario liberar recursos&#8230;</li>



<li><code><strong>doFilter</strong></code>: el filtro recibe como argumentos un objeto con la solicitud o la respuesta y la cadena de filtros.</li>
</ul>



<h3 class="wp-block-heading">Creación de un Filtro en Spring Boot</h3>



<ol class="wp-block-list">
<li><strong>Implementa la interfaz <code>Filter</code>:</strong><br>Crea una clase que implemente la interfaz <code>Filter</code>. Aquí puedes definir el comportamiento que deseas aplicar a las solicitudes o respuestas.</li>
</ol>



<pre class="wp-block-code"><code>   @Component
   public class CustomFilter implements Filter {

       @Override
       public void init(FilterConfig filterConfig) throws ServletException {
           // Inicialización del filtro, si es necesario
       }

       @Override
    public void doFilter(ServletRequest request, 
                         ServletResponse response, 
                         FilterChain chain)
            throws IOException, ServletException {
           // Código con la implementación de la lógica del filtro

           // Continúa con la siguiente entidad en la cadena de filtros
           chain.doFilter(request, response);

       }

       @Override
       public void destroy() {
           // Limpieza del filtro, si es necesario
       }
   }</code></pre>



<ol start="2" class="wp-block-list">
<li><strong>Registrar el Filtro:</strong><br>Puedes registrar el filtro en tu aplicación Spring Boot de dos formas principales: </li>
</ol>



<ul class="wp-block-list">
<li><strong>Usando <code>@Component</code>:</strong> Si usas la anotación, como en el anterior ejemplo, el filtro se registrará automáticamente. En este caso, se aplicará a todas las peticiones.</li>
</ul>



<ul class="wp-block-list">
<li><strong>Manualmente en una clase</strong> <code>@Configuration</code>, lo que permite más granularidad como definir urls específicas.</li>
</ul>



<pre class="wp-block-code"><code><code>@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean&lt;CustomFilter> loggingFilter() {
        FilterRegistrationBean&lt;CustomFilter> registrationBean = new FilterRegistrationBean&lt;>();

        registrationBean.setFilter(new CustomFilter());
        registrationBean.addUrlPatterns("/api/*"); // URL donde se aplicará el filtro

        return registrationBean;
    }
}</code></code></pre>



<h3 class="wp-block-heading" id="b8dd">OncePerRequestFilter</h3>



<p id="25e0">Hasta ahora, hemos visto cómo operan los filtros de Spring. Cuando ocurre una solicitud, esta pasa por una cadena de filtros hasta el DispatcherServlet. Si hay múltiples servlets, tener copias separadas del filtro para cada servlet puede llevar a ejecuciones redundantes de filtros. Para resolver esto, Spring ofrece una clase específica llamada <strong>OncePerRequestFilter</strong>. Esto previene posibles operaciones redundantes.</p>



<h3 class="wp-block-heading">Orden de Ejecución de Filtros</h3>



<p>En aplicaciones con múltiples filtros, el orden de ejecución puede ser importante. Puedes establecer el orden de los filtros:</p>



<ul class="wp-block-list">
<li><strong>Usando el método setOrder</strong>(int order) en el FilterRegistrationBean si lo registras manualmente. Los filtros con un valor de orden más bajo se ejecutarán antes.</li>
</ul>



<ul class="wp-block-list">
<li><strong>Utilizando la anotación </strong>@Order(1), @Order(2)&#8230;</li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Patrón Singleton</title>
		<link>https://samaniel.com/docs/patron-singleton/</link>
		
		<dc:creator><![CDATA[Samaniel]]></dc:creator>
		<pubDate>Wed, 04 Sep 2024 12:46:56 +0000</pubDate>
				<guid isPermaLink="false">https://samaniel.com/?post_type=docs&#038;p=361</guid>

					<description><![CDATA[El patrón Singleton es un patrón de diseño que garantiza que una clase tenga una única instancia y proporciona un [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>El patrón Singleton es un patrón de diseño que garantiza que una clase tenga una única instancia y proporciona un punto de acceso global a esa instancia. Este patrón es útil cuando solo debe existir una única instancia de una clase en toda la aplicación, como en el caso de la configuración de una aplicación o una conexión a la base de datos, o por ejemplo un servicio único en Spring Boot.</p>



<p></p>



<h3 class="wp-block-heading">Multihilo</h3>



<p>Es importante notar que, en un entorno multihilo, cada thread podría obtener una nueva instancia. Para asegurarse de que la operación sea thread safe, se deberá utilizar «syncronized».</p>



<p></p>



<h3 class="wp-block-heading">Ejemplo de Singleton en Java</h3>



<p>En general,  hay 3 condiciones:</p>



<p>Se puede inicializar de dos maneras, Lazy o Eager. </p>



<ul class="wp-block-list">
<li>Hacer privado el constructor</li>



<li>Asegurarse de que la variable con la instancia sea static</li>



<li>Proveer un método public static</li>
</ul>



<p>A continuación un ejemplo de cada una.</p>



<h4 class="wp-block-heading">Singleton con Lazy Initialization</h4>



<p>En este caso, la instancia de la clase Singleton se crea solo cuando es requerida, es decir, cuando se llama al método <code>getInstance()</code> por primera vez. Esto puede ser útil si la creación de la instancia es costosa en términos de recursos o tiempo.</p>



<pre class="wp-block-code"><code>public class SingletonLazy {

    // Instancia única de la clase, inicialmente nula
    private static SingletonLazy instancia;

    // Constructor privado para evitar instanciación desde fuera
    private SingletonLazy() {
        // Inicialización de recursos si es necesario
    }

    // Método público para obtener la instancia única de la clase
    public static SingletonLazy getInstance() {
        if (instancia == null) {
            instancia = new SingletonLazy();
        }
        return instancia;
    }

    // Método de ejemplo en la clase Singleton
    public void mostrarMensaje() {
        System.out.println("Hola desde Singleton con Lazy Initialization!");
    }
}</code></pre>



<p><strong>Uso del Singleton con Lazy Initialization:</strong></p>



<pre class="wp-block-code"><code>public class Main {
    public static void main(String&#91;] args) {
        SingletonLazy singleton = SingletonLazy.getInstance();
        singleton.mostrarMensaje();
    }
}</code></pre>



<p>En este ejemplo, la instancia de <code>SingletonLazy</code> solo se crea cuando se llama al método <code>getInstance()</code> por primera vez. Si el método nunca es llamado, la instancia nunca se crea.</p>



<h4 class="wp-block-heading">Singleton con Eager Initialization</h4>



<p>En el caso de <strong>Eager Initialization</strong>, la instancia de la clase Singleton se crea en el momento en que se carga la clase. Esto asegura que la instancia esté disponible inmediatamente, pero también significa que se creará incluso si nunca se utiliza, lo que puede ser un desperdicio de recursos en algunos casos.</p>



<pre class="wp-block-code"><code>public class SingletonEager {

    // Instancia única de la clase, creada al cargar la clase
    private static final SingletonEager instancia = new SingletonEager();

    // Constructor privado para evitar instanciación desde fuera
    private SingletonEager() {
        // Inicialización de recursos si es necesario
    }

    // Método público para obtener la instancia única de la clase
    public static SingletonEager getInstance() {
        return instancia;
    }

    // Método de ejemplo en la clase Singleton
    public void mostrarMensaje() {
        System.out.println("Hola desde Singleton con Eager Initialization!");
    }
}</code></pre>



<p><strong>Uso del Singleton con Eager Initialization:</strong></p>



<pre class="wp-block-code"><code>public class Main {
    public static void main(String&#91;] args) {
        SingletonEager singleton = SingletonEager.getInstance();
        singleton.mostrarMensaje();
    }
}</code></pre>



<p>En este ejemplo, la instancia de <code>SingletonEager</code> se crea en el momento en que la clase es cargada por el JVM, incluso si nunca se utiliza. Esto asegura que la instancia esté disponible inmediatamente, pero podría ser ineficiente si la instancia nunca es necesaria.</p>



<h4 class="wp-block-heading">Conclusión</h4>



<ul class="wp-block-list">
<li><strong>Lazy Initialization</strong>: La instancia se crea solo cuando es necesario, lo que puede ahorrar recursos si la instancia no siempre se usa.</li>



<li><strong>Eager Initialization</strong>: La instancia se crea tan pronto como se carga la clase, lo que asegura que esté disponible de inmediato, pero puede ser menos eficiente si la instancia no es utilizada.</li>
</ul>



<p></p>



<h3 class="wp-block-heading">Ejemplo de Singleton en Spring Boot</h3>



<p>En Spring Boot, el patrón Singleton es implementado por defecto en los beans de Spring, ya que los beans son Singleton por defecto. Aquí tienes un ejemplo simple:</p>



<pre class="wp-block-code"><code>import org.springframework.stereotype.Service;

@Service
public class SingletonService {

    // Método de ejemplo en el bean Singleton
    public void mostrarMensaje() {
        System.out.println("Hola desde Singleton en Spring Boot!");
    }
}</code></pre>



<p><strong>Uso del Singleton en Spring Boot:</strong></p>



<pre class="wp-block-code"><code>import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication implements CommandLineRunner {

    @Autowired
    private SingletonService singletonService;

    public static void main(String&#91;] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        singletonService.mostrarMensaje();
    }
}</code></pre>



<p>En este ejemplo:</p>



<ul class="wp-block-list">
<li>La clase <code>SingletonService</code> es un bean administrado por Spring.</li>



<li>La anotación <code>@Service</code> indica que esta clase es un servicio de Spring, y Spring la manejará como un Singleton.</li>



<li>En la clase principal <code>DemoApplication</code>, el <code>SingletonService</code> se inyecta utilizando <code>@Autowired</code>, asegurando que la misma instancia se utiliza en todo el ciclo de vida de la aplicación.</li>
</ul>



<h3 class="wp-block-heading">Conclusión</h3>



<p>El patrón Singleton es ampliamente utilizado cuando se necesita garantizar que una clase tenga una única instancia en toda la aplicación. En Java puro, se implementa de forma explícita, mientras que en Spring Boot, los beans ya son Singleton por defecto, lo que simplifica su uso y gestión.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Principios SOLID</title>
		<link>https://samaniel.com/docs/entendiendo-los-principios-solid-en-programacion-%f0%9f%a7%a9/</link>
		
		<dc:creator><![CDATA[Samaniel]]></dc:creator>
		<pubDate>Tue, 03 Sep 2024 14:59:34 +0000</pubDate>
				<guid isPermaLink="false">https://samaniel.com/?post_type=docs&#038;p=342</guid>

					<description><![CDATA[Los principios SOLID son fundamentales para crear código limpio, mantenible y escalable. Aquí te los explico con ejemplos sencillos en [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Los principios SOLID son fundamentales para crear código limpio, mantenible y escalable. Aquí te los explico con ejemplos sencillos en Java:</p>



<h4 class="wp-block-heading"><strong>S &#8211; Principio de Responsabilidad Única (Single Responsibility Principle)</strong></h4>



<p><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f50d.png" alt="🔍" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Definición:</strong> Una clase debe tener una única razón para cambiar, es decir, solo una responsabilidad.<br><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f6e0.png" alt="🛠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Ejemplo:</strong></p>



<pre class="wp-block-code"><code>   class ReportGenerator {
       public void generateReport() {
           // Genera el reporte
       }
   }

   class ReportSaver {
       public void saveReport(String report) {
           // Guarda el reporte en un archivo
       }
   }</code></pre>



<p>Aquí, <code>ReportGenerator</code> solo se encarga de generar el reporte y <code>ReportSaver</code> de guardarlo, siguiendo el principio de responsabilidad única.</p>



<p></p>



<h2 class="wp-block-heading"><strong>O &#8211; Principio de Abierto/Cerrado (Open/Closed Principle)</strong></h2>



<p><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f50d.png" alt="🔍" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Definición:</strong> El código debe estar abierto a la extensión, pero cerrado a la modificación.<br><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f6e0.png" alt="🛠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Ejemplo:</strong></p>



<pre class="wp-block-code"><code>   abstract class Shape {
       abstract double area();
   }

   class Circle extends Shape {
       private double radius;

       public Circle(double radius) {
           this.radius = radius;
       }

       @Override
       double area() {
           return Math.PI * radius * radius;
       }
   }

   class Rectangle extends Shape {
       private double width;
       private double height;

       public Rectangle(double width, double height) {
           this.width = width;
           this.height = height;
       }

       @Override
       double area() {
           return width * height;
       }
   }</code></pre>



<p>Aquí, se pueden añadir nuevas formas extendiendo <code>Shape</code>, sin necesidad de modificar la clase base.</p>



<p></p>



<h2 class="wp-block-heading"><strong>L &#8211; Principio de Sustitución de Liskov (Liskov Substitution Principle)</strong></h2>



<p><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f50d.png" alt="🔍" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Definición:</strong> Los objetos de una clase derivada deben poder reemplazar objetos de la clase base sin alterar el comportamiento del programa.<br><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f6e0.png" alt="🛠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Ejemplo:</strong></p>



<pre class="wp-block-code"><code>   class Bird {
       public void fly() {
           // Acción de volar
       }
   }

   class Sparrow extends Bird {
       @Override
       public void fly() {
           System.out.println("Sparrow is flying");
       }
   }

   class Ostrich extends Bird {
       @Override
       public void fly() {
           throw new UnsupportedOperationException("Ostriches can't fly");
       }
   }</code></pre>



<p>Aquí, <code>Ostrich</code> no debería heredar de <code>Bird</code> si no puede volar. En su lugar, podríamos tener una jerarquía separada para aves no voladoras.</p>



<p></p>



<h2 class="wp-block-heading"><strong>I &#8211; Principio de Segregación de Interfaces (Interface Segregation Principle)</strong></h2>



<p><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f50d.png" alt="🔍" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Definición:</strong> Una clase no debe estar obligada a implementar interfaces que no usa.<br><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f6e0.png" alt="🛠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Ejemplo:</strong></p>



<pre class="wp-block-code"><code>   interface Printer {
       void print();
   }

   interface Scanner {
       void scan();
   }

   class MultiFunctionDevice implements Printer, Scanner {
       @Override
       public void print() {
           System.out.println("Printing...");
       }

       @Override
       public void scan() {
           System.out.println("Scanning...");
       }
   }</code></pre>



<p>Aquí, <code>MultiFunctionDevice</code> implementa solo las interfaces que necesita, evitando métodos innecesarios.</p>



<p></p>



<h2 class="wp-block-heading"><strong>D &#8211; Principio de Inversión de Dependencias (Dependency Inversion Principle)</strong></h2>



<p><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f50d.png" alt="🔍" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Definición:</strong> Las clases deben depender de abstracciones, no de clases concretas.<br><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f6e0.png" alt="🛠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Ejemplo:</strong></p>



<pre class="wp-block-code"><code>   interface Database {
       void connect();
   }

   class MySQLDatabase implements Database {
       @Override
       public void connect() {
           System.out.println("Connecting to MySQL...");
       }
   }

   class DataHandler {
       private Database db;

       public DataHandler(Database db) {
           this.db = db;
       }

       public void handleData() {
           db.connect();
       }
   }</code></pre>



<p>Aquí, <code>DataHandler</code> depende de la abstracción <code>Database</code>, permitiendo cambiar la implementación concreta (como <code>MySQLDatabase</code>) sin modificar <code>DataHandler</code>.</p>



<p>Estos principios son la base para escribir código que sea más fácil de entender, mantener y escalar. ¡Implementarlos hará tu trabajo como desarrollador mucho más eficiente! <img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Patrón Builder</title>
		<link>https://samaniel.com/docs/patron-builder/</link>
		
		<dc:creator><![CDATA[Samaniel]]></dc:creator>
		<pubDate>Tue, 03 Sep 2024 14:46:25 +0000</pubDate>
				<guid isPermaLink="false">https://samaniel.com/?post_type=docs&#038;p=328</guid>

					<description><![CDATA[El patrón de diseño&#160;Builder&#160;es un patrón creacional que se utiliza para construir objetos complejos de manera controlada y paso a [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>El patrón de diseño&nbsp;<strong>Builder</strong>&nbsp;es un patrón creacional que se utiliza para construir objetos complejos de manera controlada y paso a paso. A diferencia de otros patrones de creación, el Builder separa la construcción del objeto de su representación, lo que permite crear diferentes representaciones de un objeto utilizando el mismo proceso de construcción. Este patrón es especialmente útil cuando un objeto puede tener múltiples configuraciones o cuando su construcción implica varios pasos que deben seguir un orden específico.</p>



<h3 class="wp-block-heading">¿Cómo Funciona el Patrón Builder?</h3>



<p>El patrón Builder se estructura generalmente en cuatro componentes clave:</p>



<ol class="wp-block-list">
<li><strong>Producto (Product)</strong>: El objeto complejo que se va a construir.</li>



<li><strong>Builder</strong>: Una interfaz que define los métodos necesarios para construir las partes del Producto.</li>



<li><strong>Concrete Builder</strong>: Implementa la interfaz Builder y construye la representación concreta del Producto.Imaginemos que estamos construyendo una pizza con diferentes configuraciones, como Pizza Margarita y Pizza Pepperoni. Aquí se muestra cómo implementar el patrón Builder en Java para este caso:</li>



<li><strong>Director</strong>: Controla el proceso de construcción, orquestando el orden en que se invocan los métodos del Builder.</li>
</ol>



<h3 class="wp-block-heading">Ejemplo Práctico: Construcción de una Pizza</h3>



<p>Imaginemos que estamos construyendo una pizza con diferentes configuraciones, como Pizza Margarita y Pizza Pepperoni. Aquí se muestra cómo implementar el patrón Builder en Java para este caso:</p>



<p>Ventajas del uso de @Builder en Lombok:<br>Código más limpio y legible: No es necesario implementar manualmente el constructor, métodos setters o getters. Lombok se encarga de generar todo eso.<br>Inmutabilidad: Los objetos creados con el patrón Builder suelen ser inmutables, lo que aumenta la seguridad y consistencia en la gestión de datos.<br>Fluidez en la creación de objetos: Permite la creación de objetos de manera fluida, estableciendo solo los valores necesarios.</p>



<h4 class="wp-block-heading">Explicación del Ejemplo</h4>



<p>En este ejemplo, hemos construido una&nbsp;<strong>Pizza</strong>&nbsp;utilizando el patrón Builder.</p>



<ul class="wp-block-list">
<li><strong>Producto</strong>: La clase&nbsp;<code>Pizza</code>&nbsp;representa el objeto complejo que queremos construir.</li>



<li><strong>Builder</strong>: La interfaz&nbsp;<code>PizzaBuilder</code>&nbsp;define los pasos necesarios para construir una pizza, como&nbsp;<code>setMasa</code>,&nbsp;<code>setSalsa</code>&nbsp;y&nbsp;<code>setIngredientes</code>.</li>



<li><strong>Concrete Builder</strong>: La clase&nbsp;<code>PizzaMargaritaBuilder</code>&nbsp;implementa la interfaz&nbsp;<code>PizzaBuilder</code>&nbsp;y construye una pizza específica, en este caso, una&nbsp;<strong>Pizza Margarita</strong>.</li>



<li><strong>Director</strong>: La clase <code>PizzaDirector</code> controla el proceso de construcción. En el método <code>makeMargarita</code>, se define cómo se construye una Pizza Margarita paso a paso.</li>
</ul>



<p>El patrón <strong>Builder</strong> es un patrón de diseño creacional que permite construir objetos complejos paso a paso, proporcionando una interfaz fluida y flexible para configurar las propiedades de un objeto antes de su construcción final. Esto es particularmente útil cuando un objeto tiene muchos parámetros opcionales o configuraciones complejas, evitando la creación de múltiples constructores o un código con parámetros largos.</p>



<h3 class="wp-block-heading">Implementación del patrón Builder con <strong>Lombok</strong></h3>



<p><strong>Lombok</strong> es una biblioteca para Java que reduce el código repetitivo mediante anotaciones. En el caso del patrón Builder, Lombok proporciona la anotación <code>@Builder</code>, la cual simplifica la implementación de este patrón al generar automáticamente el código necesario.</p>



<h4 class="wp-block-heading">Ejemplo de uso del patrón Builder con Lombok</h4>



<pre class="wp-block-code"><code>import lombok.Builder;
import lombok.ToString;

@Builder
@ToString
public class Persona {
    private String nombre;
    private int edad;
    private String direccion;
}</code></pre>



<h4 class="wp-block-heading">Creación de un objeto con el patrón Builder</h4>



<pre class="wp-block-code"><code>public class Main {
    public static void main(String&#91;] args) {
        Persona persona = Persona.builder()
                                .nombre("Juan")
                                .edad(30)
                                .direccion("Calle Falsa 123")
                                .build();
    }
}</code></pre>



<h4 class="wp-block-heading">Explicación</h4>



<ul class="wp-block-list">
<li>La anotación <code>@Builder</code> genera un <strong>builder</strong> para la clase <code>Persona</code>, permitiendo construir objetos con una sintaxis fluida.</li>



<li>La anotación <code>@ToString</code> genera automáticamente el método <code>toString()</code>, que facilita la impresión de los valores del objeto.</li>
</ul>



<p></p>



<h3 class="wp-block-heading">Beneficios del Patrón Builder</h3>



<ul class="wp-block-list">
<li><strong>Flexibilidad</strong>: Puedes crear diferentes versiones de un objeto complejo usando el mismo código de construcción.</li>



<li><strong>Claridad</strong>: La separación de la construcción y la representación permite que el código sea más claro y manejable.</li>



<li><strong>Control</strong>: El Director garantiza que el objeto se construya de manera coherente y en el orden correcto</li>
</ul>



<p>Código disponible en&nbsp;<a href="https://github.com/samaniel/design-patterns">Github</a></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
