É correto usar a herança em vez do nome aliasing em c #?
-
02-07-2019 - |
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.
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
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!)