paint-brush
Cómo encontrar las partes apestosas de su código [Parte XXXII]por@mcsee
806 lecturas
806 lecturas

Cómo encontrar las partes apestosas de su código [Parte XXXII]

por Maximiliano Contieri9m2023/03/08
Read on Terminal Reader

Demasiado Largo; Para Leer

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 Puede encontrar todos los olores de código anteriores (Parte i - XXXI) aquí.
featured image - Cómo encontrar las partes apestosas de su código [Parte XXXII]
Maximiliano Contieri HackerNoon profile picture

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

Soluciones

  1. 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

Dejar de usar Implícito Else

Cuándo usar Implícito Else

Fallar rapido

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

  1. 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

Código Olor 12 - Nulo

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

  1. 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

  1. Elija un estándar de caja


  2. 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


  • 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

  1. Modele casos especiales con objetos especiales.


  2. Evite 9999, -1 y 0, ya que son objetos de dominio y acoplamiento de implementación válidos.


  3. 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

Código Olor 12 - Nulo

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...