TOP
¿Qué es la refactorización?
Descripción
Refactorización (Refactoring) – cambios realizados en la estructura interna del software (software) para que sea más fácil de entender y más rápido de modificar sin cambiar el comportamiento externo. Además, es una reestructuración del software mediante la aplicación de una secuencia de refactorizaciones sin cambiar el comportamiento externo del software.
Ventajas de la refactorización:
- La refactorización mejora el diseño del software. Con el tiempo, se realizan muchos cambios adicionales en el código y el software pierde su estructura con el tiempo. La pérdida de estructura tiene un efecto acumulativo. Cuanto más difícil es ver el diseño en el código, más difícil es conservarlo y más rápido se desmorona. Además, dichos cambios provocan redundancia y duplicación de código, lo que hace que el sistema sea más difícil de comprender y modificar.
- La refactorización hace que el código de software sea más comprensible.
Cuando necesitas hacer una refactorización:
- Cuando se agrega una nueva característica;
- Cuando se corrige (arregla) un error;
- Durante la revisión del código.
Malos olores en el código. (Smells Catalog) :
- Duplicación de código
- método largo
- gran clase
- Una larga lista de parámetros
- Modificaciones divergentes
- tiroteo
- Características envidiosas
- bloques de datos
- Obsesión por los tipos elementales
- Switch operadores
- Jerarquías paralelas de imitación
- clase perezosa
- Comunidad especulativa (teórica)
- Campo temporal
- Hilos de mensajes
- Agente
- Proximidad inapropiada
- Clases alternativas con diferentes interfaces.
- clase de biblioteca incompleta
- Clases de datos
- Comentarios
Posibles opciones de refactorización
-
Moving Features Between Objects (Transferencia de código completo entre objetos):
- Move Method (Método resaltado) – aislar un método separado si el método es demasiado largo o contiene un código que requiere comentarios.
- Move Field (Campo en movimiento) – se realiza cuando el campo es utilizado por otra clase con más frecuencia que donde está definido.
-
Organizing Data (Disposición de datos):
- Encapsulate Field (Encapsulación del campo) - Uno de los principios fundamentales de la programación orientada a objetos es la encapsulación y ocultación de datos. Al hacer públicos los datos, los objetos pueden leer y cambiar sus valores sin el conocimiento del propietario de los datos. Por lo tanto, cerramos dicho campo y proporcionamos métodos de acceso.
- Encapsulate Collection (Encapsulación de la colección) - a menudo el aula contiene una colección de especímenes. Esta colección puede ser una matriz, una lista, un conjunto o un vector. El método getter no debe devolver el objeto de la colección en sí, porque eso permitiría a los clientes modificar el contenido de la colección sin el conocimiento del propietario. Por lo tanto, debe hacer que el valor devuelto por el método sea de solo lectura y crear métodos para agregar o eliminar elementos.
-
Composing Methods (Extrayendo y combinando código):
- Extract Method (Método resaltado) – si hay un fragmento de código que se puede agrupar, colóquelo en un método separado con un número que explique su propósito. Por lo tanto, el nombre del método reemplazará los comentarios.
- Inline Method (Método de incrustación) – a veces es útil mover el cuerpo de un método al código que lo llama. En ocasiones, los cuerpos de los métodos se explican por sí mismos como el nombre propio del método. También puede surgir una situación en la que hay muchos métodos diferentes, cuya estructura no tiene esxito y por lo tanto, es mejor agruparlos todos en un método general y luego separar los métodos de otra manera.
- Inline Temp (Inserción de una variable temporal) – sustitución de una variable temporal a la que se asigna una expresión simple una sola vez. A veces, dicha variable interfiere con otras refactorizaciones.
- Replace Temp with Query (Reemplazar una variable temporal con una llamada a un método) – se utiliza cuando se utiliza una variable temporal para almacenar el valor de una expresión. En este caso, reemplazamos la expresión con un método y reemplazamos todas las referencias en el código a esta variable con el nuevo método.
- Split Temporary Variable (Dividiendo una variable temporal) – se aplica si se utiliza una única variable temporal para asignar múltiples resultados a diferentes resultados (a menos que sea una variable utilizada en un bucle dentro de un bucle y no sea una variable para acumular el resultado). En este caso, creamos una variable separada para cada asignación.
-
Simplifying Conditional Expressions (Simplificando expresiones con condiciones):
- Decompose Conditional (Descomposición del operador condicional) – ejecutado cuando tenemos una cadena de cheques condicional (si-entonces-si no). Reemplazamos la conditionio (si), partes de entonces y demás con métodos separados. Contribuir a una mejor comprensión del motivo de la bifurcación y los nombres de los métodos aclaran el propósito del fragmento de código correspondiente.
- Consolidate Conditional Expression (Consolidación de expresión condicional) - se lleva a cabo si hay varias corrobaciones de estado que dan el mismo resultado. Debes combinar todas las comprobaciones en una expresión única o método condicional.
- Consolidate Duplicate Conditional Fragments (Consolidación de fragmentos condicionales duplicados) – el mismo fragmento está presente en todas las ramas de la expresión condicional. Debe mover este fragmento de código fuera de esta expresión.
- Remove Control Flag (Eliminando la banda de control) – existe una variable que actúa como indicador de control para una serie de expresiones lógicas. Usamos BREAK o RETURN en su lugar.
- Replace Conditional with Polymorphism (Reemplazando el operador condicional con polimorfismo) – se realiza cuando hay un operador condicional cuyo comportamiento depende del tipo de objeto. Es necesario mover cada rama del operador condicional a un método superbarcado de la subclase. Haga que el código fuente sea abstracto.