<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>nombre</title><link>https://devtia.com/</link><description>Llevamos empresas a la nueva era digital. Te ayudamos a mejorar tus procesos a través de las métricas.</description><language>es</language><pubDate>Sat, 04 Apr 2026 12:08:13 +0200</pubDate><lastBuildDate>Sat, 04 Apr 2026 12:08:13 +0200</lastBuildDate><generator>DEVTIA</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><ttl>3600</ttl><item><title>Código limpio: Deja de comentar</title><link>https://devtia.com/post/codigo-limpio-deja-de-comentar</link><description><![CDATA[<p>En esta entrada vamos a analizar cu&aacute;ndo y c&oacute;mo es conveniente el uso de comentarios durante la fase de desarrollo de software.</p><h2>bloques de c&oacute;digo</h2><p>Por regla general <strong>deber&iacute;as evitar el uso de comentarios</strong>. Los comentarios pueden parecer una herramienta muy &uacute;til ya que cuando estamos desarrollando puede que nos encontremos con que queremos explicar mejor c&oacute;mo funciona nuestro c&oacute;digo o por que hemos tomado una determinada decisi&oacute;n.</p><p>Pero cuando usamos un comentario de c&oacute;digo donde antes ten&iacute;amos un problema: que nuestro c&oacute;digo no era suficientemente sencillo de entender, ahora tenemos dos: nuestro c&oacute;digo sigue sin entenderse con facilidad, y ahora adem&aacute;s debo ocuparme de mantener los comentarios que he realizado.</p><p>Puedes pensar que mantener ese comentario no es mucho trabajo, pero que tal si esa energ&iacute;a qu&eacute; has gastado en mantener un comentario la hubieras gastado en <strong>hacer algo m&aacute;s productivo</strong>. &iquest;mejor, no?.</p><p>Vemos un ejemplo con el <code>TokenStorage</code> del componente <code>Security</code> de <code>Symfony</code>.</p><pre><code class="php">namespace Symfony\Component\Security\Core\Authentication\Token\Storage;

use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Contracts\Service\ResetInterface;

/**
 * TokenStorage contains a TokenInterface.
 */
class TokenStorage implements TokenStorageInterface, ResetInterface
{
    // ..
    public function setToken(TokenInterface $token = null)
    {
        if ($token) {
            // ensure any initializer is called
            $this-&gt;getToken();
        }

        $this-&gt;initializer = null;
        $this-&gt;token = $token;
    }
    //..
}</code></pre><p>El autor de este c&oacute;digo necesitaba hacer algunas llamadas antes de configurar el token. Se dio cuenta que que no era sencillo de entender y que otra persona que viniera detr&aacute;s probablemente no entender&iacute;a el motivo de esa llamada, asi que utiliz&oacute; un comentario para aclararlo todo. &iquest;Pero que te parece si hubiera hecho esto?</p><pre><code class="php">namespace Symfony\Component\Security\Core\Authentication\Token\Storage;

use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Contracts\Service\ResetInterface;

/**
 * TokenStorage contains a TokenInterface.
 */
class TokenStorage implements TokenStorageInterface, ResetInterface
{
    // ..
    public function setToken(TokenInterface $token = null)
    {
        if ($token) {
            $this-&gt;callInitializer();
        }

        $this-&gt;initializer = null;
        $this-&gt;token = $token;
    }

