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 - XXIX) aquí
Continuemos...
Los comentarios son un código Olor. Los captadores son otro olor a código. ¿Adivina qué?
TL; DR: No use captadores. No comentes captadores
Hace unas décadas, solíamos comentar todos los métodos. Incluso los triviales.
El comentario debe describir solo una decisión crítica de diseño.
pragma solidity >=0.5.0 <0.9.0; contract Property { int private price; function getPrice() public view returns(int) { /* returns the Price */ return price; } }
pragma solidity >=0.5.0 <0.9.0; contract Property { int private _price; function price() public view returns(int) { return _price; } }
Podemos detectar si un método es getter y tiene un comentario.
La función necesita un comentario, que accidentalmente es un captador y el comentario está relacionado con una decisión de diseño.
No comentes captadores.
No agregan ningún valor real e inflan su código.
Code Smell 05 - Abusadores de comentarios
Code Smell 01 - Modelos anémicos
Foto de Reimond de Zuñiga en Unsplash
El código debe ser notablemente expresivo para evitar la mayoría de los comentarios. Habrá algunas excepciones, pero deberíamos ver los comentarios como una "falta de expresión" hasta que se demuestre lo contrario.
Roberto Martín
Grandes citas de ingeniería de software
Las clases de utilidad son geniales para recopilar protocolo.
TL; DR: no agregue protocolo accidental a sus clases
Refactorización 007 - Extraer clase
Tendemos a poner un protocolo en la primera clase que encontramos.
Eso no es un problema.
Solo tenemos que refactorizar.
public class MyHelperClass { public void print() { } public void format() { } // ... many methods more // ... even more methods public void persist() { } public void solveFermiParadox() { } }
public class Printer { public void print() { } } public class DateToStringFormatter { public void format() { } } public class Database { public void persist() { } } public class RadioTelescope { public void solveFermiParadox() { } }
La mayoría de los linters cuentan los métodos y nos advierten.
Code Smell 124 - Cambio divergente
Code Smell 143 - Grupos de datos
Code Smell 94 - Demasiadas importaciones
Code Smell 34 - Demasiados atributos
Dividir clases y protocolo es una buena práctica para favorecer objetos pequeños y reutilizables.
Foto de Marcin Simonides en Unsplash
No hay código tan grande, retorcido o complejo que el mantenimiento no pueda empeorar.
Gerald M Weinberg
Compramos deuda para nuestro futuro yo. Es tiempo de venganza.
TL; DR: No deje TODO en su código. ¡Arreglalos!
Nos encontramos con TODO en nuestro código. Los contamos.
Rara vez lo abordamos.
Empezamos con la deuda técnica.
Luego pagamos la deuda + los intereses.
Unos meses después, pagamos más intereses que la deuda original.
public class Door { private Boolean isOpened; public Door(boolean isOpened) { this.isOpened = isOpened; } public void openDoor() { this.isOpened = true; } public void closeDoor() { // TODO: Implement close door and cover it } }
public class Door { private Boolean isOpened; public Door(boolean isOpened) { this.isOpened = isOpened; } public void openDoor() { this.isOpened = true; } public void closeDoor() { this.isOpened = false; } }
Podemos contar TODOs.
Podemos contar TODOs.
La mayoría de los linters lo hacen.
Necesitamos la política para reducirlos.
Si estamos usando TDD, escribimos el código que falta de inmediato.
En este contexto, las TODO solo son válidas cuando se realiza un desarrollo Primero en profundidad para recordar los caminos abiertos para visitar.
Foto de Eden Constantino en Unsplash
Después de terminar el primer 90 % de un proyecto, debe terminar el otro 90 %.
miguel abrash
Nuestro código es más robusto y legible. Pero escondemos NULL debajo de la alfombra.
TL; DR: Evite Nulos e indefinidos. Si los evita, nunca necesitará Opcionales.
Encadenamiento opcional, opcionales, coalescencia y muchas otras soluciones nos ayudan a lidiar con los infames nulos.
No hay necesidad de usarlos una vez que nuestro código es maduro, robusto y sin valores nulos.
const user = { name: 'Hacker' }; if (user?.credentials?.notExpired) { user.login(); } user.functionDefinedOrNot?.(); // Seems compact but it is hacky and has lots // of potential NULLs and Undefined
function login() {} const user = { name: 'Hacker', credentials: { expired: false } }; if (!user.credentials.expired) { login(); } // Also compact // User is a real user or a polymorphic NullUser // Credentials are always defined. // Can be an instance of InvalidCredentials // Assuming we eliminated nulls from our code if (user.functionDefinedOrNot !== undefined) { functionDefinedOrNot(); } // This is also wrong. // Explicit undefined checks are yet another code smell
Esta es una función de idioma .
Podemos detectarlo y eliminarlo.
Muchos desarrolladores se sienten seguros contaminando el código con transacciones nulas.
De hecho, esto es más seguro que no tratar los NULL en absoluto.
Los valores nulos , verdaderos y falsos también son olores de código.
Necesitamos apuntar más alto y hacer un código más limpio.
Lo bueno : elimine todos los valores nulos de su código.
Lo malo : usa el encadenamiento opcional.
Lo feo : no tratar nulos en absoluto.
Code Smell 145 - Truco de cortocircuito
Code Smell 69 - Big Bang (Castings ridículos de JavaScript)
Null: El error del billón de dólares
Cómo deshacerse de los IF molestos para siempre
Foto de engin akyurt en Unsplash
El que pelea con monstruos debe tener cuidado de no convertirse en un monstruo. Y si miras por mucho tiempo a un abismo, el abismo también te mira a ti.
Nietzsche
Cada desarrollador compara los atributos por igual. Están equivocados.
TL; DR: No exporte y compare, solo compare.
La comparación de atributos se usa mucho en nuestro código.
Tenemos que centrarnos en el comportamiento y las responsabilidades.
Es responsabilidad de un objeto compararlo con otros objetos. No el nuestro.
Los optimizadores prematuros nos dirán que esto tiene menos rendimiento.
Deberíamos pedirles evidencia real y contrastar la solución más mantenible.
if (address.street == 'Broad Street') { if (location.street == 'Bourbon St') { // 15000 usages in a big system // Comparisons are case sensitive
if (address.isAtStreet('Broad Street') { } // ... if (location.isAtStreet('Bourbon St') { } // 15000 usages in a big system function isAtStreet(street) { // We can change Comparisons to // case sensitive in just one place. }
Podemos detectar comparaciones de atributos utilizando árboles de sintaxis.
Puede haber buenos usos para tipos primitivos como con muchos otros olores.
Necesitamos poner las responsabilidades en un solo lugar.
Comparar es uno de ellos.
Si algunas de nuestras reglas comerciales cambian, debemos cambiar un solo punto .
Code Smell 63 - Envidia de características
Code Smell 101 - Comparación con booleanos
Code Smell 122 - Obsesión primitiva
Foto de Piret Ilver en Unsplash
El comportamiento es lo más importante del software. Es de lo que dependen los usuarios. A los usuarios les gusta cuando agregamos comportamiento (siempre que sea lo que realmente querían), pero si cambiamos o eliminamos el comportamiento del que dependen (introducimos errores), dejan de confiar en nosotros.
Michael plumas
Artículo siguiente: 5 olores de código más.