Profile Image

Carlos Vigueras

Senior Backend Developer

Code Smells – Data Clumps

Hablando en términos de programación orientada a objetos , “Data Clumps” es el nombre que recibe un grupo de variables que se pasan juntas en grupo, a lo largo de varias partes del programa.

Un Data Clumps (grupo de datos), es un indicador de un Code Smells, que recibe ese mismo nombre , y esto puede indicar problemas más profundos con el diseño o con la implementación del programa.

Este grupo de variables que componen un grupo de datos, suelen estar relacionados, pero como resultado, a menudo se utilizan juntos en grupo, ya que juntas tienen un significado concreto.

Este conocido Code Smell puede ser un síntoma de que un código esté mal desarrollado, y esto puede acarrear otros problemas a la hora de que nuestro código evolucione en un futuro.

Cuando detectemos este Code Smell en nuestro código hemos de tener en cuenta que debemos pararnos a analizar que podemos estar haciendo mal, y de que forma podemos modificar el código para que quede mejor estructurado.

Bien sabemos que cuanto más limpio y más legible sea nuestro código, más fácil será entenderlo y modificarlo, y más escalable será nuestro software.

Pero como siempre, vamos a ver un ejemplo de código y su posible refactorización, y de esta forma lo vamos a ver todo mas claro.

Supongamos que vamos a programar una aplicación de alquiler de coches, en la cual, vamos a registrar a un usuario, con su nombre, su DNI, su edad, su número de carnet de conducir, y el periodo de tiempo en el que va a alquilar el coche.

    public class Booking
    {
        public Booking(string name, string dni, int age, string drivingLicence, DateTime from, DateTime to)
        {
            Name = name;
            DNI = dni;
            Age = age;
            DrivingLicence = drivingLicence;
            From = from;
            To = to;
        }

        public string Name { get; set; }
        public string DNI { get; set; }
        public int Age { get; set; }
        public string DrivingLicence { get; set; }
        public DateTime From { get; set; }
        public DateTime To { get; set; }
    }

var booking = new Booking("Carlos", "12345678Z", 22, "0987654567", 
    DateTime.Now, DateTime.Now.AddDays(5));Lenguaje del código: JavaScript (javascript)

Como se puede ver en el ejemplo de arriba, tenemos dos grupos de datos, que se le pasan al constructor de la clase Booking(), y que perfectamente se podrían disociar en dos clases distintas.

Podríamos decir que tenemos dos grupos, por un lado sería el grupo de datos de usuario, y por el otro el grupo de fechas de la reserva, por lo que podríamos proceder a separar cada uno de ellos.

Comencemos con el Usuario:

    public class Booking
    {
        public User User { get; set; }
        public DateTime From { get; set; }
        public DateTime To { get; set; }

        public Booking(User user, DateTime from, DateTime to)
        {
            User = user;
            From = from;
            To = to;
        }

    }Lenguaje del código: JavaScript (javascript)
    public class User
    {
        public string Name { get; set; }
        public string DNI { get; set; }
        public int Age { get; set; }
        public string DrivingLicence { get; set; }

        public User(string name, string dni, int age, string drivingLicence)
        {
            Name = name;
            DNI = dni;
            Age = age;
            DrivingLicence = drivingLicence;
        }
    }Lenguaje del código: JavaScript (javascript)
var booking = new Booking(new User("Carlos", "12345678Z", 22, "0987654567"), 
    DateTime.Now, DateTime.Now.AddDays(5));Lenguaje del código: JavaScript (javascript)

Aquí lo único que hemos hecho es llevarnos el grupo de variables que pertenece al grupo usuario, y meterlas en una clase llamada User, de este modo, User es responsable de validar sus propiedades en cualquier momento, y además esas variables primitivas las dejamos centralizadas en la clase User.

Hagamos lo mismo con el grupo de variables de fecha de reserva.

    public class Booking
    {
        public User User { get; set; }
        public TimeInterval TimeInterval { get; set; }


        public Booking(User user, TimeInterval timeInterval)
        {
            User = user;
            TimeInterval = timeInterval;
        }
    }Lenguaje del código: JavaScript (javascript)
    public class TimeInterval
    {
        public DateTime From { get; set; }
        public DateTime To { get; set; }

        public TimeInterval(DateTime from, DateTime to)
        {
            From = from;
            To = to;
        }
    }Lenguaje del código: JavaScript (javascript)
var booking = new Booking(new User("Carlos", "12345678Z", 22, "0987654567"), 
    new TimeInterval(DateTime.Now, DateTime.Now.AddDays(5)));Lenguaje del código: JavaScript (javascript)

Para TimeInterval hemos hecho lo mismo, hemos agrupado las propiedades primitivas que contenía Booking, ya que es responsabilidad de TimeInterval validar las fechas, que por ejemplo el valor de la variable From no sea inferior a hoy, o cualquier validación que se os pueda ocurrir. De este modo vemos como aplicamos que cada clase asuma la responsabilidad que tiene que tener, que para este caso, es la de validar su propiedades.

Si nos damos cuenta, también hemos cumplido en la clase TimeInterval() la regla número 9 de Object Calisthenics de Evitar mas de dos atributos de instancia

Os dejo en GitHub el repositorio de código que he usado de ejemplo por si queréis echarle un vistazo.

Espero leeros en comentarios vuestra opinión sobre este Code Smell. Gracias.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *