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).
Olores de código anteriores
Puedes encontrar todos los olores del código anterior (Parte i - XXXI) aquí .
Continuemos...
Code Smell 156 - Implícito Else
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.
Problemas
- Legibilidad
- Carga cognitiva
- Condiciones imprevistas
- Violación del principio Fail Fast
Soluciones
- Escribe el else explícito
Contexto
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.
Código de muestra
Equivocado
function carBrandImplicit(model) { if (model === 'A4') { return 'audi'; } return 'Mercedes-Benz'; }
Bien
function carBrandExplicit(model) { if (model === 'A4') { return 'audi'; } if (model === 'AMG') { return 'Mercedes-Benz'; } // Fail Fast throw new Exception('Model not found); }
Detección
- [x] Automático
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.
Etiquetas
- Condicionales
Conclusión
Este tipo de olor genera mucho debate público y odio .
Debemos intercambiar opiniones y valorar cada pro y contra.
Relaciones
Código Olor 102 - Código de flecha
Code Smell 36 - Declaraciones Switch/case/else if/else/if
Más información
Cómo deshacerse de los IF molestos para siempre
Créditos
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
Código Olor 157 - Saldo a 0
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.
Problemas
- nulos
- experiencia de usuario
- usabilidad
Soluciones
- Haga una distinción clara entre un Cero y un error.
Contexto
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 💩
Código de muestra
Equivocado
""" 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
Bien
""" 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")
Detección
- [x] manuales
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.
Etiquetas
- experiencia de usuario
Conclusión
Siga siempre el principio del menor asombro como guía.
Relaciones
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
Más información
Null: El error del billón de dólares
Crédito
Foto de Jasmin Sessler en Unsplash
Descargo de responsabilidad
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
Code Smell 158 - Variables no variables
Asignas un valor a una variable y lo usas pero nunca lo cambias.
TL; DR: sea declarativo sobre la mutabilidad.
Problemas
- Legibilidad
- Honra la mutabilidad de Biyección .
- Posibles problemas de rendimiento y memoria.
Soluciones
- Cambie la variable a una constante y sea claro en su alcance.
Refactorizaciones
Refactorización 003 - Extraer constante
Refactorización 008 - Convertir variables a constantes
Contexto
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 .
Código de muestra
Equivocado
<?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 }
Bien
<?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
Detección
- [x] Automático
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.
Etiquetas
- Mutabilidad
Conclusión
Debemos desafiarnos a nosotros mismos y refactorizar cuando el alcance de la variable sea claro y aprendamos más sobre sus propiedades y mutabilidad .
Relaciones
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
Más información
El poder maligno de los mutantes
Descargo de responsabilidad
Code Smells es solo mi opinión .
Créditos
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
CÓDIGO OLOR 159 - MIXED_CASEI
El desarrollo serio es realizado por muchas personas diferentes. Tenemos que empezar a ponernos de acuerdo.
TL; DR: no mezcle diferentes conversiones de casos
Problemas
- Legibilidad
- mantenibilidad
Soluciones
Elija un estándar de caja
Aferrate a ello
Contexto
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.
Código de muestra
Equivocado
{ "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" }
Bien
{ "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 }
Detección
- [x] Automático
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.
Excepciones
Siempre que necesitemos interactuar con código fuera de nuestro alcance, debemos usar los estándares del cliente, no los nuestros.
Etiquetas
- Denominación
Conclusión
Tratar con los estándares es fácil.
Tenemos que hacerlas cumplir.
Relaciones
Code Smell 48 - Código sin estándares
Más información
Qué es exactamente un nombre - Parte I La Búsqueda
Todas las convenciones de nomenclatura
Descargo de responsabilidad
Code Smells es solo mi opinión .
Créditos
Foto de Wolfgang Hasselmann en Unsplash
Si tiene demasiados casos especiales, lo está haciendo mal.
craig cerouni
Código Olor 160 - Id no válido = 9999
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.
Problemas
- Violación de biyección .
- Es posible que llegue a la identificación no válida antes de lo que piensa.
- Tampoco utilice valores nulos para identificaciones no válidas.
- Acoplamiento de banderas de la persona que llama a las funciones.
Soluciones
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
Contexto
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.
Código de muestra
Equivocado
#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)
Bien
#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)
Detección
- [x] Semiautomático
Podemos verificar constantes especiales y valores especiales en el código.
Etiquetas
- Nulo
Conclusión
Deberíamos usar números para relacionarnos con los identificadores externos.
Si no existe un identificador externo, entonces no es un número.
Relaciones
Code Smell 120 - Identificaciones secuenciales
Más información
Null: El error del billón de dólares
Y2K22 - El error que nos avergüenza
Descargo de responsabilidad
Code Smells es solo mi opinión .
Créditos
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...