Huele porque es probable que haya muchos casos en los que podría editarse o mejorarse.
La mayoría de estos olores son solo indicios de algo que podría estar mal. Por lo tanto, no es necesario que se arreglen per se... (Sin embargo, debe investigarlo).
Puedes encontrar todos los olores del código anterior (Parte i - XXXI) aquí .
Continuemos...
Aprendemos if/else en nuestro primer día de programación. Entonces nos olvidamos de lo demás.
TL; DR: Sea explícito. Incluso con Else.
Si regresamos temprano a una oración IF, podemos omitir la parte else.
Luego, eliminamos el IF y usamos polimorfismo.
Ahí es cuando nos perdemos los casos reales.
function carBrandImplicit(model) { if (model === 'A4') { return 'audi'; } return 'Mercedes-Benz'; }
function carBrandExplicit(model) { if (model === 'A4') { return 'audi'; } if (model === 'AMG') { return 'Mercedes-Benz'; } // Fail Fast throw new Exception('Model not found); }
Podemos verificar los árboles de sintaxis y analizarlos y advertir si falta algo más.
También podemos reescribirlos y realizar pruebas de mutación.
Este tipo de olor genera mucho debate público y odio .
Debemos intercambiar opiniones y valorar cada pro y contra.
Código Olor 102 - Código de flecha
Code Smell 36 - Declaraciones Switch/case/else if/else/if
Cómo deshacerse de los IF molestos para siempre
Foto de Elena Mozhvilo en Unsplash
El mayor problema de los equipos de software es asegurarse de que todos entiendan lo que hacen los demás.
Martín Cazador
Hoy, esperaba un pago en mi billetera. El saldo era 0. Entré en pánico.
TL;DR: nulo no es 0. El error no es 0. solo 0 es 0.
Leí mucho sobre temas de seguridad.
Especialmente en criptografía.
La semana pasada, leí sobre un hilo de piratería criptográfica .
Cuando mi billetera me mostró 0 como saldo, entré en pánico.
Era solo un olor a UX.
La cadena de bloques era inalcanzable 💩
""" Below code is automatically generated by code-davinci-002 on GTP3 Codex 1. check balance with blockchain 2. If blockchain is unreachable show 0 as the balance """ import requests import json def get_balance(address): url = "https://blockchain.info/q/addressbalance/" + address response = requests.get(url) if response.status_code == 200: return response.text else: return 0
""" Below code is automatically generated by code-davinci-002 on GTP3 Codex 1. check balance with blockchain 2. If blockchain is unreachable throw an error """ import requests import json def get_balance(address): url = "https://blockchain.info/q/addressbalance/" + address response = requests.get(url) if response.status_code == 200: return response.text else: raise BlockchainNotReachableError("Error reaching blockchain")
Este es un olor de diseño.
Podemos encontrar patrones cuando se lanza una excepción o un código de retorno y se enmascara con un 0.
Siga siempre el principio del menor asombro como guía.
Code Smell 139 - Código comercial en la interfaz de usuario
Code Smell 73 - Excepciones para casos esperados
Code Smell 72 - Códigos de retorno
Null: El error del billón de dólares
Foto de Jasmin Sessler en Unsplash
Code Smells es solo mi opinión .
Mi verdadera crítica con Null es que trae de vuelta innecesariamente toda la agonía de tener que elegir si ejecutar su programa rápido sin verificar o hacerlo lento con verificación.
Tony Hoare (Inventor nulo)
Grandes citas de ingeniería de software
Asignas un valor a una variable y lo usas pero nunca lo cambias.
TL; DR: sea declarativo sobre la mutabilidad.
Refactorización 003 - Extraer constante
Refactorización 008 - Convertir variables a constantes
Siempre estamos aprendiendo del dominio.
A veces suponemos que un valor puede cambiar con el MAPPER .
Más tarde, nos enteramos de que no cambiará.
Por lo tanto, necesitamos promoverlo a una constante.
Esto también evitará Magic Constants .
<?php function configureUser() { $password = '123456'; // Setting a password on a variable is another vulnerability // And Code Smell $user = new User($password); // Notice Variable doesn't change }
<?php define("USER_PASSWORD", '123456') function configureUser() { $user = new User(USER_PASSWORD); } // or function configureUser() { $user = new User(userPassword()); } function userPassword() : string { return '123456'; } // Case is an oversimplification as usual
Muchos linters verifican si la variable tiene una sola asignación.
También podemos realizar pruebas de mutación e intentar modificar la variable para ver si las pruebas se rompen.
Debemos desafiarnos a nosotros mismos y refactorizar cuando el alcance de la variable sea claro y aprendamos más sobre sus propiedades y mutabilidad .
Code Smell 116 - Variables declaradas con 'var'
Code Smell 127 - Constantes mutables
Code Smell 107 - Reutilización de variables
Code Smell 02 - Constantes y números mágicos
El poder maligno de los mutantes
Code Smells es solo mi opinión .
Foto de Noah Buscher en Unsplash
Invariablemente se descubre que un sistema complejo que funciona ha evolucionado a partir de un sistema simple que funcionó.
Juan Gallo
El desarrollo serio es realizado por muchas personas diferentes. Tenemos que empezar a ponernos de acuerdo.
TL; DR: no mezcle diferentes conversiones de casos
Elija un estándar de caja
Aferrate a ello
Cuando diferentes personas crean software juntas, pueden tener diferencias personales o culturales.
Algunos prefieren camelCase 🐫, otros snake_case 🐍, MACRO_CASE🗣️, y muchos otros .
El código debe ser sencillo y legible.
{ "id": 2, "userId": 666, "accountNumber": "12345-12345-12345", "UPDATED_AT": "2022-01-07T02:23:41.305Z", "created_at": "2019-01-07T02:23:41.305Z", "deleted at": "2022-01-07T02:23:41.305Z" }
{ "id": 2, "userId": 666, "accountNumber": "12345-12345-12345", "updatedAt": "2022-01-07T02:23:41.305Z", "createdAt": "2019-01-07T02:23:41.305Z", "deletedAt": "2022-01-07T02:23:41.305Z" // This doesn't mean THIS standard is the right one }
Podemos informar a nuestros linters sobre los amplios estándares de nombres de nuestra empresa y hacerlos cumplir.
Cada vez que llega gente nueva a la organización, una prueba automatizada debe pedirle cortésmente que cambie el código.
Siempre que necesitemos interactuar con código fuera de nuestro alcance, debemos usar los estándares del cliente, no los nuestros.
Tratar con los estándares es fácil.
Tenemos que hacerlas cumplir.
Code Smell 48 - Código sin estándares
Qué es exactamente un nombre - Parte I La Búsqueda
Todas las convenciones de nomenclatura
Code Smells es solo mi opinión .
Foto de Wolfgang Hasselmann en Unsplash
Si tiene demasiados casos especiales, lo está haciendo mal.
craig cerouni
Maxint es un muy buen número para una identificación inválida. Nunca lo alcanzaremos.
TL;DR: No combine identificaciones reales con identificaciones no válidas. De hecho: Evite las identificaciones.
Modele casos especiales con objetos especiales.
Evite 9999, -1 y 0, ya que son objetos de dominio y acoplamiento de implementación válidos.
Introducir objeto nulo
En los primeros días de la informática, los tipos de datos eran estrictos.
Entonces inventamos El error de los mil millones de dólares .
Luego crecimos y modelamos escenarios especiales con valores especiales polimórficos.
#include "stdio.h" #include "stdlib.h" #include "stdbool.h" #define INVALID_VALUE 999 int main(void) { int id = get_value(); if (id==INVALID_VALUE) { return EXIT_FAILURE; // id is a flag and also a valid domain value } return id; } int get_value() { // something bad happened return INVALID_VALUE; } // returns EXIT_FAILURE (1)
#include "stdio.h" #include "stdlib.h" #include "stdbool.h" // No INVALID_VALUE defined int main(void) { int id; id = get_value(); if (!id) { return EXIT_FAILURE; // Sadly, C Programming Language has no exceptions } return id; } get_value() { // something bad happened return false; } // returns EXIT_FAILURE (1)
Podemos verificar constantes especiales y valores especiales en el código.
Deberíamos usar números para relacionarnos con los identificadores externos.
Si no existe un identificador externo, entonces no es un número.
Code Smell 120 - Identificaciones secuenciales
Null: El error del billón de dólares
Y2K22 - El error que nos avergüenza
Code Smells es solo mi opinión .
Foto de Markus Spiske en Unsplash
Los insectos acechan en las esquinas y se congregan en los límites.
Boris Beizer
Próximamente llegarán 5 olores de código más...