Encapsular colección.
Una clase contiene un campo de colección y un getter y un setter simples para trabajar con la colección.
Haz que el valor devuelto por el getter sea de solo lectura y crea métodos para añadir o eliminar elementos de la colección.
##Example
##Why Refactor
Una clase contiene un campo que contiene una colección de objetos. Esta colección podría ser un array, una lista, un conjunto o un vector. Se han creado un getter y un setter normales para trabajar con la colección.
Pero las colecciones deberían usarse mediante un protocolo algo distinto del que se emplea para otros tipos de datos. El método getter no debería devolver el propio objeto de la colección, ya que eso permitiría a los clientes cambiar el contenido de la colección sin el conocimiento de la clase propietaria. Además, mostraría demasiado de las estructuras internas de los datos del objeto a los clientes. El método para obtener los elementos de la colección debería devolver un valor que no permita modificar la colección ni revele datos excesivos sobre su estructura.
Además, no debería existir un método que asigne un valor a la colección. En su lugar, debería haber operaciones para añadir y eliminar elementos. Gracias a esto, el objeto propietario gana control sobre la adición y eliminación de elementos de la colección.
Un protocolo así encapsula adecuadamente una colección, lo que en última instancia reduce el grado de asociación entre la clase propietaria y el código cliente.
##Benefits
-
El campo de colección queda encapsulado dentro de una clase. Cuando se llama al getter, este devuelve una copia de la colección, lo que evita modificar o sobrescribir accidentalmente los elementos de la colección sin el conocimiento de la clase que la contiene.
-
Si los elementos de la colección están contenidos en un tipo primitivo, como un array, creas métodos más cómodos para trabajar con la colección.
-
Si los elementos de la colección están contenidos en un contenedor no primitivo (una clase de colección estándar), al encapsular la colección puedes restringir el acceso a métodos estándar no deseados de la colección (por ejemplo, restringiendo la adición de nuevos elementos).
##How to Refactor
-
Crea métodos para añadir y eliminar elementos de la colección. Deben aceptar elementos de la colección en sus parámetros.
-
Asigna una colección vacía al campo como valor inicial si esto no se hace en el constructor de la clase.
-
Localiza las llamadas al setter del campo de colección. Cambia el setter para que use las operaciones de añadir y eliminar elementos, o haz que esas operaciones llamen al código cliente.
Ten en cuenta que los setters solo pueden usarse para reemplazar todos los elementos de la colección por otros. Por tanto, puede ser aconsejable cambiar el nombre del setter (Renombrar método) a replace.
-
Localiza todas las llamadas al getter de la colección tras las cuales se modifica la colección. Cambia el código para que use tus nuevos métodos de añadir y eliminar elementos de la colección.
-
Cambia el getter para que devuelva una representación de solo lectura de la colección.
-
Inspecciona el código cliente que usa la colección en busca de código que quedaría mejor dentro de la propia clase de la colección.