RodrigoToroIcarte / IIC2113-2023-1

6 stars 0 forks source link

Entregar atributos privados a otras clases #168

Open fsazo opened 1 year ago

fsazo commented 1 year ago

Hola! Si tengo los atributos de una clase privados pero hago métodos dentro de la clase para entregar esos atributos a otras clases, estaría violando el principio de que los atributos deben ser privados?

RodrigoToroIcarte commented 1 year ago

Depende del caso. La discusión relevante es la del cap 6.

Considerando que se trata de una clase propiamente tal, se espera que los atributos sean privados. También se recomiendo no llegar y usar getters y setters para esos atributos (es decir, métodos públicos que te permitan ver y modificar los valores de tus atributos). Esto tiene sentido porque poner getters y setters es casi como dejar los atributos públicos.

En vez de eso, la idea es que representemos la clase usando métodos de alto nivel. Estos métodos pueden ser pedirle a la clase que "haga algo" o que nos "diga algo". Por ejemplo, digamos que tenemos una clase Player con un atributo arsenal y otro atributo hand. Una opción es poner getters para ambos y así poder manipular tanto arsenal como hand desde fuera de la clase. Si Player es una estructura de datos no hay problema. Pero si se trata de una clase entonces no deberíamos hacer eso.

Si Player es una clase entonces la idea es que agreguemos métodos de alto nivel para poder manipular al Player sin conocer los detalles de su implementación (como sus atrubutos). Por ejemplo, podemos agregar un método Draw(...) que pase una carta del arsenal al hand. Y también un método GetCardInfos(...) que retorne una lista de strings con la información de las cartas para ser mostradas en consola. Lo interesante es que en este caso no se retorna el atributo hand o arsenal. Se retorna una lista con lo que el cliente necesita. Esto nos da la libertad de, a futuro, cambiar la representación de hand y arsenal sin romper el código del cliente... pues el cliente solo necesita que los métodos Draw(...) y GetCardInfos(...) sigan funcionando.

El tema es que, a veces, lo que necesita el cliente es exactamente el valor que tenemos guardado en un atributo. En esos casos uno está medio obligado a agregar un getter. Básicamente el mensaje central del capítulo no es que los getters y setters son malos. Pero hay que pensar bien si amerita usarlos, siendo conscientes de que nos quitan flexibilidad al exponer libremente el valor de algún atributo de la clase.

fsazo commented 1 year ago

Me quedó super claro. Muchas gracias!