<?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>programación | ahierro.es</title>
	<atom:link href="https://blog.ahierro.es/tag/programacion/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.ahierro.es</link>
	<description>Un blog personal  donde compartir experiencias e inquietudes relacionadas con internet, tecnología y otros asuntos interesantes</description>
	<lastBuildDate>Sun, 07 Aug 2022 08:18:13 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.7.2</generator>

<image>
	<url>https://blog.ahierro.es/wp-content/uploads/2018/10/cropped-logo_small-1-2-32x32.png</url>
	<title>programación | ahierro.es</title>
	<link>https://blog.ahierro.es</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Tipos de mantenimiento de software</title>
		<link>https://blog.ahierro.es/tipos-de-mantenimiento-de-software/</link>
					<comments>https://blog.ahierro.es/tipos-de-mantenimiento-de-software/#comments</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Wed, 27 Nov 2019 06:14:21 +0000</pubDate>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[teoría]]></category>
		<guid isPermaLink="false">https://blog.ahierro.es/?p=2139</guid>

					<description><![CDATA[<p>El mantenimiento es la última fase del ciclo de vida del software, y por norma general también suele ser la más larga y en muchas ocasiones la más aburrida, pero también es una parte fundamental e inevitable de esta industria. Definición de mantenimiento Antes de avanzar con los distintos tipos de mantenimiento, es buena idea &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/tipos-de-mantenimiento-de-software/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "Tipos de mantenimiento de software"</span></a></p>
La entrada <a href="https://blog.ahierro.es/tipos-de-mantenimiento-de-software/">Tipos de mantenimiento de software</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></description>
										<content:encoded><![CDATA[<p>El mantenimiento es la última fase del ciclo de vida del software, y por norma general también suele ser la más larga y en muchas ocasiones la más aburrida, pero también es una parte fundamental e inevitable de esta industria.</p>



<figure class="wp-block-image size-large is-resized"><img fetchpriority="high" decoding="async" src="https://lh3.googleusercontent.com/CKQl4skAXQX4NOlsxGiaDNPNhFBQdnb4zQzc6D_SIykSGu83HOnTmPScrM57p-8hXFPC1Pv7HTPw9Nli91qYRWIUOtSGdOh4LT__if7HUYBAkbbZq4v1xir2W7r2IvhiWlW4dBoXdMcPVr8zO5pE6lSqwz-Y26m04lEFpbbVbAhGb1ZE_pJuCJbtTwK4rwRswPhdBV-O93nAUBZ0cVcp0e3pnfNooDzenFaE3--WznvK32jsk7QkE99fzFtEDXoLhXeEFtVnzsZi2Ce88UCXb7C07qtMd5PxdI8JDoUkj0V4UR5saqMsTasEg8yq3mxncoJEpVfHWs03DTgD6jyHw1ZfjkwlMYi6jntSG_kCZrzn3pcVMl268u00hydk3KaK_xUfbixo-xJ-5XjupRubiX9gUi4njuErDglohopexSSIK80CuJgbOD63U15t6Yz0xy-afpkQ3LA94HAJd-zrABVRzbx_j0dQXE8jRVIkdIx-bXr1V4oI7ET6LysGreSuvRjBFyksoIJsgvaeANl0X4J5rPCnz1W5yVnujKKQMPPNp7Z4QoShNiAHEEOVTQtciWIbqF_znpu4m0YQAxUWSRu7u_XZK6W4VCMGAuOMwV70bkCkgGHzGOr7oV1m9ZiwvszVXzPw8caSLM2m4AYRGsHHoxtGHXA7k3bnmH5jxqTqGr_IEKMLQvWsHeH1pSA8U3SCYikX651pSJxCysw1U4s2NYG5NSSx49KJwTmxSg=w1586-h892-no" alt="" width="840" height="471"/></figure>



<span id="more-2139"></span>



<h2 class="wp-block-heading">Definición de mantenimiento</h2>



<p>Antes de avanzar con los distintos tipos de mantenimiento, es buena idea unificar criterios y asegurarnos de que estamos de acuerdo en la definición.</p>



<p>El mantenimiento es la acción de modificar la versión en producción software con el fin de corregir errores, subsanar problemas o realizar cambios enfocados en conservar la capacidad de prestar el servicio para el cual fue diseñado. </p>



<h2 class="wp-block-heading">Tipos de mantenimiento</h2>



<p>Y ahora que tenemos claro qué es el mantenimiento del software, repasemos qué tipos hay.</p>



<h3 class="wp-block-heading">Mantenimiento preventivo</h3>



<p>Si visualizamos el mantenimiento desde un prisma general y no solo desde el punto de vista del desarrollo de software, la mayoría de nosotros pensaremos en un conjunto de acciones proactivas enfocadas a evitar el deterioro de la cosa mantenida.</p>





<p>Si hablamos de software es exactamente igual, el mantenimiento preventivo es la acción de modificar el software proactivamente con el objetivo de evitar su deterioro o de mejorarlo sin alterar su funcionamiento.</p>



<p>Podemos realizar este tipo de mantenimiento por varios fines como corregir <a href="https://blog.ahierro.es/a-que-huele-el-codigo-fuente/">olores en el código</a>, mejorar la comprensión, optimizar el funcionamiento, optimizar el consumo de recursos, etc</p>



<p>Llegados a este punto quizás te estés preguntando cuál es la diferencia entre el mantenimiento preventivo y la refactorización, pues a mi modo de ver ninguna, son la misma cosa. Así que te invito a leer el artículo <a href="https://blog.ahierro.es/refactorizacion-de-codigo/">Refactorización de código</a> para ampliar conocimientos.</p>



<h3 class="wp-block-heading">Mantenimiento correctivo</h3>



<p>El mantenimiento correctivo se sitúa justo en el lado opuesto del mantenimiento preventivo: si en el mantenimiento preventivo actuamos de forma proactiva para evitar que se produzca el error, en el mantenimiento correctivo lo hacemos de forma reactiva y reaccionamos a los o errores que aparecen.</p>



<p>Los errores son inevitables y por más que intentemos desarrollar software libres de bugs, tarde o temprano y en mayor o menor medida éstos van a aparecer. Por lo tanto, para minimizar el tiempo que <s>invertimos</s> gastamos corrigiendo errores y sufriendo los efecto de sus consecuencias debemos enfocar nuestros esfuerzos en tres tareas:</p>



<ul class="wp-block-list"><li>Disponer de un proceso de desarrollo adecuado con el fin de minimizar el número de bugs desde el primer momento. Puedes echarle un vistazo a la entrada <a href="https://blog.ahierro.es/entornos-en-el-desarrollo-de-software/">entorno de desarrollo</a>.</li><li>Realizar mantenimiento preventivo (ó refactorización).</li><li>Disponer de herramientas adecuadas para la notificación, clasificación y seguimiento de los errores.</li></ul>



<h3 class="wp-block-heading">Mantenimiento adaptativo</h3>



<p>El mantenimiento adaptativo consiste en modificar el software, sin alterar su funcionamiento, con el objetivo de dar respuesta a cambios en el entorno de la aplicación. El objetivo es que estos cambios no afecten a la capacidad del programa de prestar el servicio.</p>



<p>Algunos ejemplos de este tipo de mantenimiento pueden ser:</p>



<ul class="wp-block-list"><li>Modificar el software para adaptarse a cambios en una API de terceros.</li><li>Adaptar un software para soportar una nueva versión del lenguaje de programación.</li><li>Actualizar la versión de una librería o de un framework.</li><li>Soportar cambios en el sistema operativo o en el hardware.</li></ul>



<h3 class="wp-block-heading">Mantenimiento perfectivo</h3>



<p>En la literatura que he consultado identifican el mantenimiento perfectivo como un tipo de mantenimiento con un doble objetivo: por un lado la incorporación de nuevas funcionalidades o la modificación de las existentes, y por otro las adaptaciones necesarias para asegurar el rendimiento cuando existe un incremento del volumen considerable.</p>



<p>Mi opinión es que teniendo en cuenta el auge de los modelos de desarrollo ágiles y su filosofía de entrega de valor rápida basada en ciclos de desarrollo cortos, el mantenimiento perfectivo queda absorvido por la propia fase de desarrollo.</p>



<p>Y en cuanto a las adaptaciones necesarias para asegurar el rendimiento por aumento de volumen, creo que pueden ser perfectamente incluidas como mantenimiento preventivo, si se atajan a tiempo, o en caso contrario como mantenimiento correctivo.</p>



<h2 class="wp-block-heading">Dónde comienza el mantenimiento</h2>



<p>La versión en producción de un software es el producto de un proceso complejo formado por varias etapas conocido cómo ciclo de vida del software. Por lo tanto, la calidad del software final está altamente condicionada por la calidad individual de cada una de las etapas.</p>





<p>Por lo tanto, con el fin de minimizar el esfuerzo que hacemos en mantener el software podemos dar por válida una pequeña mentira: el mantenimiento del software comienza en el mismo momento en el que comienza el análisis de viabilidad del software. Es decir, invertir el tiempo necesario y hacer las cosas bien en cada una de las etapas nos garantiza, entre otras muchas ventajas, gastar menos tiempo en el mantenimiento del software .</p>



<h2 class="wp-block-heading">Mantenimiento, evolución y metodologías ágiles</h2>



<p>Como hemos visto con el mantenimiento perfectivo, las metodologías ágiles hacen que los conceptos de mantenimiento y evolución, en algunos casos, estén separados por una delgada línea gris que invita a hacer interpretaciones subjetivas de qué es qué. Éste es un tema sobre el que podríamos escribir largo y tendido, y sobre el que en esta ocasión no vamos a entrar pero si creí necesario mencionar.</p>



<h2 class="wp-block-heading">Créditos, referencias y artículos relacionados</h2>



<ul class="wp-block-list"><li>Imagen de portada por <a rel="noreferrer noopener" aria-label="Steve Buissinne en Pixabay (se abre en una nueva pestaña)" href="https://pixabay.com/users/stevepb-282134/" target="_blank">Steve Buissinne en Pixabay</a></li><li><a href="https://blog.ahierro.es/guia-del-buen-programador/">Guía del buen programador</a></li><li><a href="https://blog.ahierro.es/deuda-tecnologica-o-deuda-tecnica/">Deuda tecnológica o deuda técnica</a></li><li><a href="https://blog.ahierro.es/refactorizacion-de-codigo/">Refactorización de código</a></li><li><a href="https://blog.ahierro.es/cohesion-y-acoplamiento/">Cohesión y acoplamiento</a></li></ul>



<p></p>La entrada <a href="https://blog.ahierro.es/tipos-de-mantenimiento-de-software/">Tipos de mantenimiento de software</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.ahierro.es/tipos-de-mantenimiento-de-software/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Principios KISS, DRY y YAGNI</title>
		<link>https://blog.ahierro.es/principios-kiss-dry-y-yagni/</link>
					<comments>https://blog.ahierro.es/principios-kiss-dry-y-yagni/#respond</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Wed, 30 Oct 2019 07:12:15 +0000</pubDate>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[teoría]]></category>
		<guid isPermaLink="false">https://blog.ahierro.es/?p=1970</guid>

					<description><![CDATA[<p>KISS, DRY y YAGNI son tres principios que podemos aplicar en el diseño y el desarrollo de software, y que a pesar de tratarlos juntos en esta entrada, no guardan ninguna relación entre si más allá de la importancia y simplicidad de su mensaje. A mi modo de ver, estos tres principios pueden ser tratados &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/principios-kiss-dry-y-yagni/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "Principios KISS, DRY y YAGNI"</span></a></p>
La entrada <a href="https://blog.ahierro.es/principios-kiss-dry-y-yagni/">Principios KISS, DRY y YAGNI</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></description>
										<content:encoded><![CDATA[<p>KISS, DRY y YAGNI son tres principios que podemos aplicar en el diseño y el desarrollo de software, y que a pesar de tratarlos juntos en esta entrada, no guardan ninguna relación entre si más allá de la importancia y simplicidad de su mensaje.</p>



<figure class="wp-block-image is-resized"><img decoding="async" src="https://blog.ahierro.es/wp-content/uploads/2019/10/design-1024x576.jpg" alt="Principios de diseño" class="wp-image-1999" width="840" height="473" srcset="https://blog.ahierro.es/wp-content/uploads/2019/10/design-1024x576.jpg 1024w, https://blog.ahierro.es/wp-content/uploads/2019/10/design-300x169.jpg 300w, https://blog.ahierro.es/wp-content/uploads/2019/10/design-768x432.jpg 768w, https://blog.ahierro.es/wp-content/uploads/2019/10/design.jpg 1920w" sizes="(max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px" /></figure>



<span id="more-1970"></span>



<p>A mi modo de ver, estos tres principios pueden ser tratados como tres magníficos consejos para compartir con los desarrolladores más noveles, e incluso a veces con algunos mucho más experimentados.</p>



<h2 class="wp-block-heading">KISS</h2>



<p>KISS es un principio de diseño muy popular tanto en el desarrollo de software como en otros muchos ámbitos. Es el acrónimo de «Keep It Simple, Stupid», y es una forma coloquial de decir que las cosas sencillas funcionan mejor.</p>



<p>Es uno de los mejores consejos se le puede dar a cualquier persona que diseñe o cree algo, ya sea relacionado con el desarrollo del software o no: hazlo sencillo, evita complicaciones innecesarias.</p>



<p>Y ya centrándonos en el desarrollo de software, evitar aumentar el nivel de complejidad cuando no es estrictamente necesario trae consigo múltiples ventajas, entre las que destacar la mejora de la comprensión y el mantenimiento, sin olvidar la sensación de satisfacción de haber escrito un código elegante.</p>



<p>No seguir este principio, en cambio, propiciará tener una estructura y un código engorroso y con olores. Si eres lector habitual de este blog, recordarás que hace varios meses escribíamos sobre el código limpio en el artículo <a href="https://blog.ahierro.es/a-que-huele-el-codigo-fuente/">¿A qué huele el código fuente?</a>, dónde mencionábamos la complejidad innecesaria como un motivo de olor.</p>



<p>A modo anecdótico añadir que KISS es un principio que no proviene del desarrollo de software, su origen se atribuye al ingeniero aeroespacial americano Kelly Jonhson, quien contribuyó al desarrollo de varias aeronaves para el ejército de su país.</p>



<h2 class="wp-block-heading">DRY</h2>



<p>DRY hace énfasis en la importancia de evitar la duplicidad en el código fuente, siendo el acrónimo de «Don&#8217;t repeat yourself» y estando sustentado por la afirmación de que cada pedazo de código debe tener una representación única, inequívoca y autoritaria en el sistema.</p>



<p>Los padres de DRY son Andy Hunt y Dave Thomas, quienes publicaron este principio en el libro The <a rel="noreferrer noopener" aria-label="Pragmatic Programmer (abre en una nueva pestaña)" href="https://pragprog.com/book/tpp20/the-pragmatic-programmer-20th-anniversary-edition" target="_blank">Pragmatic Programmer</a>, en 1999, y del que en el momento de escribir estas líneas han publicado una edición conmemorativa del veinte aniversario.</p>





<p>Es un principio que está estrechamente ligado con la calidad del código y que, al igual que sucede con KISS, también mencionamos en el artículo <a href="https://blog.ahierro.es/a-que-huele-el-codigo-fuente/">¿A qué huele el código fuente?</a>.</p>



<p>Y cuando no cumplimos con el principio DRY, se suele decir que cumplimos con el principio WET, por el juego de palabras en inglés, dónde WET sería el acrónimo de «write every time» o «we enjoy typing».</p>



<h2 class="wp-block-heading">YAGNI</h2>



<p>Tercer principio, tercer consejo y para cerrar el círculo tercer acrónimo, en este caso de «You aren&#8217;t gonna need it».</p>



<p>Este principio invita a no desarrollar «por si a caso», ¿cuantas veces nos han pedido una funcionalidad determinada y hemos excedido los requisitos en previsión de algo que nunca ocurrió? Pues bien, YAGNI propone hacer exclusivamente lo solicitado y necesario.</p>



<p>YAGNI tiene su origen en la programación extrema, dónde prima la simplicidad y dónde se opta por no invertir tiempo en dar solución a necesidades todavía inexistentes. La programación extrema se guían por la afirmación «Do The Simplest Thing That Could Possibly Work», de la cual han creado un acrónimo DTSTTCPW que desde mi punto de vista excede lo razonable y roza el absurdo.</p>



<p>Este principio es sin duda alguna el que más me ha costado aceptar de los tres que hemos visto hoy, de hecho, aunque estoy muy de acuerdo con él y creo que por norma general deberíamos cumplirlo, considero que la intuición de un desarrollador o un analista suficientemente experimentado, en combinación de un profundo conocimiento del negocio y del cliente, pueden dar pie a que nos saltemos este principio en ocasiones puntuales.</p>



<h2 class="wp-block-heading">Créditos, referencias y artículos relacionados</h2>



<ul class="wp-block-list"><li>Imagen por <a href="https://pixabay.com/users/3844328-3844328/" target="_blank" rel="noreferrer noopener" aria-label="Inactive Account en Pixabay (abre en una nueva pestaña)">Inactive Account en Pixabay</a>.</li><li><a href="https://blog.ahierro.es/a-que-huele-el-codigo-fuente/">¿A qué huele el código fuente?</a></li><li><a href="https://blog.ahierro.es/patrones-de-diseno-de-software/">Patrones de diseño de software</a></li><li><a href="https://blog.ahierro.es/refactorizacion-de-codigo/">Refactorización de código</a></li><li><a href="https://blog.ahierro.es/cohesion-y-acoplamiento/">Cohesión y acoplamiento</a></li><li><a href="https://blog.ahierro.es/deuda-tecnologica-o-deuda-tecnica/">Deuda tecnológica o deuda técnica</a></li></ul>La entrada <a href="https://blog.ahierro.es/principios-kiss-dry-y-yagni/">Principios KISS, DRY y YAGNI</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.ahierro.es/principios-kiss-dry-y-yagni/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Patrones de diseño de software</title>
		<link>https://blog.ahierro.es/patrones-de-diseno-de-software/</link>
					<comments>https://blog.ahierro.es/patrones-de-diseno-de-software/#respond</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Tue, 22 Oct 2019 06:36:45 +0000</pubDate>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[teoría]]></category>
		<guid isPermaLink="false">https://blog.ahierro.es/?p=1897</guid>

					<description><![CDATA[<p>Si todavía no estás familiarizado con el concepto «patrones de diseño» tras leer este artículo conocerás su importancia y probablemente te des cuenta de que ya conoces algunos de ellos. Si ya sabes de que va, te invito a seguir leyendo para refrescar o incluso ampliar conocimientos. Qué son los patrones de diseño La RAE &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/patrones-de-diseno-de-software/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "Patrones de diseño de software"</span></a></p>
La entrada <a href="https://blog.ahierro.es/patrones-de-diseno-de-software/">Patrones de diseño de software</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></description>
										<content:encoded><![CDATA[<p>Si todavía no estás familiarizado con el concepto «patrones de diseño» tras leer este artículo conocerás su importancia y probablemente te des cuenta de que ya conoces algunos de ellos. Si ya sabes de que va, te invito a seguir leyendo para refrescar o incluso ampliar conocimientos.</p>



<figure class="wp-block-image is-resized"><img decoding="async" src="https://blog.ahierro.es/wp-content/uploads/2019/10/patrones-1024x576.jpg" alt="Patrones de siseño de software" class="wp-image-1932" width="840" height="474" srcset="https://blog.ahierro.es/wp-content/uploads/2019/10/patrones-1024x576.jpg 1024w, https://blog.ahierro.es/wp-content/uploads/2019/10/patrones-300x169.jpg 300w, https://blog.ahierro.es/wp-content/uploads/2019/10/patrones-768x432.jpg 768w, https://blog.ahierro.es/wp-content/uploads/2019/10/patrones.jpg 1920w" sizes="(max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px" /></figure>



<span id="more-1897"></span>



<h2 class="wp-block-heading">Qué son los patrones de diseño</h2>



<p>La RAE define <em>patrón</em> como un «Modelo que sirve de muestra para sacar otra cosa igual», una definición muy acertada si la aplicamos al diseño de software.</p>



<p>Los patrones de diseño de software son un conjunto de estrategias de programación diseñadas para dar solución a problemas comunes. Cada patrón se centra en resolver un problema determinado, de forma que disponemos de una solución estándar que garantiza la resolución eficaz de un problema particular.</p>



<p>Podemos decir que existe un catálogo de patrones de diseño de software,  aunque hasta dónde he podido investigar, no existe una lista oficial, pero si una serie de comunidades y organizaciones enfocadas  en la investigación, aprendizaje, inventariado y comunicación de las  mismas. Entre ellas podemos destacar <a rel="noreferrer noopener" href="https://www.hillside.net/" target="_blank">The Hillside Group</a>.</p>



<p>Otro aspecto más a destacar es que los patrones de diseño no son un ente estático, sino que evolucionan atendiendo a los nuevos retos que surgen con los avances en el área de la programación. Así, vemos como cada cierto tiempo se amplia el catálogo de patrones con algunos nuevos.</p>



<h2 class="wp-block-heading">Un poco de historia</h2>



<p>Podemos decir que los patrones de diseño fueron popularizados en la década de los noventa por un grupo de programadores conocido como &#8216;Gang of Four&#8217; formada por:  Erich Gamma, Richard Helm, Ralph Johnson y John Vlissides. </p>





<p>La banda de los cuatro, traducción de Gang of Four, publicaron el libro &#8216;GoF Design Patterns&#8217; en el año 1990. No obstante, debemos destacar  que no fueron los primeros en acuñar el término.</p>



<p>El libro <a rel="noreferrer noopener" aria-label="'GoF Designa Patterns' está disponible en OpenLibra (abre en una nueva pestaña)" href="https://openlibra.com/es/book/gof-design-patterns" target="_blank">&#8216;GoF Designa Patterns&#8217; está disponible en OpenLibra</a> bajo licencia  Creative Commons Attribution-ShareAlike 3.0.</p>



<h2 class="wp-block-heading">Beneficios de los patrones de diseño</h2>



<p>Estandarizar la estrategia de resolución de algunos problemas comunes aporta  varios beneficios, estos son algunos de ellos:</p>



<ul class="wp-block-list"><li>Ahorro de tiempo en el planteamiento y el diseño de la solución, pues no es necesario reinventar la rueda.</li><li>Existencia de extensa documentación.</li><li>Resultados previsibles y garantizados.</li><li>Traspaso ágil de conocimientos.</li><li>Estandarización de vocabulario.</li><li>Facilidad para obtener soporte comunitario.</li></ul>



<h2 class="wp-block-heading">Tipos de patrones de diseño</h2>



<p style="text-align:left">El libro &#8216;GoF Design Patterns&#8217;, definía un total de 23 patrones divididos en tres categorías, pero desde su publicación han pasado casi treinta años, y como hemos comentado hablamos de un ente en constante evolución, así que tanto el numero de patrones como el número de tipologías en los que están segmentados han crecido considerablemente.  A día de hoy, podemos dividir los patrones en las siguientes categorías: </p>



<ul class="wp-block-list"><li>Patrones creacionales</li><li>Patrones estructurales</li><li>Patrones de comportamiento</li><li>Patrones funcionales</li><li>Patrones de concurrencia</li><li>Patrones de arquitectura</li><li>Patrones de computación distribuida</li><li>Otros</li></ul>



<p>De las cuales las tres primeras eran las que aparecían en el libro &#8216;GoF Design Patterns&#8217;.</p>



<h2 class="wp-block-heading">Patrones de diseño</h2>



<p style="text-align:left">A pesar de no existir un catálogo oficial, a continuación veremos una lista de los principales patrones segmentados según las distintas tipologías que hemos visto.</p>



<p>Pensaba acompañar cada patrón de una breve descripción, pero teniendo en cuenta que mencionaremos más de cien, no acabaría nunca de escribir esta entrada. Así pues, tomaremos esta entrada como introducción e índice para futuros artículos dedicados a patrones de diseño específicos.</p>



<p>Los nombres de los patrones los especificaremos en inglés, aunque muchos de ellos tienen su traducción en castellano.</p>



<h3 class="wp-block-heading">Patrones de diseño creacionales</h3>



<ul class="wp-block-list"><li>Abstract factory</li><li>  Builder</li><li>  Dependency injection</li><li>  Factory method</li><li>  Lazy initialization</li><li>  Multiton</li><li>  Object pool</li><li>  Prototype</li><li>  RAII</li><li>  Singleton</li></ul>



<h3 class="wp-block-heading">Patrones de diseño estructural</h3>



<ul class="wp-block-list"><li>Adapter</li><li> Bridge</li><li> Composite</li><li> Decorator</li><li> Delegation</li><li> Facade</li><li> Flyweight</li><li> Front controller</li><li> Marker interface</li><li> Module</li><li> Proxy</li><li> Twin</li></ul>



<h3 class="wp-block-heading">Patrones de diseño de comportamiento</h3>



<ul class="wp-block-list"><li>Blackboard</li><li> Chain of responsibility</li><li> Command</li><li> Interpreter</li><li> Iterator</li><li> Mediator</li><li> Memento</li><li> Null object</li><li> Observer</li><li> Servant</li><li> Specification</li><li> State</li><li> Strategy</li><li> Template method</li><li> Visitor</li></ul>



<h3 class="wp-block-heading">Patrones de diseño funcional</h3>



<ul class="wp-block-list"><li>Closure</li><li> Currying</li><li> Function composition</li><li> Functor</li><li> Monad</li><li> Generator</li></ul>



<h3 class="wp-block-heading">Patrones de diseño de concurrencia</h3>



<ul class="wp-block-list"><li>Active object</li><li>  Actor</li><li>  Balking</li><li>  Barrier</li><li>  Binding properties</li><li>  Coroutine</li><li>  Compute kernel</li><li>  Double-checked locking</li><li>  Event-based asynchronous</li><li>  Fiber</li><li>  Futex</li><li>  Futures and promises</li><li>  Guarded suspension</li><li>  Immutable object</li><li>  Join</li><li>  Lock</li><li>  Messaging</li><li>  Monitor</li><li>  Nuclear</li><li>  Proactor</li><li>  Reactor</li><li>  Read write lock</li><li>  Scheduler</li><li>  Thread pool</li><li>  Thread-local storage</li></ul>





<h3 class="wp-block-heading">Patrones de diseño de arquitectura</h3>



<ul class="wp-block-list"><li>ADR</li><li>Active record</li><li> Broker</li><li> Client–server</li><li> CBD</li><li> DAO</li><li> DTO</li><li> DDD</li><li> ECB</li><li> ECS</li><li> EDA</li><li> Front controller</li><li> Identity map</li><li> Interceptor</li><li> Implicit invocation</li><li> Inversion of control</li><li> Model 2</li><li> MOM</li><li> Microservices</li><li> MVA</li><li> MVC</li><li> MVP</li><li> MVVM</li><li> Monolithic</li><li> Multitier</li><li> Naked objects</li><li> ORB</li><li> P2P</li><li> Publish–subscribe</li><li> PAC</li><li> REST</li><li> SOA</li><li> Service locator</li><li> SN</li><li> SBA </li><li> Specification</li></ul>



<h3 class="wp-block-heading">Patrones de diseño de computación distribuida</h3>



<ul class="wp-block-list"><li>Ambassador</li><li> Anti-Corruption Layer</li><li> Bulkhead</li><li> Cache-Aside </li><li> Circuit Breaker</li><li> CQRS</li><li> Compensating Transaction</li><li> Competing Consumers</li><li> Compute Resource Consolidation</li><li> Event Sourcing</li><li> External Configuration Store</li><li> Federated Identity</li><li> Gatekeeper</li><li> Index Table</li><li> Leader Election</li><li> MapReduce</li><li> Materialized View</li><li> Pipes</li><li> Filters</li><li> Priority Queue</li><li> Publisher-Subscriber</li><li> Queue-Based Load Leveling</li><li> Retry</li><li> Scheduler Agent Supervisor</li><li> Sharding</li><li> Sidecar</li><li> Strangler</li><li> Throttling</li><li> Valet Key</li></ul>



<h3 class="wp-block-heading">Otros patrones de diseño</h3>



<ul class="wp-block-list"><li>Business delegate</li><li> Composite entity</li><li> Intercepting filter</li><li> Lazy loading</li><li> Mangler</li><li> Mock object</li><li> Type tunnel</li><li> Method chaining</li></ul>



<h2 class="wp-block-heading">Créditos, referencias y artículos relacionados</h2>



<ul class="wp-block-list"><li>Imagen por <a rel="noreferrer noopener" aria-label="stux en pixabay (abre en una nueva pestaña)" href="https://pixabay.com/users/stux-12364/" target="_blank">stux en pixabay</a></li><li><a href="https://blog.ahierro.es/a-que-huele-el-codigo-fuente/">¿A qué huele el código fuente?</a></li><li><a href="https://blog.ahierro.es/refactorizacion-de-codigo/">Refactorización de código</a></li><li><a href="https://blog.ahierro.es/cohesion-y-acoplamiento/">Cohesión y acoplamiento</a></li><li><a href="https://blog.ahierro.es/deuda-tecnologica-o-deuda-tecnica/">Deuda tecnológica o deuda técnica</a></li></ul>La entrada <a href="https://blog.ahierro.es/patrones-de-diseno-de-software/">Patrones de diseño de software</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.ahierro.es/patrones-de-diseno-de-software/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Tipos de cohesión</title>
		<link>https://blog.ahierro.es/tipos-de-cohesion/</link>
					<comments>https://blog.ahierro.es/tipos-de-cohesion/#comments</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Wed, 17 Jul 2019 06:31:43 +0000</pubDate>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[teoría]]></category>
		<guid isPermaLink="false">https://blog.ahierro.es/?p=1387</guid>

					<description><![CDATA[<p>En la última entrega, hemos visto que son tanto la cohesión como el acoplamiento. Además hemos repasado los beneficios que nos aportan cada uno de ello y como afectan a la calidad del código que generamos. En este artículo seguimos profundizando en uno de estos conceptos, abordando los distintos tipos de cohesión existentes, e incluyendo &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/tipos-de-cohesion/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "Tipos de cohesión"</span></a></p>
La entrada <a href="https://blog.ahierro.es/tipos-de-cohesion/">Tipos de cohesión</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></description>
										<content:encoded><![CDATA[<p>En la última entrega, hemos visto que son tanto la cohesión como el acoplamiento. Además hemos repasado los beneficios que nos aportan cada uno de ello y como afectan a la calidad del código que generamos. En este artículo seguimos profundizando en uno de estos conceptos, abordando los distintos tipos de cohesión existentes, e incluyendo ejemplos para tener una visión mucho más clara y práctica.</p>



<div class="wp-block-image"><figure class="aligncenter is-resized"><img loading="lazy" decoding="async" src="https://blog.ahierro.es/wp-content/uploads/2019/07/cohesion2.png" alt="Cohesión" class="wp-image-1461" width="650" height="438" srcset="https://blog.ahierro.es/wp-content/uploads/2019/07/cohesion2.png 650w, https://blog.ahierro.es/wp-content/uploads/2019/07/cohesion2-300x202.png 300w" sizes="auto, (max-width: 650px) 100vw, 650px" /></figure></div>



<span id="more-1387"></span>



<p>Al igual que hicimos en la entrada <a href="https://blog.ahierro.es/cohesion-y-acoplamiento/">Cohesión y acoplamiento</a>, en la que puedes encontrar una buena descripción sobre estos dos conceptos, trataremos la cohesión única y exclusivamente a nivel de clase.</p>



<p>Y para no enrollarnos más, veamos el índice de contenidos y vayamos al lío.</p>



<h2 class="wp-block-heading">Idoneidad de los tipos de cohesión</h2>



<p>La cohesión dentro de una clase puede conseguirse utilizando diversas técnicas. Atendiendo a estas técnicas existen siete tipos de cohesión, algunas de las cuales son mucho más recomendables que otras. Así, si las ordenamos de más recomendable a menos recomendable tendremos lo siguiente:</p>



<ul class="wp-block-list"><li>Cohesión funcional.</li><li>Cohesión secuencial.</li><li>Cohesión comunicacional.</li><li>Cohesión procedimental.</li><li>Cohesión lógica.</li><li>Cohesión temporal.</li><li>Cohesión casual.</li></ul>





<p>Es más, si vamos un paso más allá y dividimos los tipos de cohesión en función de su idoneidad, podemos decir que existen tres grupos:</p>



<ul class="wp-block-list"><li>Tipo de cohesión óptimo: funcional.</li><li>Tipos de cohesión recomendados: secuencial, comunicacional y procedimental.</li><li>Tipos de cohesión no recomendados:  lógica, temporal y casual.</li></ul>



<h2 class="wp-block-heading">Tipos de cohesión</h2>



<p>Veamos ahora los tipos de cohesión uno a uno.</p>



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



<p>Es el tipo de cohesión óptimo, todos los elementos están relacionados para realizar una única tarea, lo que propicia el cumplimiento del principio de responsabilidad única (SRP). También favorecerá clases de fácil comprensión y mantenimiento.</p>



<p>Veamos un ejemplo:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: java; title: ; notranslate">
public class updateStatusBar {
    

   private String message;
   private int level;

   public updateStatusBar(String message, int level) {

      this.setMessage(message);
      this.setLevel(level);

      this.clear();
      this.update();

   }

   private void clear() {

      this.message = &quot;&quot;;
      this.level = 0;
      this.update();

   }

   private void setMessage(String message) {

      this.message = message;

   }

   private void setLevel(int level) {

      this.level = level;

   }

   private void update() {

      ...

   }    
    
}
</pre></div>


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



<p>Los métodos involucrados  deben seguir un estricto orden de ejecución para completar la tarea. La cohesión se consigue tanto mediante la propia ejecución secuenciales de los métodos como mediante la utilización del mismo conjunto de datos, utilizando la salida de algunos métodos (return) como entrada por parámetros de otros.</p>



<p>Con el siguiente ejemplo lo veremos mucho más claro. Fijaos que ninguna de las instrucciones puede ser ejecutada sin antes haber hecho lo propio con la anterior, y cómo los resultados de la ejecución de los métodos pasan a los siguientes en forma de  parámetros.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: java; title: ; notranslate">
public class salesReport {

   private ReportType type;    

   public printOverviewReport () {

      Params params = this.getParams();
      String sql = this.generateSql(params);
      Result results = this.gelResults(sql);
      this.printReport(params, results);
      
   }

   ...
   
}
</pre></div>


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



<p>Este tipo de cohesión se produce cuando los elementos se relacionan mediante el uso del mismo conjunto de datos, o dicho de otra forma, agrupamos en una misma unidad de software los componentes que hacen uso de un mismo conjunto de datos. Esto ocurre independientemente de que no estén relacionados funcionalmente.</p>



<p>Es un tipo de cohesión más habitual en un nivel superior de abstracción, por ejemplo, incluyendo en un mismo paquete distintos componentes, aunque puede darse perfectamente a nivel de clase.</p>



<p>En el siguiente ejemplo vemos como una misma clase realiza tareas funcionalmente diferentes: operaciones aritméticas y operaciones trigonométricas. La cohesión se obtiene mediante  la utilización del mismo conjunto de datos.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: java; title: ; notranslate">
public class numberOperations {
    
   private float numberA;
   private float numberB;

   public void setNumberA(float number) {

      this.numberA = number;

   }

   public void setNumberB(float number) {

      this.numberB = number;

   }

   public float sum () {

      return numberA + numberB;
      
   }

   public float subtract () {

      return numberA - numberB;
      
   }

   public double triangleHypotenuse() {

      return Math.sqrt(Math.pow(numberA, 2) + Math.pow(numberB, 2));

   }

   public float rectangleArea() {

      return this.numberA * this.numberB;

   }
    
}
</pre></div>


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



<p>Es bastante similar a la cohesión secuencial en cuanto que es necesario el seguimiento de un riguroso orden de ejecución, pero a diferencia de ésta, no existe una comunicación mediante parámetros. </p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: java; title: ; notranslate">
public class salesReport {
    
   public assambly () {

      this.attachHeader();
      this.attachBody();
      this.attachFooter();
      
   }

   ...
   
}
</pre></div>


<h3 class="wp-block-heading">Cohesión lógica</h3>



<p>La relación entre los elementos es lógica en lugar de funcional. Por norma habitual los elementos pertenecen a la misma clase, las operaciones están relacionadas, pero las acciones que realizan varían significativamente en función de algún factor.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: java; title: ; notranslate">
public class displayItemProperties {
    
   item Item;

   public displayItemProperties (item Item) {

      this.Item = Item;
      this.display();
      
   }
   
   private void display() {

      switch (this.Item.getType()) {

         case &quot;shoes&quot; : {
            this.displayShoesProperties();
            break;
         }
         case &quot;shirt&quot; : {
            displayShirtProperties();
            break;
         }
         case &quot;trousers&quot; : {
            displayTrousersProperties();
            break;
         }

      }

   }

   ...
    
}
</pre></div>


<p>En este caso quizás sería más acertado crear una subclase por cada tipo de producto y sobrescribir el método display().</p>



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



<p>Es un tipo de cohesión nada recomendable, los elementos están cohesionados en base a un hecho que sucede en un determinado espacio de tiempo. Es habitual encontrar este tipo de cohesión en métodos de inicialización o finalización.</p>



<p>Con el siguiente ejemplo lo veremos muy claro, hemos incluido en la misma clase métodos funcionalmente muy dispares cuya única relación es que se ejecutan tras habernos autentificado en el sistema.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: java; title: ; notranslate">
public class postLogIn {

   private int userID;
    
   public postLogInActions () {

      this.logAuth();
      this.retrieveNewAlerts();
      this.retrieveHewMessages();
      this.retrieveStats();
      this.printDashboard();
     
   }

   ...
   
}
</pre></div>


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



<p>Es el peor tipo de cohesión. Los elementos no tienen ninguna relación conceptual ni de ningún otro tipo de los que hemos visto hasta ahora, tan solo están agrupados en la misma unidad de software. Al igual que en la cohesión lógica, el resultado será siempre una clase multifuncional con una cohesión muy baja en el mejor de los casos.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: java; title: ; notranslate">
public class posUtilities {
    
   public static float priceRound (float price) { ... }

   public static void updateTopBarPrice (float price) { ... }
    
   public static void cleanLogFiles () { ... }
    
   public static void reindexDb() { ... }

}
</pre></div>




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



<p>Lograr la cohesión a nivel de clase es relativamente sencillo, pero conseguir una clase funcionalmente cohesionada es algo más complicado y requiere de un mayor esfuerzo en la fase de diseño del software.</p>



<p>No obstante, ese esfuerzo extra invertido para conseguirlo se verá recompensado rápidamente, contribuyendo a evitar comprometernos con una <a href="https://blog.ahierro.es/deuda-tecnologica-o-deuda-tecnica/">deuda tecnológica </a>que nos obligue a pagar intereses en el futuro.</p>



<h2 class="wp-block-heading">Créditos, referencias y artículos relacionados</h2>



<ul class="wp-block-list"><li><a rel="noreferrer noopener" aria-label="Imagen de portada Manfred Steger (abre en una nueva pestaña)" href="https://pixabay.com/users/manfredsteger-1848497/" target="_blank">Imagen de portada Manfred Steger</a></li><li><a href="https://blog.ahierro.es/cohesion-y-acoplamiento/">Cohesión y acoplamiento</a></li><li><a href="https://blog.ahierro.es/deuda-tecnologica-o-deuda-tecnica/">Deuda tecnológica o deuda técnica</a> </li><li><a href="https://blog.ahierro.es/refactorizacion-de-codigo/">Refactorización de código</a></li><li><a href="https://blog.ahierro.es/a-que-huele-el-codigo-fuente/">¿A qué huele el código fuente?</a> </li></ul>La entrada <a href="https://blog.ahierro.es/tipos-de-cohesion/">Tipos de cohesión</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.ahierro.es/tipos-de-cohesion/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Cohesión y acoplamiento</title>
		<link>https://blog.ahierro.es/cohesion-y-acoplamiento/</link>
					<comments>https://blog.ahierro.es/cohesion-y-acoplamiento/#comments</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Mon, 08 Jul 2019 05:23:28 +0000</pubDate>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[acoplamiento]]></category>
		<category><![CDATA[ćohesión]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[teoría]]></category>
		<guid isPermaLink="false">https://blog.ahierro.es/?p=1397</guid>

					<description><![CDATA[<p>Obviando la entrada Backup de base de datos MySQL con PHP, que podemos verla como un gris tirando a negro, hace ya más de dos meses que no escribo nada sobre programación. Así que para ponerle fin a esta pobre racha abordaremos dos conceptos de imprescindible conocimiento relativos a la programación orientada a objetos. Nos &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/cohesion-y-acoplamiento/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "Cohesión y acoplamiento"</span></a></p>
La entrada <a href="https://blog.ahierro.es/cohesion-y-acoplamiento/">Cohesión y acoplamiento</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></description>
										<content:encoded><![CDATA[<p>Obviando la entrada <a href="https://blog.ahierro.es/backup-de-base-de-datos-mysql-con-php/">Backup de base de datos MySQL con PHP</a>, que podemos verla como un gris tirando a negro, hace ya más de dos meses que no escribo nada sobre programación. Así que para ponerle fin a esta pobre racha abordaremos dos conceptos de imprescindible conocimiento relativos a la  programación orientada a objetos. Nos referimos a la cohesión y el acoplamiento.</p>


<div class="wp-block-image">
<figure class="aligncenter is-resized"><img loading="lazy" decoding="async" src="https://blog.ahierro.es/wp-content/uploads/2019/06/cohesion.png" alt="Cohesión" class="wp-image-1309" width="650" height="438" srcset="https://blog.ahierro.es/wp-content/uploads/2019/06/cohesion.png 650w, https://blog.ahierro.es/wp-content/uploads/2019/06/cohesion-300x202.png 300w" sizes="auto, (max-width: 650px) 100vw, 650px" /></figure></div>


<span id="more-1397"></span>



<p>A pesar de ser dos conceptos bien diferenciados, es muy habitual que al buscar información sobre la cohesión acabemos encontrando también información sobre el acoplamiento y viceversa. El motivo es que son dos conceptos que guardan una gran relación de complementariedad entre si. En esta entrada mantendremos ese mismo planteamiento y los abordaremos juntos.</p>



<p>Y antes de avanzar con la lectura, es importante puntualizar que aunque la cohesión y  el acoplamiento pueden darse a distintos niveles, en esta ocasión analizaremos ambos conceptos única y exclusivamente a nivel de clase. Así que veamos el índice y vayamos al lío.</p>



<h2 class="wp-block-heading">Qué son la cohesión y el acoplamiento</h2>



<p>Cohesión y acoplamiento son dos conceptos distintos de gran importancia en el desarrollo de código de calidad, y están íntimamente ligados con el diseño del software y con la programación orienta a objetos. Veamoslos uno a uno:</p>



<h3 class="wp-block-heading">Qué es la cohesión</h3>



<p>La cohesión nos indica el grado de relación existente entre los distintos elementos de una clase. Una clase tendrá una cohesión alta cuando todos sus métodos estén relacionados entre si, bien mediante llamadas entre ellos o bien mediante el uso de variables cuyo ámbito se encuentre a nivel de clase. Y esto suele ocurrir cuando una clase realiza una única tarea.</p>



<p>Como habras podido intuir, cuanto más alta sea la cohesión mejor.</p>





<h3 class="wp-block-heading">Qué es el acoplamiento</h3>



<p>Y si la cohesión trata sobre la relación existente entre los elementos de la propia clase, el acoplamiento lo hace sobre el nivel de dependencia de la clase con respecto a otros elementos externos. Por lo tanto, diremos que una clase tiene un nivel de acoplamiento alto cuan hace uso en gran medida de otros componentes.</p>



<p>Nuestro objetivo será siempre construir clases con un nivel de acoplamiento bajo.</p>



<h2 class="wp-block-heading">Beneficios de una alta cohesión y un bajo acoplamiento</h2>



<p>Las ventajas de una clase cohesiva con bajo acoplamiento son muchas, pero podemos resumirlas como la mejora de la encapsulación, con todos los beneficios que ello conlleva.</p>



<p>Otro aspecto más a destacar es que el propio hecho de buscar la cohesión y evitar el acoplamiento ayuda a cumplir otros principios como SOLID o KISS, de los que probablemente escriba más adelante.</p>



<p>De cualquier forma, al ser dos conceptos distintos analizaremos sus beneficios por separado, aunque ya te adelanto que los podríamos haber tratado en conjunto, en unos instantes lo comprenderás.</p>



<h3 class="wp-block-heading">Beneficios de una cohesión alta</h3>



<p>Los principales beneficios de desarrollar elementos con un alto grado de cohesión son:</p>



<ul class="wp-block-list"><li>Mejora de la mantenibilidad del código. Al realizar una única tarea, los cambios realizados sobre la propia clase afectarán en menor medida al código que hace uso de ella.</li><li>Mejora de la lectura y comprensión. Es mucho más sencillo leer y entender una clase con una única responsabilidad, pues será más pequeña y simple.</li></ul>



<h3 class="wp-block-heading">Beneficios de un bajo acoplamiento</h3>



<p>En cuanto al acoplamiento, los beneficios de desarrollar una clase con bajo acoplamiento son:</p>



<ul class="wp-block-list"><li>Mejora de la facilidad de reutilización. Al no tener dependencia de elementos externos será muchos más sencillo portar nuestra clase a otros componentes.</li><li>Mejora de la mantenibilidad. En este caso por partida doble: en primer lugar los cambios realizados en la clase no estarán condicionados por requisitos de estructuras de software externas, y en segundo lugar porque al no tener dependencias externas no se verá afectado por modificaciones en éstas.</li><li>Mayor facilidad de comprensión. Pues no tendremos que buscar ni comprender otros módulos para aprender cómo funciona el que nos interesa. </li></ul>



<h2 class="wp-block-heading">Olores en el código</h2>



<p>Si recordáis la entrada <a href="https://blog.ahierro.es/a-que-huele-el-codigo-fuente/"> ¿A qué huele el código fuente?</a>, hacíamos referencia a múltiples motivos que propiciaban la aparición de olores en el código fuente.</p>



<p>Pues bien, algunos de esos olores están estrechamente ligados con un bajo nivel de cohesión  y/o con un alto nivel de acoplamiento: las clases multifuncionales, las clases brown dispatcher, o la envidia de funcionalidad son algunos ejemplos.</p>



<p>Como decíamos al comienzo del artículo, la cohesión y el acoplamiento tienen una gran importancia en el desarrollo de software de calidad.</p>



<h2 class="wp-block-heading">Créditos y referencias</h2>



<ul class="wp-block-list"><li><a aria-label="Imagen de portada por truthseeker08 (abre en una nueva pestaña)" href="https://pixabay.com/users/truthseeker08-2411480/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=1917895" target="_blank" rel="noreferrer noopener">Imagen de portada por truthseeker08</a></li><li><a href="https://blog.ahierro.es/tipos-de-cohesion/">Tipos de cohesión</a></li><li><a href="https://blog.ahierro.es/deuda-tecnologica-o-deuda-tecnica/" title="Deuda tecnológica o deuda técnica">Deuda tecnológica</a></li><li><a href="https://blog.ahierro.es/refactorizacion-de-codigo/">Refactorización de código</a></li><li><a href="https://blog.ahierro.es/a-que-huele-el-codigo-fuente/">¿A qué huele el código fuente?</a> </li></ul>La entrada <a href="https://blog.ahierro.es/cohesion-y-acoplamiento/">Cohesión y acoplamiento</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.ahierro.es/cohesion-y-acoplamiento/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>Deuda tecnológica o deuda técnica</title>
		<link>https://blog.ahierro.es/deuda-tecnologica-o-deuda-tecnica/</link>
					<comments>https://blog.ahierro.es/deuda-tecnologica-o-deuda-tecnica/#respond</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Mon, 15 Apr 2019 06:07:33 +0000</pubDate>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[teoría]]></category>
		<guid isPermaLink="false">https://blog.ahierro.es/?p=434</guid>

					<description><![CDATA[<p>El concepto de deuda tecnológica, también conocida como deuda técnica, es muy similar al concepto tradicional de deuda económica. De la misma manera que cuando queremos acometer un proyecto para el que no tenemos fondos suficientes pedimos un crédito al banco y nos prestan un dinero que tendremos que devolver con intereses, en la deuda &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/deuda-tecnologica-o-deuda-tecnica/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "Deuda tecnológica o deuda técnica"</span></a></p>
La entrada <a href="https://blog.ahierro.es/deuda-tecnologica-o-deuda-tecnica/">Deuda tecnológica o deuda técnica</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></description>
										<content:encoded><![CDATA[<p>El concepto de deuda tecnológica, también conocida como deuda técnica, es muy similar al concepto tradicional de deuda económica. De la misma manera que cuando queremos acometer un proyecto para el que no tenemos fondos suficientes pedimos un crédito al banco y nos prestan un dinero que tendremos que devolver con intereses, en la deuda tecnológica también adquiriremos una deuda con nuestro código fuente que igualmente tendremos que saldar con intereses. </p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="650" height="438" src="https://blog.ahierro.es/wp-content/uploads/2019/04/deuda_tecnologica.png" alt="Deuda Tecnológica" class="wp-image-815" srcset="https://blog.ahierro.es/wp-content/uploads/2019/04/deuda_tecnologica.png 650w, https://blog.ahierro.es/wp-content/uploads/2019/04/deuda_tecnologica-300x202.png 300w" sizes="auto, (max-width: 650px) 100vw, 650px" /></figure>



<span id="more-434"></span>



<h2 class="wp-block-heading">La deuda</h2>



<p>Y si una deuda económica la adquirimos a cambio de dinero, la deuda tecnológica la adquirimos a cambio de tiempo, el tiempo que ahorraremos a costa de planificar plazos imposibles de cumplir, de escatimar recursos en los procesos de testeo y/o <a href="https://blog.ahierro.es/refactorizacion-de-codigo/">refactorizacion</a>, de no dedicar los recursos suficientes en el diseño inicial, o lo que es peor de no disponer de un diseño inicial, etc.</p>





<p>Es decir, adquiriremos una deuda al no hacer las cosas bien, y esto generalmente viene dado por dos motivos principales: </p>



<ol class="wp-block-list"><li>Omitir o reducir los recursos necesarios en las etapas fundamentales del proceso de desarrollo de software.</li><li>Existencia de una brecha de experiencia y/o conocimientos entre el equipo de desarrollo y el proyecto a ejecutar.</li></ol>



<p>Cierto es también que en ocasiones la deuda técnica simplemente la heredaremos al hacernos cargo de un proyecto ya iniciado, pero el origen del problema es el mismo.</p>



<h2 class="wp-block-heading">Los intereses</h2>



<p>Y con la deuda vienen los intereses en forma de aumento de la complejidad en la mantenibilidad de la aplicación, y se manifestarán principalmente de dos formas: </p>



<ol class="wp-block-list"><li>Aumento de la complejidad del desarrollo. Cuanto más avancemos en el proyecto más complicado se hará seguir  avanzando, invirtiendo mucho más tiempo del necesario en cualquier tipo cambio o nueva funcionalidad por pequeños que sean.</li><li>Incremento del número de errores. Lo que provocará que gastemos mucho tiempo subsanándolos en lugar de invertirlo en tareas que realmente aportan valor.</li></ol>



<p>Es posible incluso que cuando empecemos a hacer uso del crédito tengamos un periodo más o menos largo de carencia, pero es seguro que los intereses aparecerán, y en ningún caso nos libraremos de pagarlos </p>



<p>Además, en función de las condiciones en que hayamos adquirido la deuda, y sobre todo si no la vamos saldando y dejamos que crezca, pueden aparecer una serie de consecuencias entre las que destacar las relacionadas con las personas, que en el caso del desarrollo de software son los distintos colectivos relacionados con el proyecto:</p>



<ol class="wp-block-list"><li>El cliente se quejará por falta de fiabilidad debido al número de errores de la aplicación.</li><li>Los programadores se quejarán porque son consciente de que no se están empleando buenas prácticas, cosa que les impide hacer su trabajo adecuadamente.</li><li>Los jefes se quejarán por el bajo rendimiento del equipo de desarrollo.</li></ol>



<p>Una situación desagradable para todos y que deberemos evitar a toda costa.</p>



<h2 class="wp-block-heading">Cómo evitar la deuda tecnológica</h2>



<p>La buena noticia es que adquirir o no una deuda tecnológica, en muchas de las situaciones depende de nosotros y de nuestro equipo, y aunque no existe una receta mágica para evitarla, podemos tener en cuenta una serie de recomendaciones que contribuirán a evitarla.</p>





<p>En primer lugar hagamos una buena planificación y priorización. Si tenemos que adquirir una deuda que no sea porque hemos planificado mal, o lo que es peor aún, no adquiramos una deuda por mala planificación cuando además tenemos los recursos necesarios.</p>



<p>Y en el caso de no disponer de los recursos suficientes, debemos tener en cuenta que cada tarea conlleva su tiempo, que no podemos encajar cuatro en el hueco de tres y que si la planificación se complica siempre podemos:</p>



<ol class="wp-block-list"><li>Sumar más recursos al proyecto</li><li>Ampliar los plazos</li><li>Acotar el alcance</li></ol>



<p>En segundo lugar creemos unas condiciones favorables para el desarrollo de código de calidad. </p>



<ol class="wp-block-list"><li>Establezcamos una metodología de desarrollo: Scrum, Kanban, Agile, Lean, en cascada o cualquier otra, y cumplámosla a rajatabla.</li><li>Asegurémonos de disponer de un circuito de <a href="https://blog.ahierro.es/entornos-en-el-desarrollo-de-software/">entornos de desarrollo</a>  adecuado.</li><li>Escribamos código de calidad. Un <a href="https://blog.ahierro.es/a-que-huele-el-codigo-fuente/">código limpio y libre de olores</a> favorecerá el mantenimiento y el crecimiento de nuestra aplicación.</li><li>Promovamos la <a href="https://blog.ahierro.es/refactorizacion-de-codigo/">refactoriza del código fuente</a>. Recuerda la regla de los Boys Scouts, dejar el campo más limpio de lo que lo encontraste.</li></ol>



<p>Preocupemonos de generar un buen ambiente de trabajo, hagamos que sea distendido, fomentemos las tareas en equipo y la participación.</p>



<p>Y si estas recomendaciones no son suficiente, siempre tenemos dos opciones más:</p>



<ol class="wp-block-list"><li>Adquirir una deuda, nos guste o no en ocasiones es necesario, en el siguiente apartado desarrollamos este planteamiento.</li><li>No ejecutar el proyecto. A veces decir no puede ser la mejor solución, no siempre todas las propuestas son viables, o simplemente puede la brecha entre recursos disponibles y recursos necesarios sea insalvable. Si es el caso, asegurémonos de haber analizado todas las posibilidades primero, seamos asertivos y sobre todo no usemos este recurso como excusa para librarnos de proyectos que no nos interesan.</li></ol>



<h2 class="wp-block-heading">Cuándo adquirir una deuda tecnológica</h2>



<p>La respuesta sencilla sería nunca, pero como todos sabemos la realidad no es siempre tan favorable cómo nos gustaría, y el desarrollo de software no es una excepción. Por norma general, el desarrollo de software atiende a cuestiones de la vida cotidiana, y en un alto porcentaje de las situaciones a cuestiones relacionadas con el ámbito laboral, un ámbito muy exigente que requiere versatilidad e inmediatez.</p>





<p>Así que en ocasiones la necesidad de llegar a una fecha concreta con ciertas funcionalidades es imperativa. La adaptación del software a una nueva ley, la pérdida de la oportunidad si no llegamos a la fecha equis con aquella funcionalidad o dar solución a una problemática que por factores circunstanciales se ha convertido en crítica son algunas de los motivos que pueden hacernos decidir adquirir una deuda.</p>



<p>Lo realmente importante si adquirimos una deuda es ser conscientes de que lo estamos haciendo, comunicarlo a las partes implicadas y tener claro que vamos a tener que saldarla, obteniendo el compromiso tanto del equipo como de los superiores.</p>



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



<p>En esta entrada hemos visto que es la deuda tecnológica, cómo nos afecta y algunos consejos sobre cómo evitarla. Nos queda pendiente ver las estrategias que podemos seguir para saldarla, pero eso da para otra entrada.</p>



<p>Si te has sentido identificado al leer este artículo no pienses que eres uno de los pocos desafortunados que la sufren, lamentablemente y en contra de lo que cabría esperar,  la deuda tecnológica es una situación mucho más generalizada de lo que imaginamos. Una gran cantidad de compañías se enfrentan a este fenómeno a diario, llegando a convertirse en un factor crítico en algunas de ellas.</p>



<p>Afortunadamente la industria del desarrollo de software ha vivido una evolución vertiginosa en los últimos años, y algunos de los aspectos que han generado más interés entre la comunidad han sido los relacionados con las técnicas de desarrollo de código de calidad, así que aprovechemos esta concienciación global y contribuyamos a desarrollar un código de mayor calidad.</p>



<h2 class="wp-block-heading">Créditos, referencias y artículos relacionados</h2>



<ul class="wp-block-list"><li><a href="https://blog.ahierro.es/guia-del-buen-programador/">Guía del buen programador</a></li><li><a href="https://blog.ahierro.es/a-que-huele-el-codigo-fuente/">¿A qué huele el código fuente</a></li><li><a href="https://blog.ahierro.es/patrones-de-diseno-de-software/">Patrones de diseño de software</a></li><li><a href="https://blog.ahierro.es/refactorizacion-de-codigo/">Refactorización de código</a></li><li><a href="https://blog.ahierro.es/cohesion-y-acoplamiento/">Cohesión y acoplamiento</a></li><li><a href="https://blog.ahierro.es/deuda-tecnologica-o-deuda-tecnica/">Deuda tecnológica o deuda técnica</a></li></ul>La entrada <a href="https://blog.ahierro.es/deuda-tecnologica-o-deuda-tecnica/">Deuda tecnológica o deuda técnica</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.ahierro.es/deuda-tecnologica-o-deuda-tecnica/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Entornos en el desarrollo de software</title>
		<link>https://blog.ahierro.es/entornos-en-el-desarrollo-de-software/</link>
					<comments>https://blog.ahierro.es/entornos-en-el-desarrollo-de-software/#respond</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Mon, 11 Mar 2019 19:30:20 +0000</pubDate>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[teoría]]></category>
		<guid isPermaLink="false">https://www.ahierro.es/?p=116</guid>

					<description><![CDATA[<p>En lo que a desarrollo de software se refiere, como en casi cualquier otra profesión, disponer de un entorno de trabajo adecuado puede marcar la diferencia entre obtener un gran resultado o que nuestro trabajo sea un completo desastre. Al respecto de esto, uno de los aspectos al que más atención deberemos de prestar es &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/entornos-en-el-desarrollo-de-software/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "Entornos en el desarrollo de software"</span></a></p>
La entrada <a href="https://blog.ahierro.es/entornos-en-el-desarrollo-de-software/">Entornos en el desarrollo de software</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></description>
										<content:encoded><![CDATA[<p>En lo que a desarrollo de software se refiere, como en casi cualquier otra profesión, disponer de un entorno de trabajo adecuado puede marcar la diferencia entre obtener un gran resultado o que nuestro trabajo sea un completo desastre.</p>



<p>Al respecto de esto, uno de los aspectos al que más atención deberemos de prestar es al diseño de los distintos entornos que participan en el ciclo de vida del software y a los procedimientos que definen el flujo de trabajo entre ellos.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="650" height="365" src="https://www.ahierro.es/wp-content/uploads/2018/11/design_flow.jpg" alt="Diseño flujo" class="wp-image-117" srcset="https://blog.ahierro.es/wp-content/uploads/2018/11/design_flow.jpg 650w, https://blog.ahierro.es/wp-content/uploads/2018/11/design_flow-300x168.jpg 300w" sizes="auto, (max-width: 650px) 100vw, 650px" /></figure>



<span id="more-116"></span>



<p>Y para que todos tengamos en mente el mismo concepto de la palabra entorno, lo definiremos cómo un sistema formado por hardware y software, así como la configuración, circunstancias y estados relativos a él. En el diseño de nuestro procedimiento podemos establecer varios entornos con distintos fines por los que debe pasar el software durante su ciclo de vida antes de llegar al definitivo entorno de producción.</p>



<h3 class="wp-block-heading">Un diseño para cada necesidad</h3>



<p>El número de etapas, los procesos que las definen y los softwares que utilizamos pueden variar en función de las características de cada proyecto y la idiosincrasia de cada compañía.</p>





<p>Algunos de los factores que pueden influir a la hora de decidir que entornos incluiremos en nuestro flujo de trabajo y que procedimientos los definirán son el tamaño del proyecto, la complejidad del software, las tecnologías utilizadas para el desarrollo, la cantidad de desarrolladores implicados en el proyecto, la metodología de desarrollo elegida o la criticidad del software.</p>



<h3 class="wp-block-heading">Los tipos de entorno</h3>



<p>En esta entrada repasaremos un conjunto de entornos bastante común, muy completo y que funciona bien en el desarrollo de aplicaciones web con equipos pequeños o medianos y&nbsp; metodologías de desarrollo ágiles. Esta configuración es solo un ejemplo, es perfectamente adaptable a otras necesidades y trasladable otros proyectos con similares (e incluso distintas) características.</p>



<h4 class="wp-block-heading">Entorno de desarrollo</h4>



<p>Es el lugar dónde programamos, lo más habitual es que esté localizado en la propia máquina de cada desarrollador de forma que varias personas pueden estar trabajando en un mismo proyecto a la vez sin molestarse.</p>



<p>Para minimizar incidencias en etapas posteriores es recomendable que este entorno disponga de un software y una configuración lo más parecida posible a la que nos encontraremos en el entorno de producción. Situaciones como desarrollar sobre php 7.2 y que el entorno de producción se encuentre corriendo php 5.6 o hacerlo sobre windows con el driver «x» de sql server y que el servidor de producción sea una máquina linux con el driver «y» suelen acabar generando muchos quebraderos de cabeza fácilmente evitables.</p>



<p>Solo cuando el desarrollador completa un código perfectamente funcional e integrable en el entorno de pre-producción y tras realizar las pruebas necesarias para asegurar que el software desarrollado tiene la estabilidad suficiente&nbsp; se podrá pasar al entorno de integración continua.</p>



<h4 class="wp-block-heading">Entorno de integración continua</h4>



<p>Este entorno cumple un triple objetivo:</p>



<ol class="wp-block-list"><li>Integrar el trabajo de los diferentes desarrolladores en un repositorio central, dando como resultado una versión del código actualizada y consolidada.</li><li>Automatizar las pruebas de integración y su validación antes de ser movido al siguiente entorno.</li><li>Enviar el código al siguiente entorno si las pruebas han sido superadas satisfactoriamente.</li></ol>



<p>La forma más habitual de implementar este entorno es mediante un software de control de versiones, dónde Git es la opción más popular. Una vez consolidado el código utilizamos los hooks para ejecutar las pruebas definidas, notificar los resultados y enviar a pre-producción si es preciso.</p>



<h4 class="wp-block-heading">Entorno de pre-producción</h4>



<p>Una vez superadas las pruebas de integración en el entorno de integración continua, el código será movido al entorno de pre-producción. Aquí se realizarán las pruebas de validación al conjunto del software, teniendo como objetivo localizar cualquier error antes de llegar al entorno de producción y evitar así los problemas derivados de ellos.</p>





<p>Este entorno será completamente funcional a nivel de usuario, y si hemos recomendado que el entorno de desarrollo fuese lo más similar posible al entorno de producción, aquí se convierte en algo crítico. Tanto el software, dónde no solo hablamos de las aplicaciones si no también de sus versiones y configuraciones, como el hardware y los sets de datos. Cuanto mayor sea la similitud con el entorno de producción menor será el número de&nbsp; incidencias que nos encontremos cuando el software esté en productivo.</p>



<h4 class="wp-block-heading">Entorno de demo</h4>



<p>Es un entorno muy similar al de pre-producción, y por lo tanto al de producción. Lo habilitamos para que el cliente final pueda probar la nueva aplicación o las modificaciones o correcciones realizadas a la aplicación existente. De aquí extraeremos las impresiones del cliente y localizaremos de una forma temprana posibles carencias en los requisitos iniciales, en el diseño o en su implementación.</p>



<p>Si en nuestro proyecto la validación del cliente es necesaria, no disponer de este entorno puede suponer que el cliente valide contra el entorno de pre-producción (o mucho peor aun contra el de desarrollo o de producción), en cuyo caso pueden darse varias situaciones:</p>



<ol class="wp-block-list"><li>Que todo salga maravillosamente bien, improbable pero posible.</li><li>Que una nueva actualización en el entorno de pre-producción, esté o no relacionada con la funcionalidad que estamos probando, provoque errores y demos la validación por fallida.</li><li>Que congelemos la actualización del entorno de pre-producción incurriendo en molestias y dificultades extra para el equipo de desarrollo y retrasando las fechas del proyecto.</li></ol>



<p>Estos problemas se verán aumentados si trabajamos en base a una metodología de desarrollo ágil con entregas iterativas.</p>



<h4 class="wp-block-heading">Entorno de producción</h4>



<p>Es la culminación de nuestro esfuerzo, el entorno dónde se verán las virtudes y defectos de nuestro trabajo, el objeto por el que seremos valorados. Los cuatro entornos anteriores están pensados para llegar aquí de la forma más eficiente posible garantizando la fiabilidad, y la diferencia de calidad sobre el resultado final puede ser realmente significativa significativa de disponer de un circuito de entornos adecuado a no disponer de él.</p>



<h3 class="wp-block-heading">Las pruebas</h3>



<p>Uno de los aspectos más significativos de este circuito es que cada entorno debe tener su propio tipo validación y por lo tanto de pruebas. Lo más habitual es realizar test unitarios en el entorno de desarrollo, test de integración en el entorno de integración continua y pruebas de validación sobre el conjunto de la aplicación en el entorno de pre-producción.</p>





<p>Para los test unitarios existen varias herramientas entre las que destacar <a href="https://phpunit.de/" target="_blank" rel="noopener noreferrer">PHPUnit</a>, aunque si usamos frameworks como Laravel, el propio framework ya nos proporciona herramientas para realizar este tipo de pruebas. A partir de ahí existe un amplio abanico de herramientas para ayudarnos a realizar todo tipo de comprobaciones, en la página <a href="https://phpqa.io/index.html" target="_blank" rel="noopener noreferrer">PHP Quality Assurance</a> podemos encontrar algunas.</p>



<p>Conclusión</p>



<p>Concedamos la importancia que se merece al diseño y la implementación de los entornos implicados en el desarrollo del software, de ellos dependerán en gran medida la calidad de los resultados y la velocidad de desarrollo.</p>



<p>Y como siempre me gustaría conocer sobre tu experiencia, ¿trabajas sobre un circuito con más o menos entornos? ¿qué tipo de pruebas realizas? ¿Con qué softwares?</p>



<h2 class="wp-block-heading">Créditos, referencias y artículos relacionados</h2>



<ul class="wp-block-list"><li><a href="https://blog.ahierro.es/guia-del-buen-programador/">Guía del buen programador</a></li><li><a href="https://blog.ahierro.es/a-que-huele-el-codigo-fuente/">¿A qué huele el código fuente</a></li><li><a href="https://blog.ahierro.es/patrones-de-diseno-de-software/">Patrones de diseño de software</a></li><li><a href="https://blog.ahierro.es/refactorizacion-de-codigo/">Refactorización de código</a></li><li><a href="https://blog.ahierro.es/cohesion-y-acoplamiento/">Cohesión y acoplamiento</a></li><li><a href="https://blog.ahierro.es/deuda-tecnologica-o-deuda-tecnica/">Deuda tecnológica o deuda técnica</a></li></ul>La entrada <a href="https://blog.ahierro.es/entornos-en-el-desarrollo-de-software/">Entornos en el desarrollo de software</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.ahierro.es/entornos-en-el-desarrollo-de-software/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Nombres y comentarios en la programación</title>
		<link>https://blog.ahierro.es/nombres-y-comentarios-en-la-programacion/</link>
					<comments>https://blog.ahierro.es/nombres-y-comentarios-en-la-programacion/#respond</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Fri, 01 Mar 2019 06:22:11 +0000</pubDate>
				<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[comentarios]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[teoría]]></category>
		<guid isPermaLink="false">https://blog.ahierro.es/?p=547</guid>

					<description><![CDATA[<p>Formación, práctica y constancia son tres de los pilares básicos en los que se sustenta la evolución de cada desarrollador. En ocasiones debemos aprender conceptos complejos de asimilar o de aplicar como parte de este proceso. Sin embargo, en otras ocasiones, son sutiles detalles los que nos hacen mejorar. La elección de los nombres de &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/nombres-y-comentarios-en-la-programacion/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "Nombres y comentarios en la programación"</span></a></p>
La entrada <a href="https://blog.ahierro.es/nombres-y-comentarios-en-la-programacion/">Nombres y comentarios en la programación</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></description>
										<content:encoded><![CDATA[<p>Formación, práctica y constancia son tres de los pilares básicos en los que se sustenta la evolución de cada desarrollador. En ocasiones debemos aprender conceptos complejos de asimilar o de aplicar como parte de este proceso. Sin embargo, en otras ocasiones, son sutiles detalles los que nos hacen mejorar.</p>



<p>La elección de los nombres de los distintos elementos que intervienen en la programación es una de esas tareas que si bien no es técnicamente compleja, puede suponer un antes y un después en cuanto a la calidad del código que generamos.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="650" height="438" src="https://blog.ahierro.es/wp-content/uploads/2019/02/comentarios_por_nombres.png" alt="Comentarios y nombres de elementos" class="wp-image-608" srcset="https://blog.ahierro.es/wp-content/uploads/2019/02/comentarios_por_nombres.png 650w, https://blog.ahierro.es/wp-content/uploads/2019/02/comentarios_por_nombres-300x202.png 300w" sizes="auto, (max-width: 650px) 100vw, 650px" /></figure>



<span id="more-547"></span>



<p>En esta entrada veremos cómo la elección de nombres adecuados puede contribuir a reducir el número de comentarios necesarios en el código fuente, y por lo tanto a mejorar su limpieza, comprensión y mantenimiento.</p>



<p>Este artículo es el cuarto de una serie de entradas dedicados a los comentarios y cuyo índice podemos encontrar en la entrada <a href="https://blog.ahierro.es/comentarios-en-programacion-introduccion/">Introducción a los comentarios en programación</a>. Así que si estás interesado en mejorar no solo tus comentarios, si no tu programación en general, te recomiendo que leas los tres anteriores: <a href="https://blog.ahierro.es/comentarios-en-programacion-introduccion/">Introducción a los comentarios en programación</a>, <a href="https://blog.ahierro.es/comentarios-a-evitar-al-programar/">Comentarios a evitar al programar</a>, y <a href="https://blog.ahierro.es/mantenimiento-de-comentarios-en-la-programacion/">Mantenimiento de comentarios en la programación</a>.</p>



<h3 class="wp-block-heading">Nombres descriptivos</h3>



<p>Es&nbsp; bastante común ver funciones o métodos precedidos de un comentario que explica cual es su cometido. Esta situación por si misma no es mala siempre que ayude a entender el código a otros desarrolladores. Sin embargo, en muchas ocasiones la elección de un nombre adecuado puede ser suficientemente descriptiva como para evitar el comentario.</p>





<p>Veamos un ejemplo inspirado en una aplicación TPV (Terminal Punto de Venta):</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: java; title: ; notranslate">
// Devuelve el precio de un producto valorando descuentos y
// rebajas para un cliente autentificado
private bool getPrice(int itemId, int userId) {
{
   ...
}
</pre></div>


<p>Como vemos el nombre del método es descriptivo hasta cierto punto, motivo por el que el comentario ayuda a complementarlo. Pero esto mismo podríamos hacerlo utilizando un nombre más adecuado:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: java; title: ; notranslate">
private bool getAuthentificatedCustomerFinalPrice(int itemId, int userId) {
{
   ...
}
</pre></div>


<p>En este segundo ejemplo al leer el nombre del método sabemos exactamente que esperar de él, así que no es necesario el comentario.</p>



<p>Hemos podido utilizar esta técnica sin ningún problema porque cumplimos la regla que establece que cada función debe hacer una única cosa. Si no la cumplimos e intentamos escoger un nombre descriptivo nos encontraremos con nombres excesivamente largos. Veamos un ejemplo siguiendo el hilo anterior pero en esta ocasión el método realizará dos tareas:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: java; title: ; notranslate">
private bool identifyIfCustomerIsLoggedAngGetFinalPrice(int itemId, int userId) {
{
   ...
}
</pre></div>


<p>Cuantas más cosas haga el método, más largo y difícil de elegir será el nombre y esto se traducirá en un código poco legible y difícil de trabajar, volviendo a ser necesarios los comentarios.</p>



<p>Y por supuesto que esta técnica es totalmente aplicable a variables y constantes, escogiendo nombre adecuados eliminaremos la necesidad de explicar el objetivo de las mismas con comentarios. No es lo mismo usar nombres poco descriptivos y acompañarlos de un comentario en la declaración:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: java; title: ; notranslate">
// Coste de reposición de artículo
private float cost;
</pre></div>


<p>Que utilizar nombre descriptivos, prescindir de los comentarios y saber que contiene exactamente la variable en cualquier punto del programa:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: java; title: ; notranslate">
private float supplierPriceOfList;
</pre></div>


<h3 class="wp-block-heading">Sustituir un pedazo código por una función</h3>



<p>En ocasiones explicamos pedazos de código porque queremos transmitir nuestra intención, porque ayuda a la comprensión de un algoritmo con cierta complejidad, porque nos parece que es engorroso de leer y un comentario lo facilitaría, etc. Pongamos un ejemplo muy sencillo, de nuevo sobre un programa TPV:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: java; title: ; notranslate">
// Comprobamos si hemos introducido un descuento manual 
if(
   (item.price  &gt; item.proposedPrice)  &amp;&amp;
   (discount.reason is null) &amp;&amp;
   (item.price != item.proposedPrice * customer.discount)
)
{ 
   ... 
}
</pre></div>


<p>El programador que ha escrito este código (yo) ha querido dejar claro que las tres condiciones que ha escrito tenían como intención averiguar si se había introducido un descuento manual.</p>



<p>Pero quizás sea mucho más claro leer el código de esta manera:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: java; title: ; notranslate">
if(manualDiscountIsApplyed())  
{
   ...  
}
</pre></div>


<p>Y para ello solo tenemos que encapsular ese bloque lógico en otro método con un nombre adecuado:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: php; title: ; notranslate">
private bool manualDiscountIsApplyed()  
{  
   bool discountIsApplied = false;  
   if(  
      (item.price &gt; item.proposedPrice) &amp;&amp;
      (discount.reason is null) &amp;&amp;
      (item.price != item.proposedPrice * customer.discount)  
   )  
   {  
      discountIsApplied = true;  
   }  
   return discountIsApplied;  
}  
</pre></div>


<p>Aunque si lo pensamos un instante lo único que hemos hecho ha sido un uso correcto de la programación orientada a objetos, el resto ha sido de nuevo la elección de un buen nombre.</p>



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



<p>En el desarrollo de software, como en prácticamente todo, cuanto más simple y breve sea la solución, mejor. Lejos de de extender y adornar el código debemos procurar sintetizar y aclarar todo lo posible de forma que sea sencillo de comprender por si mismo, y para ello una elección correcta de nombres es fundamental.</p>



<p>Y como es habitual, sería muy interesante conocer tu punto de vista, ¿qué otra técnica utilizas tú para mejorar la legibilidad del código y evitar comentarios innecesarios? Comparte tu experiencia en un comentario.</p>La entrada <a href="https://blog.ahierro.es/nombres-y-comentarios-en-la-programacion/">Nombres y comentarios en la programación</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.ahierro.es/nombres-y-comentarios-en-la-programacion/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Mantenimiento de comentarios en la programación</title>
		<link>https://blog.ahierro.es/mantenimiento-de-comentarios-en-la-programacion/</link>
					<comments>https://blog.ahierro.es/mantenimiento-de-comentarios-en-la-programacion/#respond</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Mon, 25 Feb 2019 07:30:33 +0000</pubDate>
				<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[comentarios]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[teoría]]></category>
		<guid isPermaLink="false">https://blog.ahierro.es/?p=545</guid>

					<description><![CDATA[<p>Uno de los aspectos más delicados con respecto a los comentarios es la limpieza. Al contrario de lo que sucede con el propio código fuente, los comentarios no son procesados por el compilador, lo que quiere decir que éste no nos avisará si hay algo incorrecto o poco fiel con respecto a la realidad. En &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/mantenimiento-de-comentarios-en-la-programacion/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "Mantenimiento de comentarios en la programación"</span></a></p>
La entrada <a href="https://blog.ahierro.es/mantenimiento-de-comentarios-en-la-programacion/">Mantenimiento de comentarios en la programación</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></description>
										<content:encoded><![CDATA[<p>Uno de los aspectos más delicados con respecto a los comentarios es la limpieza. Al contrario de lo que sucede con el propio código fuente, los comentarios no son procesados por el compilador, lo que quiere decir que éste no nos avisará si hay algo incorrecto o poco fiel con respecto a la realidad.</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-606" src="https://blog.ahierro.es/wp-content/uploads/2019/02/comentarios_mantenimiento.png" alt="Comentarios en programación, mantenimiento" width="650" height="438" srcset="https://blog.ahierro.es/wp-content/uploads/2019/02/comentarios_mantenimiento.png 650w, https://blog.ahierro.es/wp-content/uploads/2019/02/comentarios_mantenimiento-300x202.png 300w" sizes="auto, (max-width: 650px) 100vw, 650px" /></p>
<p><span id="more-545"></span></p>
<p>En multitud ocasiones he visto y he escrito comentarios que ensucian el código y que en el mejor de los casos solo son una molestia visual. En cambio, otras ocasiones, me he tropezado con comentarios que pueden llegar a confundir al programador, sembrar la duda en él o hacer que gaste más tiempo del necesario intentando comprender la discrepancia entre el comentario y el código.</p>
<p>Esto ocurre principalmente porque al igual que sucede con el resto del código fuente, los comentarios requieren de un mantenimiento. Y para conseguirlo es necesario que el desarrollador sea mucho más estricto que con el resto del código: si el compilador no alerta tendremos que ser nosotros quien garanticemos que son correctos. Y el problema radica en que incluso si los comentarios son un verdadero desastre, si el código es correcto el programa funcionará, y muchas veces eso nos basta.</p>
<p>[the_ad id=»1018&#8243;]</p>
<p>Así que en esta entrada trataremos algunos aspectos que hemos de tener en cuenta a la hora de mantener nuestros comentarios. Este artículo pertenece a una serie cuyo índice podemos encontrar en la entrada <a href="https://blog.ahierro.es/comentarios-en-programacion-introduccion/">Introducción a los comentarios en programación</a>.</p>
<h3>Comentarios a evitar</h3>
<p>Hace una semana publicamos una entrada titulada <a href="https://blog.ahierro.es/comentarios-a-evitar-al-programar/">Comentarios a evitar al programar</a>.  En ella hablábamos de los comentarios que no deberíamos hacer que perduren en el código, y podemos decir que éste es el primer paso que debemos de tomar a la hora de mantener los comentarios. Haciendo un breve resumen hablamos de:</p>
<ol>
<li>Código fuente comentado</li>
<li>Identificación de modificaciones</li>
<li>Código para debugar</li>
<li>ToDos y notas de tareas pendientes</li>
</ol>
<p>Si todavía no has leído este artículo te recomiendo que lo hagas antes de continuar con el siguiente punto.</p>
<h3>Copy &amp; Paste</h3>
<p>¿Cuantas veces has copiado y pegado un fragmento de código en el que existen comentarios? Pongamos el ejemplo de un método cualquiera, queremos crear otro bastante similar  y optamos por copiar y pegar en lugar de escribir desde cero. Acto seguido modificamos el nuevo método, pero, ¿cuantas veces hemos dejado un comentario sin modificar haciendo referencia al funcionamiento del método original?</p>
<p>Como primer planteamiento me preguntaría si el comentario es realmente necesario, pues si no le has dado la importancia adecuada quizás es simplemente porque no la necesita y puede ser eliminado. Pero en caso de que deba ser mantenido no olvides actualizarlo si es necesario. De lo contrario estarás mintiendo al programador que lo lea.</p>
<h3>Modificaciones en el código</h3>
<p>Lo más habitual cuando modificamos unos fuentes es que estemos alterando de una u otra manera su funcionamiento. Si existe un comentario realizado sobre el bloque de código que estamos modificando, deberemos de verificar que tras la modificación el comentario sigue siendo tan necesario y válido como era antes de cambiar una sola línea. De lo contrario volveríamos a tener un comentario erróneo.</p>
<p>Imaginemos que tenemos un método userIsAuthenticated() que devuelve la ID de un usuario en caso de que esté autentificado y 0 en caso de que no lo esté.  Imaginemos que modificamos ese método para que devuelva true si está autentificado y false si no lo está, y a su vez creamos otro método getUserId() que devuelve la ID de un usuario autentificado. En caso de que existiera algún comentario en el método original o en alguna llamada al método también debemos de modificarlo para que refleje el nuevo comportamiento.</p>
<h3>El precio de no mantener los comentarios</h3>
<p>Imaginemos qué estamos revisando un código escrito por otro desarrollador, y a medida que avanzamos notamos que los comentarios son superfluos y en muchos casos imprecisos e incoherentes con respecto al código, ¿qué ocurriría? Probablemente o los ignoraríamos por completo o seguiríamos leyéndolos a regañadientes.</p>
<p>Pero ¿que ocurriría si en lugar de ignorarlos tomamos por bueno la información de los comentarios en lugar de la realidad del código? La respuesta dependerá de cada situación, y en cada una de ellas intervendrán muchos factores, así que dejo esta respuesta a tu criterio, pero personalmente ninguna situación de las que soy capaz de imaginar es positiva.</p>
<h3>Refactorizar comentarios</h3>
<p>Hace no mucho escribíamos también sobre el código oloroso en la entrada ¿<a href="https://blog.ahierro.es/a-que-huele-el-codigo-fuente/">A qué huele el código fuente?</a> y sobre refactorización en la entrada <a href="https://blog.ahierro.es/refactorizacion-de-codigo/">Refactorización de código</a>.</p>
<p>La refactorización de los comentarios, que hoy estamos llamando mantenimiento, es tan importante como la del propio código. No basta solo con seguir los manuales de buenas prácticas al escribir nuevo código, debemos limpiar y corregir los comentarios irrelevantes, incomprensibles, imprecisos, incoherentes o erróneos que nos encontremos como parte de nuestra labor.</p>
<p>Si decidimos no refactorizar la primera consecuencia será que asumiremos que tanto nosotros como el resto del equipo que trabaje con ese código vamos a tener que convivir con comentarios erróneos. Y la segunda consecuencia que se dará con bastante probabilidad, es que el equipo se contagiará de la dejadez del código y comenzará a emplear malas prácticas, lo que suele acabar en un problema que crece con el paso del tiempo.</p>
<h3>Conclusión</h3>
<p>Debemos tratar los comentarios con la misma delicadeza que tratamos el resto del código, pues un código bien comentado facilita el mantenimiento del software y contribuye a evitar la deuda tecnológica.</p>
<p>¿Y tu qué opinas?, ¿crees que existen más situaciones relacionadas con los comentarios que debamos tener en cuenta en el mantenimiento?, ¿tienes algún consejo o recomendación? Sabes que nos gusta leer tu opinión, compártela en los comentarios.</p>La entrada <a href="https://blog.ahierro.es/mantenimiento-de-comentarios-en-la-programacion/">Mantenimiento de comentarios en la programación</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.ahierro.es/mantenimiento-de-comentarios-en-la-programacion/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Comentarios a evitar al programar</title>
		<link>https://blog.ahierro.es/comentarios-a-evitar-al-programar/</link>
					<comments>https://blog.ahierro.es/comentarios-a-evitar-al-programar/#respond</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Mon, 18 Feb 2019 07:36:27 +0000</pubDate>
				<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[comentarios]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[teoría]]></category>
		<guid isPermaLink="false">https://blog.ahierro.es/?p=596</guid>

					<description><![CDATA[<p>En muchas ocasiones utilizamos los comentarios casi para cualquier cosa, y siendo honestos, es que se prestan a ello y además podemos sacarle mucho partido. El problema es cuando permitimos que los usos alternativos perduren en el tiempo, pues lo único que conseguimos con ello es ensuciar el código. Por supuesto que podemos utilizarlos para &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/comentarios-a-evitar-al-programar/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "Comentarios a evitar al programar"</span></a></p>
La entrada <a href="https://blog.ahierro.es/comentarios-a-evitar-al-programar/">Comentarios a evitar al programar</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></description>
										<content:encoded><![CDATA[<p>En muchas ocasiones utilizamos los comentarios casi para cualquier cosa, y siendo honestos, es que se prestan a ello y además podemos sacarle mucho partido. El problema es cuando permitimos que los usos alternativos perduren en el tiempo, pues lo único que conseguimos con ello es ensuciar el código.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="650" height="438" src="https://blog.ahierro.es/wp-content/uploads/2019/02/comentarios_a_evitar.png" alt="Comentarios a evitar en la programación" class="wp-image-610" srcset="https://blog.ahierro.es/wp-content/uploads/2019/02/comentarios_a_evitar.png 650w, https://blog.ahierro.es/wp-content/uploads/2019/02/comentarios_a_evitar-300x202.png 300w" sizes="auto, (max-width: 650px) 100vw, 650px" /></figure>



<span id="more-596"></span>



<p>Por supuesto que podemos utilizarlos para ayudarnos a debugar,&nbsp; para ponernos notas, recordatorios o ToDos en en código y mil usos más. Pero los comentarios tienen un único objetivo que es aclarar la intención de un determinado bloque de código, y deberemos ceñirnos a este objetivo para garantizar la limpieza y la mantenibilidad de nuestros fuentes. Todo uso que se aleje de este objetivo (o de la documentación del código) no debe perdurar en el tiempo.</p>





<p>Así que a continuación veremos algunos usos inadecuados de los comentarios que están muy extendidos y que deberíamos evitar.</p>



<p>Este artículo forma parte de una serie que trata de una forma más amplia el uso de los comentarios en la programación, y en la que el artículo <a href="https://blog.ahierro.es/comentarios-en-programacion-introduccion/">Introducción a los comentarios en la programación</a> utilizaremos como índice.</p>



<h3 class="wp-block-heading">Código comentado</h3>



<p>Cuando estamos trabajando en un proyecto es bastante habitual encontrarnos con código fuente comentado. Suele ocurrir que comentemos&nbsp; un pedazo de código por un motivo temporal y no realicemos una limpieza posterior, con lo que queda ahí para la posteridad. Otro motivo bastante habitual es que realicemos un cambio en el código, no dispongamos de un software de control de versiones y no queramos perder el código original.</p>



<p>Sea cual sea el motivo, ¿qué debe interpretar un desarrollador cuando se encuentra un código comentado? ¿Lo ignora? ¿Lo compara o lo interpreta e intenta relacionarlo con el código no comentado? ¿Qué se supone que debe hacer?</p>



<p>Debemos ser limpios y no dejarnos fragmentos de códigos comentados en nuestros fuentes, y si no disponemos de un software de control de versiones deberíamos darle la máxima prioridad a incluir uno en nuestro proyecto. Puedes ver las entradas <a href="https://blog.ahierro.es/instalar-y-configurar-git-en-una-raspberry-pi-con-ubuntu-mate/">Instalar y configurar Git en una Raspberry Pi con Ubuntu Mate</a> o <a href="https://blog.ahierro.es/crear-un-repositorio-remoto-en-desde-con-archivos-locales/">Crear un repositorio remoto en Git desde archivos locales</a>.</p>



<h3 class="wp-block-heading">Identificación de modificaciones</h3>



<p>Un uso menos extendido pero con el que he tropezado en alguna ocasión es una versión «sofisticada» del punto anterior. Realizamos una modificación, comentamos el código original e incluimos ciertos datos como el nombre del desarrollador, la fecha en la que se realizó el cambio y el motivo por el que se hizo.</p>



<p>Veamos el siguiente ejemplos:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: php; title: ; notranslate">
// J.J. 15/10/2017  
// Bug: no permitía nombres de 8 caracteres  
// if($userName &gt; 8) {  
if($userName &gt;= 8) {  
   ...  
}
</pre></div>


<p>La molestia visual es evidente, además que que nos llevará más tiempo leer y comprender 4 líneas que una:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: php; title: ; notranslate">
if($userName &gt;= 8) { 
   ... 
}
</pre></div>


<p>Siempre existen circunstancias alrededor de un proyecto, pero de nuevo, si éste no tiene software de control de versiones todos nuestros esfuerzos deberían centrarse en conseguirlo.</p>



<h3 class="wp-block-heading">Código para debugar</h3>



<p>Esto ocurre en mayor medida, aunque no exclusivamente, en proyectos de desarrollo web. Para ayudarnos a debugar nuestro software incluimos líneas extra de códigos que realizan una tarea determinada. Una vez completado el debug las comentamos y permanecen como partes del código fuente eternamente. Esto no hace más que ensuciar el código, la persona que vuelva a tocar esos fuentes probablemente no necesitará debugar en ese punto, o lo hará de otra forma, así que seamos limpios y borremos este tipo de comentarios.</p>



<p>Además, otro hecho que ocurre, es que si continuamente encontramos comentarios que no añaden valor, acabaremos por ignorarlos todos, ¿por qué tenemos que tropezarnos con comentarios de este tipo en el código?</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: php; title: ; notranslate">
/*  
echo &#039;&lt;pre&gt;&#039;;  
printr($var);
echo &#039;&lt;/pre&gt;&#039;;  
die();  
*/  

</pre></div>


<p>Pero sobre todo, asegúrate de disponer de herramientas para debug. Cuando programamos en Java, C++, Basic, C#, etc. no concebimos desarrollar sin herramientas de debug adecuadas, que por lo general vienen incluidas en las IDEs.&nbsp; Así que si eres desarrollador web, asegúrate también de disponer de éstas herramientas. En este mismo blog tenemos una entrada sobre cómo <a href="https://blog.ahierro.es/debugar-php-netbeans-xcode/">Debugar PHP con Netbeans y XCode</a>. Para debugar Javascript también tienes múltiples opciones con herramientas como Chrome DevTools o la consola de Mozilla Firefox.</p>



<h3 class="wp-block-heading">ToDos y notas de trabajo</h3>



<p>En ocasiones nos ponemos notas al programar, yo por ejemplo en ciertas situaciones&nbsp; incluyo alguna línea del tipo:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: php; title: ; notranslate">
// todo: añadir validación de longitud máxima al nombre  
if($userName &gt;= 8) {  
...
}
</pre></div>


<p>Existen IDEs que traen soluciones para este tipo de notas, también existen programas que pueden ayudarnos a gestionar estas notas de forma muy efectiva. De cualquier forma, si te gusta trabajar con este tipo de comentarios asegúrate de borrarlo una vez que hayas finalizado la tarea, y si no la vas a terminar, el código fuente no es el lugar dónde indicar las tareas pendientes de completar, así que mejor busca una alternativa.</p>



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



<p>A pesar de que los comentarios lo aguantan todo, debemos de ser estrictos y hacer un buen uso de ellos, o de lo contrario nunca tendremos un código limpio. Como hemos podido ver, con un software de control de versiones y&nbsp; alguna herramienta para gestionar tareas pendientes podemos reducir drásticamente el número de comentarios inadecuados.</p>



<p>Seguro que tú también te has encontrado con muchos tipos de comentarios inadecuados, ¿de qué tipo eran? ¿qué herramientas utilizas para evitar estos comentarios?&nbsp; Como siempre me gustaría conocer tu experiencia.</p>La entrada <a href="https://blog.ahierro.es/comentarios-a-evitar-al-programar/">Comentarios a evitar al programar</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.ahierro.es/comentarios-a-evitar-al-programar/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
