<?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>SOLID</title>
	<atom:link href="https://samaniel.com/docs-category/desarrollo/buenas-practicas/solid/feed/" rel="self" type="application/rss+xml" />
	<link>https://samaniel.com</link>
	<description></description>
	<lastBuildDate>Thu, 05 Sep 2024 23:38:01 +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>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>
	</channel>
</rss>
