20 historias con 5 olores de código cada una son 100 olores de código, ¿verdad? Olores de código anteriores Parte I Parte II Parte III Parte IV Parte V Parte VI Parte VII Parte VIII Parte IX Parte X Parte XI Parte XII Parte XIII Parte XIV Parte XV Parte XVI Parte XVII Parte XVIII Parte XIX Continuemos... Code Smell 96 - Mis objetos No posees objetos. TL; DR: no use como prefijo de nombre. mi Problemas falta de contexto Falla de biyección Soluciones Eliminar prefijo. mi Cambie a un rol que sugiera un nombre. Contexto Varios tutoriales antiguos usan la palabra 'mi' como un nombre perezoso. Esto es vago y conduce a errores de contexto. Código de muestra Equivocado MainWindow myWindow = Application.Current.MainWindow as MainWindow; Derecha MainWindow salesWindow = Application.Current.MainWindow as MainWindow; /* Since window is instanciated, we are currently working with a specialized window playing a special role */ Detección Automático [x] Podemos decirle a nuestros linters y verificadores estáticos que busquen este prefijo y nos adviertan. Etiquetas Denominación Conclusión Evite usar . Los objetos cambian según el contexto de uso. mi Más información ¿Qué es exactamente un nombre? Parte II Rehabilitación Créditos Foto de en Michał Bożek Unsplash Pensando en mi experiencia de modificar código, veo que paso mucho más tiempo leyendo el código existente que escribiendo código nuevo. Si quiero que mi código sea barato, por lo tanto, debería hacerlo fácil de leer. Kent Beck Grandes citas de ingeniería de software Code Smell 97 - Mensajes de error sin empatía Debemos tener especial cuidado con las descripciones de errores para los usuarios (y para nosotros mismos). TL; DR: use descripciones significativas y sugiera acciones correctivas. Problemas El principio de la menor sorpresa Soluciones Usar mensajes de error declarativos Mostrar acciones de salida claras Contexto Los programadores rara vez son expertos en UX. También subestimamos el hecho de que podemos estar en ambos lados del mostrador. Código de muestra Equivocado alert("Cancel the appointment?", "Yes", "No"); // No consequences // Options not clear Derecha alert("Cancel the appointment? \n" + "You will lose all the history", "Cancel Appointment", "Keep Editing"); // Consequences are clear // Choice options have context Detección manuales [x] Necesitamos leer todos los mensajes de excepción en las revisiones de código. Etiquetas Excepciones experiencia de usuario Conclusión Necesitamos pensar en nuestros usuarios finales al generar una excepción o mostrar mensajes. Créditos Foto de en visuales Unsplash Si bien es un hecho conocido que los programadores nunca cometen errores, sigue siendo una buena idea complacer a los usuarios comprobando los errores en los puntos críticos de su programa. Roberto D. Schneider Code Smell 98 - Errores de ortografía La ortografía y la legibilidad son muy importantes para los humanos y no importantes para las máquinas. TL;DR: Cuida tus nombres. Problemas Legibilidad Más difícil de buscar términos en el código. Soluciones Revisa la ortografía de tu código. Usa un IDE con corrector ortográfico Contexto Muchos de nosotros no hablamos inglés como nuestro primer idioma. Necesitamos tener especial cuidado con nuestros textos y nombres. 😀 Este artículo tiene un error tipográfico en su título como prueba de contexto y también un clickbait Código de muestra Equivocado comboFeededBySupplyer = supplyer.providers(); Derecha comboFedBySupplier = supplier.providers(); Detección Etiquetas Legibilidad Denominación Estilo de código Conclusión Preste mucha atención a sus nombres. Probablemente serás la persona que lea el código en unos meses. Relaciones Code Smell 48 - Código sin estándares Más información ¿Qué es exactamente un nombre? Parte I La Búsqueda ¿Qué es exactamente un nombre? Parte II Rehabilitación Créditos Foto de en Brett Jordan Unsplash Dentro de cada programa grande bien escrito hay un pequeño programa bien escrito. COCHE Hoare Código Olfato 99 - Primero Segundo ¿Cuántas veces vemos nombres de argumentos perezosos? TL; DR: nombre sus argumentos según el rol y no la posición accidental Problemas Legibilidad Nombres que revelan la intención Soluciones Usa nombres significativos Contexto Cuando escribimos métodos, generalmente no nos detenemos para encontrar nombres decentes. Nunca refactorizamos lo obvio, tampoco. Código de muestra Equivocado class Calculator: def subtract(self, first, second): return first - second class CalculatorTest def test_multiply(): assert equals(first, second) Derecha class Calculator: def subtract(self, minuend, subtrahend): return minuend - subtrahend class CalculatorTest def test_multiply(): assert equals(expectedValue, realValue) Detección manuales [x] Podemos advertir sobre palabras prohibidas como 'primero' y 'segundo' como nombres de argumentos. Etiquetas Legibilidad Conclusión Siempre siga la regla que sugiere el parámetro. Nombra a tus colaboradores según el rol. Relaciones Code Smell 65 - Variables nombradas según tipos Más información ¿Qué es exactamente un nombre? Parte II Rehabilitación Créditos Foto de en Priscilla Du Preez Unsplash El código fuente final es el diseño de software real. jack reeves Código Olfato 100 - Ir a GOTO fue considerado dañino hace 50 años TL; DR: Nunca uses GoTo. Problemas Legibilidad Código difícil de seguir Soluciones Reemplace con código estructurado GOTO Usar excepciones Contexto Empecé a programar en Basic. GOTO fue fuertemente abusado allí. Tuve que aprender programación estructurada desde cero en modo Rehab. Código de muestra Equivocado for x < 0 { if x > -1e-09 { goto small } z = z / x x = x + 1 } for x < 2 { if x < 1e-09 { goto small } z = z / x x = x + 1 } if x == 2 { return z } x = x - 2 p = (((((x*_gamP[0]+_gamP[1])*x+_gamP[2])*x+_gamP[3])*x+_gamP[4])*x+_gamP[5])*x + _gamP[6] q = ((((((x*_gamQ[0]+_gamQ[1])*x+_gamQ[2])*x+_gamQ[3])*x+_gamQ[4])*x+_gamQ[5])*x+_gamQ[6])*x + _gamQ[7] return z * p / q small: if x == 0 { return Inf(1) } return z / ((1 + Euler*x) * x) } Derecha for x < 0 { if x > -1e-09 { return small(x, z) } z = z / x x = x + 1 } for x < 2 { if x < 1e-09 { return small(x, z) } z = z / x x = x + 1 } if x == 2 { return z } x = x - 2 p = (((((x*_gamP[0]+_gamP[1])*x+_gamP[2])*x+_gamP[3])*x+_gamP[4])*x+_gamP[5])*x + _gamP[6] q = ((((((x*_gamQ[0]+_gamQ[1])*x+_gamQ[2])*x+_gamQ[3])*x+_gamQ[4])*x+_gamQ[5])*x+_gamQ[6])*x + _gamQ[7] return z * p / q small(x, z) { if x == 0 { return Inf(1) } return z / ((1 + Euler*x) * x) } } Detección Automático [x] En idiomas compatibles con , nuestros linters pueden advertirnos contra su uso. GOTO Etiquetas Legibilidad Conclusión Reconocimos los problemas de GOTO hace unas décadas. El problema sigue presente en como GoLang, PHP, Perl, etc. lenguajes modernos La mayoría de los programadores afortunadamente evitan la sentencia GOTO. El próximo objetivo será considerar el dañino. uso nulo Cortesía XKCD Relaciones Código Olor 12 - Nulo Más información Declaración Goto considerada dañina Wikipedia Créditos Foto de en Jens Johnsson Unsplash Es prácticamente imposible enseñar buena programación a estudiantes que han tenido una exposición previa a BASIC: como programadores potenciales, están mentalmente mutilados sin esperanza de regeneración. Edsger Dijkstra Grandes citas de ingeniería de software Y eso es todo por ahora, hemos alcanzado el hito 100. ¡El próximo artículo explicará 5 olores de código más!