Ejemplo
Encontré un código monolítico que hace "todo" en un solo lugar: cargando datos de la base de datos, mostrando el marcado HTML, actuando como un enrutador / controlador / acción. Comencé a aplicar el código de base de datos móvil de SRP en su propio archivo, proporcionando un mejor nombre para las cosas, y todo se veía bien, pero luego comencé a tener dudas sobre por qué estoy haciendo esto.
¿Por qué refactorizar? ¿Cuál es el propósito? ¿Es inútil? ¿Cuál es el beneficio? Tenga en cuenta que en su mayoría dejé el archivo monolítico tal como está, pero refactoricé solo la porción más pequeña que era relevante para el área donde necesitaba hacer algo de trabajo.
Código original:
Para dar un ejemplo concreto, me encontré con este fragmento de código: carga las especificaciones del producto ya sea por una identificación de producto conocida o por una identificación de versión seleccionada por el usuario:
if ($verid)
$sql1 = "SELECT * FROM product_spec WHERE id = " . clean_input($verid);
else
$sql1 = "SELECT * FROM product_spec WHERE product_id = " . clean_input($productid) ;
$result1 = query($sql1);
$row1 = fetch_array($result1);
/* html markup follows */
Refactorización:
Como estoy haciendo un trabajo que requiere que cambie las cosas en esta parte específica del código, lo cambié para usar el patrón de repositorio y lo actualicé para usar las instalaciones MySQL orientadas a objetos:
//some implementation details omitted
$this->repository = new SpecRepository($mysql);
if ($verid)
$row1 = $this->repository->getSpecByVersion($verid);
else
$row1 = $this->repository->getSpecByProductId($productid);
/* html markup follows to be refactored or left alone till another time*/
//added new class:
class SpecRepository extends MySqlRepository
{
function getSpecByVersion(int $verid)
{
return $this->getMySql()->paramQuery("
SELECT * FROM product_spec WHERE id = ?
", $verid)->getSingleArray();
}
function getSpecByProductId(int $productid)
{
return $this->getMySql()->paramQuery("
SELECT * FROM product_spec WHERE product_id = ?
", $productid)->getSingleArray();
}
}
¿Debo hacer esto?
Mirando hacia atrás a los cambios, el código sigue ahí, código con la misma funcionalidad, pero en diferentes archivos, diferentes nombres, lugares, usando un estilo más orientado a objetos en lugar de procedimientos. En realidad, es divertido notar que el código refactorizado se ve mucho más hinchado a pesar de tener la misma funcionalidad.
Preveo algunas respuestas que dicen "si no sabes las razones por las que refactorizas, no lo hagas", y tal vez podría estar de acuerdo. Mis razones son mejorar la calidad del código con el tiempo (y espero que lo haga siguiendo el SRP y otros principios).
¿Son esas buenas razones o estoy perdiendo el tiempo en "reorganizar el código" de esta manera? La refactorización general se siente un poco como pisar agua para ser honesto: lleva tiempo y se vuelve más "separado" en lo que respecta a SRP, pero a pesar de mis buenas intenciones, no siento que esté haciendo mejoras increíbles. Por lo tanto, debatir si es mejor dejar el código como antes y no refactorizar.
¿Por qué refactoré en primer lugar?
En mi caso, estoy agregando nuevas funcionalidades para una nueva línea de productos, por lo que tengo que seguir la estructura de código existente para líneas de productos similares o escribir la mía.
select *
convierte en una "mejor práctica".
Select * from ..
puede considerarse un antipatrón. Ver stackoverflow.com/q/3639861/31326