2008-09-29 5 views
5

En otras palabras, ¿es correcto que debe utilizarse:¿Es correcto usar herencia en lugar de alias de nombre en C#?

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

en lugar de:

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

Prefiero utilizar el primer enfoque porque acababa de definir CustomerList una vez, y cada vez que necesitaba una lista de clientes, siempre usaría el mismo tipo. Por otro lado, usar el enfoque de alias de nombre no solo me obliga a tener que redefinirlo en todas partes, sino que también se puede dar un alias diferente cada vez que alguien quiera usarlo (piense en un gran equipo), y así causar que el código ser menos legible

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

Respuesta

6

No lo hagas. Cuando las personas leen:

List<Customer> 

lo entienden de inmediato. Cuando leen:

CustomerList 

tienen que ir y averiguar qué es un CustomerList, y que 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 una código legible es una buena idea.

+1

Este es un argumento estético. Algunos pueden encontrar de una forma u otra más fácil de leer. En este caso, puede ser trivial, pero en casos más complicados comienza a importar más. – Catskul

11

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

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

Estoy de acuerdo con 'solo use una variable', pero no creo que deba abogar por usar un alias en la forma en que @Trap quiere usarlo. –

+0

Es cierto, yo no lo haría, pero no estaba exactamente seguro de por qué tendría que hacerlo, en primer lugar, y esa era la pregunta. –

1

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 la forma.

Si solo desea utilizar una lista de clientes, utilice la variable.

1

Si solo está tratando de ahorrar en la escritura, utilice esta última. No vas a encontrar problemas de herencia extraños de esa manera.

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

Personalmente, simplemente usaría List<Customer> y lo llamaría un día.

1

Estoy esencialmente de acuerdo con Ed. Si no necesita extender efectivamente la funcionalidad de la construcción de lista genérica, sólo tiene que utilizar una lista genérica:

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

Si necesita ampliar la funcionalidad entonces típicamente se estaría buscando a la herencia.

La tercera posibilidad es cuando necesita una funcionalidad significativamente modificada desde la construcción de la lista genérica, en cuyo caso es posible que desee simplemente heredar de IEnumerable. De hacerlo, haz que la clase se pueda usar en operaciones enumerables (como "foreach") pero te permite definir completamente el comportamiento de clase.

1

El ahorro de un programador en mecanografiar podría ser la pesadilla de mantenimiento del siguiente programador. Yo diría que simplemente escribe el genérico correctamente, como tantos 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 camino!)

3

En realidad, usted no debe usar cualquiera de los dos. El correct approach according to the framework design guidelines is to either use or inherit from System.Collections.ObjectModel.Collection<T> en API públicas (Lista <T> solo debe utilizarse para la implementación interna).

Pero en lo que respecta a la cuestión específica de la denominación, la recomendación parece ser la de utilizar el nombre de tipo genérico directamente sin aliasing a menos que necesite agregar funcionalidad a la colección:

No volver Colección <T> desde el objeto modelos para proporcionar API estándar colección vainilla.

hace volver una subclase de Colección <T> de modelos de objetos para proporcionar API colección de alto nivel.

4

Estoy de acuerdo con no usando un alias de esa manera. Nadie en tu equipo debería usar alias de la manera presentada; no es la razón por la que se proporcionó el aliasing. Además, por la forma en que funcionan los genéricos, solo hay una sola clase de lista, sin importar en cuántos lugares la use.

Además de simplemente declarar y usar List<Customer>, eventualmente querrá pasar esa lista a otra cosa. Evite pasar el concreto List<Customer> y en su lugar pase 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 ella y seguir pasándola a esos métodos sin que cambien o incluso que sepan mejor.

3

Usar la herencia para hacer aliasing/typedefing tiene el problema de requerirle que redefina los constructores pertinentes.

Dado que rápidamente se volverá irracional hacerlo en todas partes, probablemente sea mejor evitarlo por consistencia.

Cuestiones relacionadas