- Llamadas a métodos o funciones que no hacen nada de valor.
No necesariamente malo. Los métodos en una clase base a menudo llaman métodos vacíos que se consideran puntos de anulación para subclases. Ejemplo: UIView de Cocoa Touch tiene un -didAddSubview:método documentado que no hace nada en la versión predeterminada. El -addSubview:método de UIView tiene que llamar -didAddSubview:aunque no haga nada porque las subclases pueden implementarlo para hacer algo. Los métodos que no hacen nada y las razones para ellos deben documentarse, por supuesto.
Si una función / método vacío o inútil está obviamente allí por razones históricas, debe eliminarse. Eche un vistazo a las versiones anteriores del código en su repositorio de código fuente si no está seguro.
- Verificaciones redundantes realizadas en un archivo de clase, objeto o método separado.
Es difícil decir si está bien sin algún contexto. Si las verificaciones se realizan claramente por la misma razón, puede significar que no hay una separación clara de responsabilidades y se requiere una refactorización, especialmente cuando ambas verificaciones dan como resultado la misma acción. Si la acción resultante de ambas comprobaciones no es la misma, entonces las dos comprobaciones probablemente se realicen por diferentes razones, incluso si la condición es la misma, y eso probablemente esté bien.
- si declaraciones que siempre se evalúan como verdaderas.
Hay una gran diferencia entre:
if (1) {
// ...
}
y:
if (foo() == true) {
// ...
}
donde foo()siempre vuelve true.
El primer caso ocurre mucho cuando las personas están depurando. Es fácil usar if (0) {...y eliminar temporalmente un fragmento de código mientras intentas aislar un error, y luego cambiarlo 0a 1para restaurar ese código. El ifdebe ser eliminado una vez que haya terminado, por supuesto, pero es fácil olvidar que paso, o para perder uno o dos si lo ha hecho en varios lugares. (Es una buena idea identificar tales condicionales con un comentario que luego pueda buscar). El único daño es la confusión que puede causar en el futuro; si el compilador puede determinar el valor de la condición en tiempo de compilación, lo eliminará por completo.
El segundo caso puede ser aceptable. Si la condición representada por foo()necesita ser probada desde varios lugares en el código, factorizarla en una función o método separado es a menudo lo correcto, incluso si foo()siempre es cierto en este momento. Si es posible que foo()eventualmente regrese false, entonces aislar esa condición en un método o función es una forma de identificar todos los lugares donde el código depende de esa condición. Sin embargo , hacerlo crea cierto riesgo de que la foo() == falseafección no se pruebe y pueda ocasionar problemas más adelante; la solución es asegurarse de agregar pruebas unitarias que prueben explícitamente el falsecaso.
- Hilos que se desprenden y no hacen nada notable.
Esto suena como un artefacto de la historia, y algo que podría identificarse durante una revisión de código o mediante la elaboración periódica de perfiles del software. Supongo que podría crearse intencionalmente, pero me cuesta imaginar que alguien realmente lo haría a propósito.
if (false) {...}¡Los bloques son geniales para comentar código! </sarcasm>