Ouracademy

Reforzando un estilo o convención de código

Vemos todos los días debates sobre usar " o ', usar ; o no usarlo, usar tabs o espacios para identar el código...lo peor es que estos debates siempre habrán, son guerras santas 🔪

De hecho es algo estos no son debates de los cuales dices bueno no importa..., estos debates sucederán porque la mayoría de desarrollos o mantenimientos de software implican un equipo. Y cuando hay equipos, siempre hay discrepancias. Es importante que el equipo (o incluso la organización en general) defina un estándar común. De lo contrarío, tendrán código como:

// código real de un sistema legado (adaptado a Javascript)
// contracts-component.js
// ...
// programado por desarrollador 1
getState(contracts) {
    return
            contracts.getMcotoEstado()==3 ? messages.getProperty("suspendedSing"):
            (contracts.getMcotoEstado()==2 ? messages.getProperty("dismissedSing") :
            messages.getProperty("activeSing"));
}

// programado por desarrollador 2
ultimoValorAmpliacion(contract) {
    const services = ctx.get('contractsDatesService');
    const contractDate = services.ultimaAmpliacion(contract);

    if(contractDate==null) {
        return null;
    }else {
    return contractDate.getDfecontValor();
    }
}

Podemos ver que ambos desarrolladores usan distintas convenciones, por un lado el desarrollador 1 usa comillas simples (" en getState) mientras el desarrollador 2 usa con comilla dobles (' en el otro método ultimoValorAmpliacion), ademas de un else sin identación. Imaginate estas incosistencias esparcidas por todo el código fuente. Por eso es importante definir lo más antes posible una convención de código para el equipo, siguiendo el principio de uniformidad.

Aún así es usual que el equipo rompa estas convenciones, por distintos motivos (un nuevo desarrollador entra al equipo pero no está al tanto de las convenciones o un desarrollador se olvida de una regla de la convención) por ello es importante en lo posible que estas convenciones sean reforzadas por herramientas.

Usando un formateador

Hoy en día la mayoría de lenguajes de programación tienen herramientas para dar que noformato a tu código, usando algúna convención usual pero con capacidades de configurarlo según sea necesario. Por ejemplo, en Go tenemos fmt, en Java google-java-format, en Javascript prettier...

Si el equipo decide usar comillas simples y no usar punto y comas (si para tu lenguaje es opcional, como en Javascript, entonces para que usarlo no?), si usaramos prettier como herramienta para dar formato, podríamos indicar esas reglas de formato quiza creando un archivo .prettierrc como el siguiente

{
  "semi": false, // no semicolon (punto y coma)
  "singleQuote": true // si comilla simple
}

Luego simplemente podremos formatear nuestro código usando el comando prettier contracts-component.js. Cualquier miembro del equipo simplemente repetira este comando, no tendrá más que darle formato m anualmente.

Nota para que todo el equipo use las mismas reglas, es importante que este archivo sea compartido. Es más debe estar versionada, usando por supuesto una herramienta de versionamiento (como git). En general, todo debe estar versionado, no solo el código fuente, sino esquemas de bases de datos, migraciones, scripts de despliegue...cada vez más versionamiento.

Aunque se haya mejorado en gran manera el desarrollo muchas cosas se pueden mejorar.

Mejorando el flujo de desarrollo

En el mundo del desarrollo, una de las cosas que buscamos es automatizar cosas recurrentes, no solo del negocio, sino tambien de nuestro trabajo de desarrollo. Automatizar la ejecución de pruebas, el despliegue de nuestras aplicaciones... en nuestro caso podemos automatizar la ejecución del formateador.

Por ejemplo, podemos instalar un plugin a nuestro IDE o editor para que cada vez que guardemos un archivo le de el formato a nuestro código.

dar formato al guardar

Si usaramos vscode, usando el mismo ejemplo anterior, podríamos agregarle un par de configuraciones, para hacer el flujo más dulce 🍰. Por ejemplo, podríamos instalar integrarlo con prettier instalando un plugin y luego simplemente poner:

{
  // En el archivo .vscode/settings.json
  "editor.formatOnSave": true
  // ...
}

Y cada vez que guardemos un archivo, automaticamente se dará formato 😃.

Sin embargo, muchas veces nuestro editor no posee una integración al formateador de nuestro gusto o incluso puede que usemos un generador de código (por ejemplo un CLI de algún framework como Laravel o Angular) que genera un par de clases con el fin de facilitarnos escribir código, pero que lamentablemente genra código que no sigue nuestras convenciones. Por estos motivos, muchas veces es recomendable agregar un check antes del commit, muy similar a la técnica de pre-commit build checks, que dará formato a nuestro código antes de dar un commit.

Siguiendo el ejemplo de usar prettier, facilmente podríamos agregar husky para ello. Agregando a nuestro package.json lo siguiente:

{
  "husky": {
    "hooks": {
      "pre-commit": "lint-staged"
    }
  },
  "lint-staged": {
    "*.{js,json,css,md}": ["prettier --write", "git add"]
  }
}

Otro punto importante que a menudo veo usar en varios proyectos, es la integración del formateador con el linter que uses(como SonarQuobe, EsLint), más por regla general, evita que tu linter tenga que ver con el estilo de formato de tu código, sino que solo ayude a detectar bugs y quiza un estilo de programación (por ejemplo, usar siempre constantes o en lo posible usar operadores ternarios en vez de if/else).

Si te fue útil este artículo, por favor compártelo. Apreciamos los comentarios y el aliento.
Compartelo por:

Quiza te pueda interesar...

Cuando estes estancado, habla con el pato

Método de depuración del patito de goma o de como una vez hablaste con un patito de goma y resolviste un problema en el cual estabas estancado

String Interpolation

que es string interpolation? con ejemplos en javascript y python

Por que el testing es lo primero

La importancia del testing y razones por que es lo primero, en especial en Test Driven Development (TDD) traducido de Uncle Bob