franciscogazitua / IIC2113-2024

Consultas sobre el proyecto en las Issues
4 stars 0 forks source link

[E4][Clean Code] Duda sobre Objects and Data Structures #215

Open RonaldoSosa opened 4 days ago

RonaldoSosa commented 4 days ago

Hola! Una consulta sobre objects and data structures, por lo que tengo entendido las clases deben representar un objeto, escondiendo su estructura interna y exponiendo abstracciones, o una estructura de datos, que expone su estructura interna sin implementar funcionalidades importantes, entonces quería saber si yo tengo una clase(clase jefe) la cual tiene como atributo privado otra clase que es una estructura de datos, y entonces a través de algunos métodos expone algunos de los valores de la estructura de datos, la clase jefe se consideraría una clase hibrída? En general la mayoría de mis métodos devuelven un valor obtenido al usar algunos de los atributos de la clase que se comporta como estructura de datos pero que se le aplicaron ciertas funcionalidades pero un par de métodos solo devuelven el valor tal cual. Mi sutuación es más o menos la siguiente.

public class ClassChief {

 private TypeClass _data;

 public TypeValue GetSomeoneValue()
 {
        //Realizo acciones con información de _data
 }

 public TypeValue GetSomeoneValue2() => _data.Value2;

}

cahinostroza commented 4 days ago

Depende de muchas cosas si es un híbrido o no.

En primer lugar, ¿estás seguro que esa clase no representa una DS? Para eso tienes que analizar los métodos que no son como GetSomeoneValue2, por ejemplo, si TypeClass se ve así:

public class TypeClass {
    public int[] Value1;
    public int Value2;
}

Y ChiefClass se ve así:

public class ChiefClass {
    private TypeClass _data;

    public string[] GetSomeoneValue()
    {
        return _data.Value1.Select(x => x.ToString()).ToArray();
    }

    public int GetSomeoneValue2() => _data.Value2;
}

ChiefClass es una DS y de hecho, es innecesaria, porque GetSomeoneValue podría estar en TypeClass.

Si es que llegas a que ChiefClass es una clase que tiene métodos del estilo DoSomething, en el cual llamas a más de un método privado, creas clases complejas y/o existen varias formas de implementarlas. La pregunta es si ChiefClass es un híbrido o un objeto.

Para eso, debes analizar los métodos del estilo DoSomething, si DoSomething utiliza los atributos Value1, Value3, no tiene sentido que ChiefClass tenga el método GetSomeoneValue2, porque si ChiefClass es un objeto, nosotros queremos cambiar la implementación de DoSomething cuando queramos, eso incluye, no utilizar la DS TypeClass y utilizar otra DS o incluso, ninguna DS, pero el método GetSomeoneValue2 te estaría impidiendo ese cambio.

Esto va más allá aún, tu sólo deberías tener métodos Get en tus clases que representan objetos, sólo si tu puedes cambiar la implementación de esa clase. Como algo así:

public class Units {
    private List<Unit> _units;

    public void AddUnit(Unit unit) {
        _units.Add(unit);
    }

    public int GetUnitsCount() {
        return _units.Count;
    }
}

Yo puedo cambiar List por ListArray y el GetUnitsCount no me amarra a una implementación particular, incluso si tuviese algo así:

public class Units {
    private List<Unit> _units;
    private int _count;

    public void AddUnit(Unit unit) {
        _units.Add(unit);
        _count++;
    }

    public int GetUnitsCount() {
        return _count;
    }
}