Cómo disciplinar su código con refactorización (incluye ejemplos de PHP)
Publicado: 2021-06-22Como muchas otras cosas en la vida, nuestro código también necesita algo de disciplina. Estoy bastante seguro de que ningún desarrollador en el mundo quiere escribir código sucio. Sin embargo, todavía existe un código sucio. Puede surgir debido a varias razones: puede deberse a la presión comercial, la falta de documentación, la falta de interacción entre los miembros del equipo o la incompetencia del desarrollador. Se deben tomar las medidas necesarias para hacer que el código sea más limpio y evitar problemas que puedan surgir en el futuro debido a esto. Afortunadamente, podemos abordar estos problemas con una técnica disciplinada para reestructurar el código llamado Refactorización .
La refactorización es una técnica para mejorar la estructura interna del código fuente del programa existente y mantener su comportamiento externo. Es un procedimiento paso a paso para mejorar el código, que de otro modo nos costará mucho tiempo y esfuerzo.

Desventajas del código impuro
Expandir el tamaño del código fuente agregando nuevos programas sin refactorizar durante mucho tiempo hace que el código sea desordenado y sucio. Hace que el mantenimiento y el desarrollo posterior del proyecto sean muy difíciles. El código sucio tiene muchas desventajas:
- Aumenta el costo de mantenimiento del proyecto.
- Agregar nuevas funciones lleva mucho tiempo y, a veces, resulta imposible agregarlas.
- Ralentiza la introducción de nuevas personas al proyecto.
- Contiene código duplicado.
- No pasa todas las pruebas.
Hay muchas otras desventajas, pero estos problemas le cuestan mucho dinero y tiempo a la organización.
Ventajas del código limpio
El código limpio y disciplinado tiene sus propias ventajas:
- No contiene código duplicado.
- Pasa todas las pruebas.
- Hace que el código sea más legible y más fácil de comprender.
- Hace que el código sea más fácil de mantener y menos costoso.
Las ventajas del código limpio son muchas. El proceso de convertir un código sucio y desordenado en un código limpio más fácil de mantener se llama proceso de refactorización.
Proceso de refactorización
La refactorización debe realizarse como una serie de pequeños cambios, cada uno de los cuales mejora ligeramente el código existente y permite que el programa continúe ejecutándose sin romperlo. Después de la refactorización, el código debería volverse más limpio que antes. Si permanece impuro, entonces no tiene sentido refactorizar. Es solo una pérdida de tiempo y esfuerzo. No se debe agregar ningún código nuevo durante la refactorización para crear una nueva funcionalidad. Debería pasar todas las pruebas después de la refactorización.
Cuando refactorizar
La refactorización debe realizarse cuando:
- Agregar código duplicado al proyecto. Debido a que el código duplicado es difícil de mantener y los cambios en un lugar pueden requerir actualizaciones en muchos otros lugares.
- Añadiendo una característica. La refactorización facilita la adición de nuevas funciones.
- Al corregir un error, debe refactorizar porque hará que el error se descubra automáticamente.
- La revisión del código es la última etapa de la refactorización del código antes de implementar los cambios en producción.
Lidiar con los olores del código
Los problemas en el código a veces se denominan olores de código. Estos son los problemas abordados durante la refactorización. Son más fáciles de encontrar y reparar.
Por ejemplo:
- Grandes métodos y clases con los que es muy difícil trabajar.
- Uso incompleto o incorrecto del concepto de programación orientada a objetos.
- Código que dificulta agregar cambios.
- Código duplicado y obsoleto en el proyecto.
- Código altamente acoplado.
Técnicas de refactorización
Las técnicas de refactorización son los pasos que se toman para refactorizar el código. Algunas de las técnicas de refactorización son:
1. El método de extracción
// Problema

function printInvoice() { $this->printHeader(); // Print details. print("name: " . $this->name); print("amount " . $this->getPrice()); }// Solución
function printInvoice() { $this->printBanner(); $this->printDetails($this->getPrice()); } function printDetails($price) { print("name: " . $this->name); print("amount " . $outstanding); }Si tiene un fragmento de código que se puede agrupar, agregue un nuevo método para esa parte del código y reemplace el código anterior. Hace que el código esté más aislado y elimina la duplicación.
2. Extraer variable
// Problema
if (($student->getMarksinMath() > 60) && ($student->getMarksInPhysics() > 60) && ($student->getMarksinChemistry() > 60) && $this->pass) { // do something }// Solución
$mathResult = $student->getMarksinMath() > 60; $physicsResult = $student->getMarksinPhysics() > 60; $chemistryResult = $student->getMarksinChemistry() > 60; $hasPassed = $this->pass; if ($mathResult && $physicsResult && $chemistryResult && $hasPassed) { // do something }Para expresiones grandes como la que se muestra en el problema, que es muy difícil de entender, se pueden crear diferentes variables para cada expresión. Hace que el código sea más legible. Pero este método debe aplicarse con precaución. Sin embargo, tiene sus propias desventajas. El código se ejecutará incluso si la condición es falsa, lo cual no es el caso en el problema.
3. El método en línea
// Problema
function printResult() { return ($this->getResult()) ? “Pass” : “Fail”; } function getResult() { return $this->totalMarks > 300; }// Solución
function getRating() { return ($this->totalMarks > 300) ? “Pass” : “Fail”; }Cuando el cuerpo del método sea más obvio, utilice esta técnica. Reemplace el método con el contenido del método y elimine el método. Minimiza el número de métodos no deseados.
4. Temp. En línea
// Problema
$mathMark = $student->getMathResult(); return $mathMark > 60;// Solución
return $student->getMathResult() > 60;Si hay una variable temporal no deseada que solo contiene el resultado de la expresión, elimine la variable con la expresión en sí. Ayuda a deshacerse de variables innecesarias.
5. Reemplazar matriz con objeto
// Problema
$row = []; $row[0] = "Virat Kohli"; $row[1] = 70;// Solución
$row = new Player(); $row->setName("Virat Kohli"); $row->setNumberofCentury(70);Si hay una matriz con varios tipos de datos, reemplácela con un objeto. Porque los campos de una clase son más fáciles de documentar y mantener que las matrices con varios tipos de datos.
6. Método parametrizado
// Problema
function fivePercentRaise() { } function tenPercentRaise() { }// Solución
function raise(percent) { }Si varios métodos realizan una acción similar en los datos, reemplace todos los métodos con un método y pase los datos como argumento (s). Elimina métodos duplicados y redundantes.
7. Separe la consulta del modificador
// Problema
function getInterest() { $this->interestAmount = $this->principal * 10 / 100; return $this->interestAmount; }// Solución
function setInterest() { $this->interestAmount = $this->principal * 10 / 100; } function getInterest() { return $this->interestAmount; }Si un método devuelve valor y cambia el objeto, divida los dos métodos. Uno para modificación y otro para devolver el resultado. Elimina la posibilidad de modificación involuntaria de un objeto.
