Pergunta

Em outras palavras, não é correto usar:

public class CustomerList : System.Collections.Generic.List<Customer>
{
    /// supposed to be empty
}

em vez de:

using CustomerList = System.Collections.Generic.List<Customer>

Eu prefiro usar a primeira abordagem porque eu tinha acabado de definir CustomerList uma vez, e cada vez que eu precisava de uma lista de clientes que eu sempre usar o mesmo tipo. Por outro lado, usando o nome de abordagem aliasing não só me obriga a ter de redefini-lo em todos os lugares, mas também um alias diferente poderia ser dada cada vez que alguém queria usá-lo (pense em um time grande), e, portanto, causa o código para ser menos legível.

Por favor, note que a intenção, neste caso, nunca seria estender a classe, só para criar um alias.

Foi útil?

Solução

Não faça isso. Quando as pessoas lêem:

List<Customer> 

imediatamente compreendê-lo. Quando lêem:

CustomerList

eles têm que ir e descobrir o que um CustomerList é, e que torna seu código mais difícil de ler. A menos que você é o único a trabalhar em sua base de código, escrever código legível é uma boa idéia.

Outras dicas

Bem, a menos que você está adicionando algumas funcionalidades para a classe base não há nenhum ponto na criação de um objeto wrapper. Eu iria com o número dois, se você realmente precisa, mas porque não basta criar uma variável?

List<Customer> customerList = new List<Customer>();

Eu concordo com o não usando um alias dessa maneira. Ninguém em sua equipe deve usar aliases na forma apresentada; Não é o aliasing motivo foi fornecido. Além disso, a partir da forma como os genéricos trabalho, há sempre apenas uma classe List, não importa quantos lugares você usá-lo.

Além de simplesmente declarando e usando List<Customer>, você vai, eventualmente, quer passar essa lista para outra coisa. Evite passar o List<Customer> concreto e em vez passar uma IList<Customer> ou ICollection<Customer> pois isso fará com que esses métodos mais resistente e mais fácil de programa contra.

Um dia, no futuro, se você realmente precisa de uma classe de coleção CustomerList, você pode implementar ICollection<Customer> ou IList<Customer> sobre ele e continuar a passá-lo para esses métodos sem eles alterar ou mesmo saber melhor.

Na verdade, você não deve usar qualquer um. A abordagem correta de acordo com as diretrizes de design de estrutura, quer seja para uso ou herdar do System.Collections.ObjectModel.Collection em APIs públicas (List só deve ser usado para a implementação interna).

Mas no que diz respeito à questão específica da nomeação, a recomendação parece ser a de usar o nome de tipo genérico directamente sem aliasing, a menos que você precisa para adicionar funcionalidade para a coleção:

Do Coleção retorno de objeto modelos para fornecer simples padrão baunilha coleção API.

Do retornar uma subclasse de Collection a partir de modelos de objecto para fornecer De alto nível do conjunto de API.

Usando a herança de fazer aliasing / typedefing tem o problema de exigir que você redefinir os construtores relevantes.

Uma vez que vai rapidamente tornar-se razoável fazer isso em todos os lugares, provavelmente é melhor evitá-lo por uma questão de coerência.

Este é um daqueles 'Depende' perguntas.

Se o que você precisa é de uma nova classe que se comporta como uma lista de clientes, além de suas outras necessidades, então a herança é o caminho.

Se você só quer usar uma lista de clientes, em seguida, usar a variável.

Se você está apenas tentando salvar a digitação, em seguida, usar o último. Você não vai correr em quaisquer problemas bizarros herança que maneira.

Se você realmente deseja expor um tipo de coleção logicamente distintos, em seguida, usar o antigo - você pode voltar e adicionar coisas a ele então.

Pessoalmente, eu iria usar apenas List<Customer> e chamá-lo um dia.

I essencialmente de acordo com Ed. Se você não precisa realmente estender a funcionalidade da construção Lista genérico, basta usar uma lista genérica:

List<Customer> customerList = new List<Customer>();

Se você precisa fazer para estender a funcionalidade, em seguida, normalmente você estaria olhando herança.

A terceira possibilidade é onde você precisa mudou significativamente a funcionalidade da construção lista genérica, caso em que você pode querer simplesmente herdar de IEnumerable. Ao fazê-lo fazer o utilizável classe em operações enumeráveis ??(como "foreach"), mas permite que você defina completamente todo o comportamento da classe.

poupança Um programador de digitação poderia muito bem ser pesadelo de manutenção do próximo programador. Eu diria que basta digitar o genérico corretamente, como muitos aqui têm dito. É uma descrição mais precisa do seu código mais limpo e é intenção, e ele vai ajudar o programador de manutenção. (Quem poderia ser você, seis meses e quatro novos projetos na estrada!)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top