Por que deveríamos preferencialmente usar coleções de primeira classe?

14

Como regra número 4 de Objetos de Calistenia por Jeff Bay (RTF) no The ThoughtWorks Anthology, é recomendado que se deve " Usar coleções de primeira classe ".

Rule 4: First class collections

Application of this rule is simple: any class that contains a collection should contain no other member variables. Each collection gets wrapped in its own class, so now behaviors related to the collection have a home. You may find that filters become a part of this new class. Also, your new class can handle activities like joining two groups together or applying a rule to each element of the group.

O que eu pude entender a partir disso foi que deveríamos usar uma classe separada encerrando a coleção e com métodos para adicionar, excluir dados de modificação daquela coleção.

e precisamos disso para termos certeza de qual tipo de dados vai para a coleção e o que sai.

No caso de usarmos uma coleção genérica (nos idiomas em que é aplicável), precisamos seguir esta regra?

Se eu estiver perdendo um significado importante, por favor, esclareça.

    
por Amogh Talpallikar 12.03.2012 / 15:00
fonte

3 respostas

12

Segurança de tipo é uma razão muito pequena para usar coleções de primeira classe. Do seu link:

Rule 4: First class collections Application of this rule is simple: any class that contains a collection should contain no other member variables. Each collection gets wrapped in its own class, so now behaviors related to the collection have a home. You may find that filters become a part of this new class. Also, your new class can handle activities like joining two groups together or applying a rule to each element of the group.

A ideia aqui é se você estiver procurando, filtrando, validando ou qualquer coisa além da semântica de adicionar / remover / iterar em uma coleção, o código está pedindo para você colocá-lo em sua própria classe. Se você precisar atualizar apenas um valor (após uma pesquisa), isso provavelmente ocorrerá na classe de coleção.

O raciocínio para isso é bem simples, as coleções tendem a ser repassadas. Logo, 4 classes diferentes possuem seu próprio método SearchByID() . Ou você obtém valores de retorno como Map<Integer, String> com o contexto do que está armazenado no mapa removido. Uma coleção de primeira classe é uma solução simples que custa um único arquivo de origem. Na prática, uma vez que eles estão no lugar (eles são muito fáceis de escrever testes de unidade também), qualquer alteração que lide com a coleção é fácil de lidar, como quando SearchByID precisa de um GUID em vez de um int. / p>     

por 12.03.2012 / 15:35
fonte
8

... use a separate class wrapping up the collection and with methods to add,delete modify data of that collection

Isso faz muito mais do que garantir o tipo dos objetos armazenados nas coleções, mas também garante quaisquer invariantes de coleção.

As árvores (vermelho-preto, AVL, etc.) são sensíveis ao pedido e seu comportamento depende do reequilíbrio quando apropriado. O desempenho da tabela de hash também dependerá do re-hashing apropriado. Você quer se lembrar de verificar o fator de carga toda vez que inserir em um mapa de hash?

FWIW, o texto é bem claro sobre isso (e eu vou editar tudo na sua pergunta, então ninguém mais precisa baixar o RTF):

Each collection gets wrapped in its own class, so now behaviors related to the collection have a home

Nada a ver com tipos (ou, portanto, genéricos), tudo relacionado à associação do comportamento da coleção com seus dados.

    
por 12.03.2012 / 15:35
fonte
1

A resposta simples é "Não" se você estiver usando uma linguagem que suporte Generics. Porque não há necessidade de verificar o tipo, pois o próprio recurso de linguagem faz um bom trabalho (Da minha experiência em genéricos Java).

Mas se você tiver alguma situação em que deseje personalizar a estrutura de dados fornecida a partir da linguagem, será possível criar uma classe wrapper em torno da estrutura de dados original e expor suas próprias APIs e ainda usar a implementação subjacente da estrutura de dados original.

    
por 12.03.2012 / 15:23
fonte