Pregunta

En otras palabras, ¿es correcto utilizar:

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

en lugar de:

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

Prefiero usar el primer enfoque porque solo definiría CustomerList una vez y cada vez que necesitara una lista de clientes siempre usaría el mismo tipo.Por otro lado, usar el enfoque de alias de nombres no sólo me obliga a tener que redefinirlo en todas partes, sino que también se podría dar un alias diferente cada vez que alguien quisiera usarlo (piense en un equipo grande) y, por lo tanto, hacer que el código ser menos legible.

Tenga en cuenta que la intención en este caso nunca sería extender la clase, solo crear un alias.

¿Fue útil?

Solución

No lo hagas. Cuando la gente lee:

List<Customer> 

lo entienden de inmediato. Cuando leen:

CustomerList

tienen que ir y descubrir qué es una CustomerList, y eso hace que su código sea más difícil de leer. A menos que sea el único que trabaje en su base de código, escribir código legible es una buena idea.

Otros consejos

bueno, a menos que esté agregando alguna funcionalidad a la clase base, no tiene sentido crear un objeto contenedor. Iría con el número dos si realmente lo necesita, pero ¿por qué no simplemente crear una variable?

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

estaría de acuerdo con no usando un alias de esa manera.Nadie en su equipo debería utilizar alias en la forma presentada;no es la razón por la que se proporcionó el alias.Además, por la forma en que funcionan los genéricos, solo hay una clase List sin importar en cuántos lugares la uses.

Además de simplemente declarar y usar List<Customer>, eventualmente querrás pasar esa lista a otra cosa.Evite pasar el concreto. List<Customer> y en su lugar pasar un IList<Customer> o ICollection<Customer> ya que esto hará que esos métodos sean más resistentes y más fáciles de programar.

Un día en el futuro, si realmente necesita una clase de colección CustomerList, puede implementar ICollection<Customer> o IList<Customer> en él y continuar pasándolo a esos métodos sin que cambien o incluso sepan mejor.

En realidad no deberías usar tampoco. El el enfoque correcto de acuerdo con las pautas de diseño del marco es usar o heredar de System.Collections.ObjectModel.Collection < T > en API públicas (List < T > solo debe usarse para implementación interna).

Pero con respecto al problema específico de los nombres, la recomendación parece ser usar el nombre de tipo genérico directamente sin alias, a menos que necesite agregar funcionalidad a la colección:

  

Devuelve Collection < T > del objeto   modelos para proporcionar llano estándar   API de colección de vainilla.

     

Devuelve una subclase de Collection < T >   de modelos de objetos para proporcionar   API de colección de alto nivel.

El uso de la herencia para hacer alias / typedefing tiene el problema de requerir que redefina los constructores relevantes.

Dado que rápidamente se volverá irracional hacer eso en todas partes, probablemente sea mejor evitarlo por razones de consistencia.

Esta es una de esas preguntas "depende".

Si lo que necesita es una nueva clase que se comporte como una Lista de Clientes además de sus otros requisitos, entonces la herencia es el camino.

Si solo quiere usar una lista de clientes, use la variable.

Si solo estás intentando ahorrar al escribir, usa este último.De esa manera no te encontrarás con ningún problema extraño de herencia.

Si realmente desea exponer un tipo de colección lógicamente distinto, utilice el primero; luego puede regresar y agregarle cosas.

Personalmente, solo usaría List<Customer> y llámalo un día.

Estoy esencialmente de acuerdo con Ed. Si no necesita extender la funcionalidad de la construcción de Lista genérica, simplemente use una Lista genérica:

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

Si necesita ampliar la funcionalidad, normalmente buscaría la herencia.

La tercera posibilidad es cuando necesita cambiar significativamente la funcionalidad de la construcción de lista genérica, en cuyo caso es posible que simplemente desee heredar de IEnumerable. Al hacerlo, la clase se puede usar en operaciones enumerables (como & Quot; foreach & Quot;) pero le permite definir completamente todo el comportamiento de la clase.

El ahorro de un programador en escribir podría muy bien ser la pesadilla de mantenimiento del siguiente programador. Yo diría que simplemente escriba el genérico correctamente, como muchos aquí han dicho. Es más limpio y una descripción más precisa de la intención de su código, y ayudará al programador de mantenimiento. (¡Quién podría ser usted, seis meses y cuatro nuevos proyectos en el futuro!)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top