    private function callInitializer(): void
    {
        $this-&gt;getToken();
    }
    //..
}</code></pre><p>Como ves <strong>hemos eliminado el comentario y hemos mantenido e incluso mejorado la expresividad</strong>, ya que el c&oacute;digo es igual de expl&iacute;cito. Por lo tanto siempre que nos veamos en la necesidad de a&ntilde;adir comentarios, debemos plantearnos si podr&iacute;amos mejorar la expresividad de nuestro c&oacute;digo mejorando los nombres que estamos utilizando o extrayendo m&eacute;todos como en el ejemplo.</p><h2>DocBlock y documentaci&oacute;n autogenerada</h2><p>Algunos editores de texto a&ntilde;aden documentaci&oacute;n de forma m&aacute;s o menos autom&aacute;tica que permite indicar los tipos de los argumentos y del valor devuelto, as&iacute; como informaci&oacute;n adicional.</p><p>Veamos un ejemplo</p><pre><code class="php">    /**
     * get movements
     *
     * @return array
     */
    public function getMovements()
    {
        return $this-&gt;movements;
    }</code></pre><p>Este tipo de documentaci&oacute;n <strong>no aporta ning&uacute;n valor adicional</strong> ya que simplemente est&aacute; repitiendo lo mismo que ya dice el nombre de la funci&oacute;n. Quiz&aacute; esto ten&iacute;a sentido antes de la versi&oacute;n 7, para ayudar al IDE en el autocompletado. Pero a partir de esta versi&oacute;n es mucho mejor eliminar estos comentarios y utilizar el tipado nativo del lenguaje.</p><pre><code class="php">   public function getMovements(): array
    {
        return $this-&gt;movements;
    }</code></pre><h2>Usos permitidos</h2><p>Por supuesto el autor contempla algunos casos en los que s&iacute; estar&iacute;a permitido y justificado el uso de comentarios.</p><h3>Licencias y textos legales</h3><p>Es un uso completamente justificado el incluir la licencia y otros textos legales en el encabezado de nuestros ficheros. Adem&aacute;s esto no supone ning&uacute;n trabajo adicional, por que es habitual utilizar sistemas que se encargan de a&ntilde;adir estos comentarios de forma autom&aacute;tica, y adem&aacute;s los IDE suelen ocultarlos por lo que no molestan.</p><h3>APIs</h3><p>Si est&aacute;s construyendo una api y probablemente quieras generar la documentaci&oacute;n a trav&eacute;s de alg&uacute;n sistema autom&aacute;tico, s&iacute; estar&iacute;a justificado el incluir toda esta informaci&oacute;n adicional en tu c&oacute;digo.</p>
]]></description><guid>https://devtia.com/post/codigo-limpio-deja-de-comentar</guid><pubDate>Fri, 17 Jul 2020 14:46:07 +0200</pubDate></item><item><title>Código limpio: Argumentos</title><link>https://devtia.com/post/codigo-limpio-argumentos</link><description><![CDATA[<p>En esta entrada vamos a profundizar en la importancia que tienen los argumentos y ver algunas reglas para elegirlos y ordenarlos correctamente.</p><h2>N&uacute;mero de argumentos</h2><p>Seg&uacute;n el autor podr&iacute;amos clasificar las funciones o los m&eacute;todos seg&uacute;n el n&uacute;mero de argumentos posibles.</p><p><strong>Mon&aacute;dicaos</strong> tienen un s&oacute;lo argumento, son f&aacute;ciles de testear y f&aacute;ciles de entender. No hay lugar a dudas en cuanto a que es lo que hace y probablemente ser&aacute; bastante sencillo crear un test unitario para la misma. Siempre que podamos debemos basar nuestra api en este tipo de funciones.</p><p><strong>Di&aacute;dicos</strong> tienen dos argumentos. Siguen siendo relativamente f&aacute;ciles de entender, y probablemente seguir&aacute;n siendo f&aacute;ciles de testear.</p><p><strong>Triadicos </strong>son las que tienen tres argumentos, comienza a complicarse la forma de testear, aumenta la complejidad ciclom&aacute;tica o n&uacute;mero de "caminos" posibles dentro de la funci&oacute;n, y se complica recordar los argumentos y su orden. Este tipo de funciones deber&iacute;an evitarse si es posible.</p><p><b>Cuatro o m&aacute;s argumentos</b> Este tipo de funciones tienen todos los problemas que ya hemos comentado pero en mayor expotente. Veamos un ejemplo a continuaci&oacute;n la funci&oacute;n que ejecuta el filtro <code>localizeddate</code> de twig.</p><pre><code class="php">function twig_localized_date_filter(
    Twig_Environment $env,
    $date,
    $dateFormat = 'medium',
    $timeFormat = 'medium',
    $locale = null,
    $timezone = null,
    $format = null,
    $calendar = 'gregorian'
) {
    //..
}</code></pre><p>Habitualmente usamos esta funci&oacute;n de esta forma lo que la hace muy c&oacute;moda de usar</p><pre><code class="twig">{{ item.date|localizeddate }}
{{ item.date|localizeddate('short', 'none') }} {# el uso de las constantes es muy c&oacute;modo en el d&iacute;a a d&iacute;a. #}
</code></pre><p>El problema viene cuando queremos pasarle un formato personalizado. Es muy dificil de recordar cuales son los argumentos, y tenemos que ir a la documentaci&oacute;n para comprobarlo. Adem&aacute;s los primeros dos argumentos son ignorados lo que la vuelve un poco confusa.</p><pre><code class="twig">{{ item.date|localizeddate('none', 'none', null, null, 'MMMM y') }}
{{ item.date|localizeddate('full', 'full', null, null, 'MMMM y') }} {# ambas hacen lo mismo. #}</code></pre><p>&iquest;Que os parece si cambiamos esta funci&oacute;n por dos? En la primera usaremos las constantes definidas para <code>$dateFormat</code> y <code>$timeFormat</code> mientras que en la segunda usaremos un formato personalizado.</p><pre><code class="php">function twig_localized_date_filter(
    Twig_Environment $env,
    $date,
    $dateFormat = 'medium',
    $timeFormat = 'medium',
    $locale = null,
    $timezone = null,
    $calendar = 'gregorian'
) {
//..
}

function twig_localized_date_filter_by_format(
    Twig_Environment $env,
    $date,
    $customFormat = null,
    $locale = null,
    $timezone = null,
    $calendar = 'gregorian'
) {
//..
}</code></pre><p>Hemos reducido un poco el n&uacute;mero de argumentos y hemos facilitado su utilizaci&oacute;n, ya que el uso de la segunda funci&oacute;n quedar&iacute;a en algo parecido a esto.</p><p class="text-muted">Nota: Aunque todav&iacute;a son muchos argumentos el primero es injectado por <code>twig</code> asi que contar&iacute;a uno menos.</p><pre><code class="twig">{{ item.date|localizeddate('da_igual_lo_que_pongas', 'da_igual_lo_que_pongas', null, null, 'MMMM y') }} {# antes #}
  {{ item.date|localizeddate_by_format('MMMM y') }} {# mejor esta no? #}</code></pre><h2>Grupos de argumentos</h2><p>En el caso en el que tenemos una funci&oacute;n con un grupo de argumentos relacionados entre s&iacute;, <strong>podemos agruparlos todos ellos en una clase</strong> de forma que nuestro c&oacute;digo mejora en su legibilidad. Es lo que han hecho aqu&iacute;.</p><p>&iquest;Que os parece si crearamos una clase para almacenar la configuraci&oacute;n de la localizaci&oacute;n <code>$locale</code>, <code>$timezone</code>, <code>$calendar</code>. Es muy probable que este grupo de argumentos se repitan en otras funciones.</p><pre><code class="php">class Localization
{
    private $locale = null;
    private $timezone = null;
    private $calendar = 'gregorian';

    public function __construct($locale, $timezone, string $calendar)
    {
        $this-&gt;locale = $locale;
        $this-&gt;timezone = $timezone;
        $this-&gt;calendar = $calendar;
    }

}</code></pre><p>Con esto mejoramos mucho la legibilidad del c&oacute;digo, veamos c&oacute;mo quedar&iacute;an nuestras funciones anteriores</p><pre><code class="php">function twig_localized_date_filter(
    Twig_Environment $env,
    $date,
    $dateFormat = 'medium',
    $timeFormat = 'medium',
    $localization
) {
//..
}

function twig_localized_date_filter_by_format(
    Twig_Environment $env,
    $date,
    $customFormat = null,
    $localization
) {
//..
}</code></pre><h2>Orden de argumentos</h2><p>A partir de este punto todo lo que vamos a ver no aparece en el libro, pero si que hemos querido completarlo con algunos criterios adicionales. Deber&iacute;as tener en cuenta las siguientes condiciones a la hora de elegir el orden de los argumentos.</p><ul><li>Los m&aacute;s importantes primero.</li><li>Utiliza el contexto para que el lector sepa cual es el primer argumento.</li><li>Trata de agrupar por tipos.</li><li>Argumentos opcionales al final.</li></ul><h2>Nombres</h2><p>Los nombres de tus argumentos son parte de tu funci&oacute;n. Trata de que s&eacute;an lo m&aacute;s expec&iacute;ficos posibles, ayuda al lector a entender tu funci&oacute;n y lo que pueda esperar de ella, a trav&eacute;s de esos nombres. &iquest;Que te parece este cambio?</p><pre><code class="php">function twig_localized_date_filter(
    Twig_Environment $env,
    $dateTime, // $date no era fiel a la realidad, ya que en ese argumento no importa s&oacute;lo la fecha, si no tambi&eacute;n la hora.
    $dateFormat = 'medium',
    $timeFormat = 'medium',
    $localization
) {
//..
}</code></pre><h2>Tipado</h2><p>El &uacute;ltimo apartado que me gustar&iacute;a ver en esta entrada es el tipado. La regla es muy sencilla. Tipa siempre que puedas.</p><pre><code class="php">function twig_localized_date_filter(
    Twig_Environment $env,
    \DateTime $date,
    string $dateFormat = 'medium',
    string $timeFormat = 'medium',
    Localization $localization = null
) {
//..
}

function twig_localized_date_filter_by_format(
    Twig_Environment $env,
    \DateTime $date,
    string $customFormat,
    Localization $localization = null
) {
//..
}</code></pre><p>El tipado tambi&eacute;n forma parte de tu funci&oacute;n, quiz&aacute; no tengas claro que es exactamente <code>$localization</code>, pero el tipado te ayuda a entender que se trata de una clase.</p>
]]></description><guid>https://devtia.com/post/codigo-limpio-argumentos</guid><pubDate>Sat, 04 Jul 2020 09:56:47 +0200</pubDate></item><item><title>Código limpio: Nombres</title><link>https://devtia.com/post/codigo-limpio-nombres</link><description><![CDATA[<p>En esta entrada vamos a entender y profundizar en la importancia de elegir buenos nombres. Es muy importante que te tomes el tiempo necesario para encontrar un buen nombre, y no debes tener ning&uacute;n miedo a cambiarlo si es que encuentras otro mejor.</p><h2>Evita el uso de contracciones</h2><p>Esta es la primera regla y la m&aacute;s sencilla de todas. Cuando programamos, podemos caer en la tentaci&oacute;n de crear peque&ntilde;as contracciones, dentro de la api de linux por ejemplo nos encontramos con un mont&oacute;n de ellas como por ejemplo <code>mv</code>, <code>cp</code>, <code>chmod</code> y muchas m&aacute;s.</p><p>Cuando escribes una contracci&oacute;n puede que en ese momento a t&iacute; te parezca obvia, pero es posible que para otra persona en otro contexto no lo sea tanto, as&iacute; que no merece la pena ahorrarse unos caracteres a cambio de los problemas que puedas generar en el futuro.</p><p>Adem&aacute;s esta regla te permitir&aacute; no entrar en conflicto con la siguiente que es la consistencia. Si usas una contracci&oacute;n en una variable o m&eacute;todo, &iquest;Por qu&eacute; no usarlo en todas las dem&aacute;s? &iquest;En cu&aacute;les s&iacute; y en cu&aacute;les no? Acabas de crear un problema donde no lo hab&iacute;a.</p><h2>S&eacute; consistente</h2><p><img alt="S&eacute; consistente" loading="lazy" src="/cache/thumb_1200_0400/uploads/content/image/image/17b93e4abdd2e6b2bed5b34fbe251abed368da8d.jpg" title="S&eacute; consistente"></p><p>Una de las caracter&iacute;sticas que vimos del c&oacute;digo limpio es que no es f&aacute;cil de mejorar. Eso significa que el c&oacute;digo es consistente. Si has decidido por ejemplo llamar <code>Lesson</code> a la entidad que representa a un profesor, una asignatura, una colecci&oacute;n de alumnos y un momento concreto en el tiempo, no deber&iacute;as utilizar ning&uacute;n tipo de sin&oacute;nimos.</p><p>Otro elemento que debes tener en cuenta a la hora de producir nombres consistentes es utilizar siempre los mismos verbos para una determinada tarea. Por ejemplo si has decidido que cuando accedas a un repositorio y recuperes un conjunto de lecciones vas a utilizar el verbo <code>get</code> generando nombres del tipo <code>getByUser()</code>, <code>getByState()</code>, <code>getByDate()</code> deber&iacute;as evitar usar sin&oacute;nimos del verbo <code>get</code>, como por ejemplo <code>fetchByUser()</code>, <code>findByState()</code>, <code>retrieveByDate()</code>.</p><h2>Utiliza el contexto</h2><p>Evita repetir conceptos que ya est&aacute;n claros a trav&eacute;s del contexto. Continuando con el ejemplo anterior, si est&aacute;s escribiendo un m&eacute;todo dentro de <code>LessonRepository</code> para buscar lecciones por su estado no necesitas indicar que est&aacute;s buscando lecciones <code>getLessonsByState</code>. Ya te encuentras dentro de <code>LessonRepository</code> as&iacute; que todos sus m&eacute;todos deber&iacute;an devolver por colecciones de lecciones. Debes evitar repetir "Lessons" en cada nombre, siendo <code>getByState()</code> m&aacute;s adecuado./p&gt;</p><p>Deber&iacute;as evitar usar nombres demasiado largos, as&iacute; como deber&iacute;as evitar usar nombres demasiado parecidos. Si te encuentras en una situaci&oacute;n en la que est&aacute;s escribiendo un nombre demasiado largo deber&iacute;as evaluar si puedes utilizar el contexto para generar un nombre m&aacute;s corto.</p><p>Por ejemplo si tienes la clase <code>UniversityLessonState</code> que contiene los estados posibles de una lecci&oacute;n de la universidad, podr&iacute;as generar un nuevo namespace del tipo <code>University\Lesson\State</code> obteniendo un nombre de clase mucho m&aacute;s corto y f&aacute;cil de leer, pero sin haber perdido ning&uacute;n tipo de informaci&oacute;n.</p><p>Si necesitas dos palabras para definir el nombre de una clase es probable que necesites crear un nuevo contexto, y si necesitas tres palabras definitivamente deber&iacute;as crear un contexto nuevo.</p><h2>Hace lo que dice que hace</h2><p><img alt="Hace lo que dice que hace" loading="lazy" src="/cache/thumb_1200_0400/uploads/content/image/image/6e032f2cbbc3defe991d6878c01e6298fa24ed2f.jpg" title="Hace lo que dice que hace"></p><p>Entramos en la parte final de las recomendaciones. Sin embargo estas dos &uacute;ltimas son las m&aacute;s importante de todas. Cuando eliges un nombre lo m&aacute;s importante es ser sincero. El nombre que est&aacute;s eligiendo tiene que servir para identificar qu&eacute; es lo que contiene.</p><p>En general debemos evitar nombres gen&eacute;ricos como <code>data</code>, <code>info</code>, <code>resume</code>, <code>items</code>. En algunos momentos muy concretos puede que tengan sentido, &iquest;pero que contienen exactamente?. Quiz&aacute; el autor no sab&iacute;a que nombre poner y eligi&oacute; uno de estos.</p><p>Si lo que quer&iacute;amos crear era por ejemplo un conjunto de lecciones filtradas por algunos criterios, podr&iacute;amos haber eleg&iacute;do <code>lessons</code> o <code>filteredLessons</code> al menos indica que contiene un conjunto de lecciones.</p><p>Debemos tambi&eacute;n evitar nombres que definan qu&eacute; es lo que necesita el autor en lugar de que es lo que hace un m&eacute;todo o clase. Por ejemplo <code>LessonRepository::getForDashboard</code>. Tenemos claro que el autor necesitaba una colecci&oacute;n de lecciones para mostrarlas en el dashboard, pero no tenemos ni idea de que criterios tiene en cuenta. Si el criterio para mostrar las lecciones en el dashboard fuera que pertenecieran a un determinado usuario, que estuvieran en un rango determinado de fechas, como por ejemplo los pr&oacute;ximos 15 d&iacute;as, y se encontraran en un determinado estado, podr&iacute;amos haber elegido <code>LessonRepository::getByUserFromToAndState</code>.</p><h2>Explica c&oacute;mo debe usarse</h2><p>Llegamos al &uacute;ltimo punto. Una vez que has encontrado el nombre adecuado que cumple todos los anteriores requisitos debes plantearte una &uacute;ltima pregunta.</p><p>&iquest;Explica mi nombre c&oacute;mo debe ser utilizado? Veamos un ejemplo supongamos que tenemos una clase que se encarga de realizar cambios sobre las lecciones <code>LessonManager::changeDate</code>, el contexto <code>LessonManager</code> nos indica que la entidad que va a modificar es una <code>Lesson</code> y el nombre nos revela que la va a cambiar de estado.</p><p>Por coherencia los argumentos deber&iacute;an ser <code>Lesson</code>, <code>Date</code> en este orden. Sin embargo podemos ayudar a evitar malentendidos, nombrando correctamente los argumentos. <code>LessonManager::changeDate($lesson, $toDate)</code> no deja lugar a ning&uacute;n tipo de equivocaci&oacute;n.</p><h2>Conclusiones</h2><p>Cuando escribimos c&oacute;digo limpio debemos tener en cuenta a la persona que lo va a leer, y cuando elegimos nombres debemos elegirlos pensando primero en esa persona en hacerle la vida lo m&aacute;s f&aacute;cil posible.</p>
]]></description><guid>https://devtia.com/post/codigo-limpio-nombres</guid><pubDate>Wed, 03 Jun 2020 10:39:13 +0200</pubDate></item><item><title>¿Qué es el código limpio?</title><link>https://devtia.com/post/que-es-el-codigo-limpio</link><description><![CDATA[<p>En esta entrada vamos a realizar una peque&ntilde;a introducci&oacute;n a los conceptos principales del libro.</p><h2>M&aacute;s lento para ir m&aacute;s r&aacute;pido</h2><p><img alt="M&aacute;s lento para ir m&aacute;s r&aacute;pido" loading="lazy" src="/cache/thumb_1200_0400/uploads/content/image/image/826f0cfe85aeb9de4864a7440b4529066e96be1d.jpg" title="M&aacute;s lento para ir m&aacute;s r&aacute;pido"></p><p>A lo largo de este primer cap&iacute;tulo Martin nos introduce la idea de que en muchos proyectos cuando se trata de ir demasiado deprisa el resultado es exactamente el contrario. Si eers programador probablemente hayas vivido esto en tus propias carnes. En el periodo de uno o dos a&ntilde;os en los que los programadores han ido a&ntilde;adiendo cambios al c&oacute;digo sin control el resultado es que cada vez se hace m&aacute;s y m&aacute;s dif&iacute;cil avanzar y se dedica la mayor&iacute;a del tiempo a solucionar incidencias. Para a&ntilde;adir cualquier peque&ntilde;o cambio es necesario tener en cuenta un sin fin de detalles, efectos y consecuencias, as&iacute; que cada nueva funcionalidad a&ntilde;ade a&uacute;n m&aacute;s complejidad al proyecto.</p><p>La soluci&oacute;n que aplican muchos managers en este momento es aumentar la plantilla, pero sin cambiar la forma de trabajar, lo que fragmenta m&aacute;s el c&oacute;digo y reduce cada vez m&aacute;s la productividad. M&aacute;s pronto que tarde el equipo de desarrollo se plantar&aacute; y exigir&aacute; "rehacer" el c&oacute;digo para sacar una nueva versi&oacute;n, esta vez sin los problemas de la actual. Pero recuerda que si no cambian su forma de trabajar y de pensar, el mismo equipo que gener&oacute; el problema volver&aacute; a generar un problema parecido de nuevo.</p><p>Si te has visto en esta situaci&oacute;n te aconsejo leer esta serie de entradas sobre c&oacute;digo limpio.</p><h2>Bien, &iquest;Pero qu&eacute; es el c&oacute;digo limpio?</h2><p>El libro autor comienza haci&eacute;ndose el mismo esta pregunta. Para ello recurre a diversos autores relevantes a los que les traslada esta cuesti&oacute;n.</p><div class="row mt-2"><div class="col-sm-3"><p><img alt="Bjarne stroustrup" loading="lazy" src="/cache/thumb_1200/uploads/content/image/image/d240078809f3a4cc995742f4cd017a235c31f529.jpg" title="Bjarne stroustrup"></p></div><div class="col-sm-9"><h3 class="mt-0">Bjarne stroustrup</h3><p>Ha destacado por desarrollar el lenguaje de programaci&oacute;n C++ y por ser el autor del libro que se considera de referencia en dicho lenguaje: "programming principles and practice using c++".</p><p>Bjarne indica que el c&oacute;digo debe ser <strong>elegante y eficaz</strong>, la <strong>l&oacute;gica debe ser sencilla</strong> para evitar errores, el <strong>procesamiento de errores debe ser completo</strong>, el <strong>rendimiento debe ser &oacute;ptimo</strong>. Bjarne concluye que el c&oacute;digo limpio <strong>hace bien una &uacute;nica cosa</strong>.</p></div></div><div class="row mt-2"><div class="col-sm-9"><h3 class="mt-0">Grady Booch</h3><p>Es conocido entre otras cosas por ser uno de los dise&ntilde;adores del Lenguaje Unificado de Modelado UML.</p><p>Grady define que el c&oacute;digo limpio debe ser <strong>simple y directo</strong>. Adem&aacute;s el c&oacute;digo <strong>debe exponer la intenci&oacute;n</strong> del dise&ntilde;ador.</p></div><div class="col-sm-3"><p><img alt="Grady Booch" loading="lazy" src="/cache/thumb_1200/uploads/content/image/image/f755bee53e04e7fc5953612f473229b5be394256.jpg" title="Grady Booch"></p></div></div><div class="row mt-2"><div class="col-sm-3"><p><img alt="Dave thomas" loading="lazy" src="/cache/thumb_1200/uploads/content/image/image/ac935c6dad12174b783964ac57c0f63a6540819f.jpg" title="Dave thomas"></p></div><div class="col-sm-9"><h3 class="mt-0">Dave thomas</h3><p>Es el autor del libro pragmatic programmer que tambi&eacute;n nos gustar&iacute;a analizar.</p><p>Dave introduce la idea de que el c&oacute;digo limpio debe ser <strong>f&aacute;cil de modificar</strong> para alguien que no es el autor original. En su opini&oacute;n el c&oacute;digo debe tener tanto <strong>pruebas unitarias c&oacute;mo de aceptaci&oacute;n</strong>. Los <strong>nombres deben tener significado</strong>. El c&oacute;digo ofrece <strong>una &uacute;nica forma de hacer una determinada cosa</strong> a trav&eacute;s de una API clara.</p></div></div><div class="row mt-2"><div class="col-sm-9"><h3 class="mt-0">Michael Feathers</h3><p>Es el autor del libro working effectively with legacy code.</p><p>Michael considera que el c&oacute;digo limpio es aquel al que <strong>se le ha dado importancia</strong> y al mismo tiempo <strong>se ha mantenido sencillo</strong>. Seg&uacute;n Michael cuando te enfrentas a un c&oacute;digo limpio no existe una forma f&aacute;cil de mejorarlo, ya que el autor pens&oacute; en todos los aspectos posibles.</p></div><div class="col-sm-3"><p><img alt="Michael Feathers" loading="lazy" src="/cache/thumb_1200/uploads/content/image/image/68dcfa1ce0de8c7be21551b3a1ac7334988451e9.jpg" title="Michael Feathers"></p></div></div><div class="row mt-2"><div class="col-sm-3"><p><img alt="Ron Jeffires" loading="lazy" src="/cache/thumb_1200/uploads/content/image/image/a66b690433e5eea7b6c7ba98ef07d6e25bbe07d5.jpg" title="Ron Jeffires"></p></div><div class="col-sm-9"><h3 class="mt-0">Ron Jeffires</h3><p>Es uno de los tres desarrolladores de la metodolog&iacute;a eXtreme programming.</p><p>Ron nos indica que el c&oacute;digo limpio debe seguir las indicaciones de Ken Beck. En orden de prioridad <strong>debe contener pruebas</strong>, <strong>debe evitar la duplicidad</strong>, <strong>debe expresar los conceptos</strong> del dise&ntilde;o y <strong>debe mantenerse tan peque&ntilde;o c&oacute;mo sea posible</strong>.</p></div></div><div class="row mt-2"><div class="col-sm-9"><h3 class="mt-0">Ward Cunningham</h3><p>Es uno de los impulsores de la identificaci&oacute;n y estandarizaci&oacute;n de los patrones de dise&ntilde;o.</p><p>Seg&uacute;n Ward sabemos que estamos ante c&oacute;digo limpio cuando <strong>el c&oacute;digo hace lo que se espera que haga</strong>.</p></div><div class="col-sm-3"><p><img alt="Ward Cunningham" loading="lazy" src="/cache/thumb_1200/uploads/content/image/image/c49ee369ea6a530b2089de35bf5d506146374f0a.jpg" title="Ward Cunningham"></p></div></div><h2>&iquest;Qu&eacute; conclusiones sacamos?</h2><p>De todas estas entrevistas se extraen una serie de ideas m&aacute;s o menos comunes.</p><h3>Que haga lo que se espera que haga</h3><p>Nosotros en DEVTIA a esta regla la llam&aacute;mos: "No me mientas". Es tambi&eacute;n muy f&aacute;cil de entender cada funci&oacute;n y cada clase tiene que hacer exactamente, lo que se espera que haga. Adem&aacute;s esto debe ser evidente, no debo necesitar entrar a ver el m&eacute;todo para saber que puedo esperar de el.</p><h3>Peque&ntilde;o</h3><p>Esta es una regla f&aacute;cil de seguir y f&aacute;cil de entender. Cuanto m&aacute;s peque&ntilde;o sea nuestro c&oacute;digo m&aacute;s f&aacute;cil ser&aacute; que podamos modificarlo y mantenerlo. Depender&aacute; de cada proyecto y de cada equipo establecer los l&iacute;mites, pero un buen punto de partida podr&iacute;a ser que las funciones y las clases con sus m&eacute;todos colapsados deber&iacute;an poder visualizarse completamente en las pantallas que est&aacute; usando el equipo.</p><p>En los siguientes cap&iacute;tulos veremos muchos ejemplos para mejorar este aspecto.</p><h3>Sin duplicidad</h3><p>Un error claro de dise&ntilde;o es cuando necesitas copiar y pegar tu c&oacute;digo en diferentes sitios. A la larga esto va a introducir errores, ya que cuando alguien actualize una copia, probablemente olvidar&aacute; actualizar las dem&aacute;s.</p><h3>Debe tener tests</h3><p>Casi todos los autores han introducido la importancia de los tests. Tener una buena bater&iacute;a de test nos va a permitir trabajar con nuestro c&oacute;digo y poderlo modificar con seguridad de que si estamos rompiendo alguna cosa, los test nos van a avisar.</p><h2>La regla del boy scout</h2><p><img alt="La regla del boy scout" loading="lazy" src="/cache/thumb_1200_0200/uploads/content/image/image/e9f673dc381ac6d3e65ddb07eb0856d15af750d5.jpg" title="La regla del boy scout"></p><p>La regla del Boy Scout se trata de una regla muy sencilla. Originalmente se refiere a lo que hacen los Boy Scout cuando hacen una acampada: dejan el lugar en el que han estado un poco m&aacute;s limpio de como se lo encontraron.</p><p>Aplicado al desarrollo de software nos indica que si en nuestro d&iacute;a a d&iacute;a seg&uacute;n estamos trabajando en un proyecto podemos ir introduciendo peque&ntilde;as mejoras que el autor original no tuvo en cuenta, pero que para nosotros son evidentes. Estos peque&ntilde;os cambios, en los que podemos incluir desde cambio de nombres, extracci&oacute;n de m&eacute;todos, peque&ntilde;os refactorizaciones, soluci&oacute;n de bugs, ect, a lo largo de un periodo de tiempo generar&aacute; un grado de maduraci&oacute;n en el c&oacute;digo.</p>
]]></description><guid>https://devtia.com/post/que-es-el-codigo-limpio</guid><pubDate>Sat, 23 May 2020 15:40:32 +0200</pubDate></item></channel></rss>