ConstructiCat Logo
CodeBust.
Browse section ▾

Encapsular Coleção.

Problem

Uma classe contém um campo de coleção e um getter e setter simples para trabalhar com a coleção.

Solution

Torne o valor retornado pelo getter somente leitura e crie métodos para adicionar/remover elementos da coleção.

##Example

Antes
Person +getCourses() : Set+setCourses(courses: Set)
Depois
Person getCourses() : UnmodifiableSetaddCourse(course : Course)removeCourse(course : Course)

##Why Refactor

Uma classe contém um campo que contém uma coleção de objetos. Essa coleção pode ser um array, lista, conjunto ou vetor. Um getter e setter normais foram criados para trabalhar com a coleção.

Mas as coleções devem ser usadas por meio de um protocolo um pouco diferente daquele usado por outros tipos de dados. O método getter não deveria retornar o próprio objeto da coleção, pois isso permitiria que os clientes alterassem o conteúdo da coleção sem o conhecimento da classe proprietária. Além disso, isso exporia em excesso as estruturas internas dos dados do objeto aos clientes. O método para obter os elementos da coleção deveria retornar um valor que não permita alterar a coleção nem revele dados em excesso sobre sua estrutura.

Além disso, não deveria existir um método que atribua um valor à coleção. Em vez disso, deveria haver operações para adicionar e remover elementos. Graças a isso, o objeto proprietário ganha controle sobre a adição e remoção de elementos da coleção.

Esse protocolo encapsula adequadamente uma coleção, o que, em última análise, reduz o grau de associação entre a classe proprietária e o código cliente.

##Benefits

  • O campo de coleção fica encapsulado dentro de uma classe. Quando o getter é chamado, ele retorna uma cópia da coleção, o que evita a alteração ou sobrescrita acidental dos elementos da coleção sem o conhecimento da classe que a contém.

  • Se os elementos da coleção estiverem contidos em um tipo primitivo, como um array, você cria métodos mais convenientes para trabalhar com a coleção.

  • Se os elementos da coleção estiverem contidos em um contêiner não primitivo (classe de coleção padrão), ao encapsular a coleção você pode restringir o acesso a métodos padrão indesejados da coleção (por exemplo, restringindo a adição de novos elementos).

##How to Refactor

  1. Crie métodos para adicionar e remover elementos da coleção. Eles devem aceitar elementos da coleção em seus parâmetros.

  2. Atribua uma coleção vazia ao campo como valor inicial, caso isso não seja feito no construtor da classe.

  3. Encontre as chamadas do setter do campo de coleção. Altere o setter para que ele use as operações de adicionar e remover elementos, ou faça com que essas operações sejam chamadas pelo código cliente.

Observe que os setters só podem ser usados para substituir todos os elementos da coleção por outros. Portanto, pode ser aconselhável alterar o nome do setter (Renomear Método) para replace.

  1. Encontre todas as chamadas do getter da coleção após as quais a coleção é alterada. Altere o código para que ele use seus novos métodos de adicionar e remover elementos da coleção.

  2. Altere o getter para que ele retorne uma representação somente leitura da coleção.

  3. Inspecione o código cliente que usa a coleção em busca de código que ficaria melhor dentro da própria classe de coleção.