2011-04-13 14 views
6

Tengo dos métodos:Un parámetro o muchos

BuildThing(Thing a); 
BuildThings(IEnumerable<Thing> things); 

¿Esto es bueno desde el punto de vista código limpio? ¿O tal vez sería mejor usar BuildThings y pasar IEnumerable con solo una cosa? O usa params?

Gracias.

Respuesta

6

mi preferencia personal es el siguiente

interfaz:

void Build(Thing thing); 
void Build(IEnumerable<Thing> things); 

aplicación:

void Build(Thing thing) 
{ 
    Build(new [] { thing }); 
} 

void Build(IEnumerable<Thing> things) 
{ 
    //do stuff 
} 

la razón por la que prefiero utilizar este patrón se debe a que se asegura de que se quede DRY mientras ofreciéndole la flexibilidad de tener múltiples sobrecargas, a diferencia de la forma params donde debería convertir cualquier matriz que no sea enumerable a una matriz.

0

Puramente desde el punto de vista de "código limpio", esto está perfectamente bien. Aunque funcionalmente, las alternativas podrían o no ser adecuadas para ti. Por ejemplo, usar params obliga a que la colección se enumere antes de la llamada en lugar de enumerarse perezosamente dentro de la llamada.

5

Hay una cosa que puede hacer:

BuildThings(params Thing[] things); 

que le permite utilizar:

BuildThings(thing1, thing2, thing3, ...); 
2

params no sería una buena solución para sus métodos.

Creo que está bien tener sus 2 o más métodos siempre y cuando solo tenga una implementación.

public void BuildThing(Thing a) 
{ 
    this.BuildThings(new List<Thing>(){a}); 
} 
1

Los métodos que ha proporcionado parecen una buena práctica. Puede haber diferentes cosas que le gustaría hacer cuando solo está creando una sola instancia en lugar de varias instancias.

No utilizaría params porque eso obliga a crear una matriz, si tiene una lista, por ejemplo.

0

yo consideraría dos casos:

  1. que tienen esos dos métodos, pero en BuildThing(Thing a) me gustaría utilizar BuildThings(IEnumerable<Thing> things) y pasar IEnumerable con una sola cosa
  2. crear sólo un método con el params Esta opción tiene un inconveniente - debe convertir cada IEnumerable en Array (excepto en matrices, por supuesto) si desea pasar más de un argumento.

Yo iría con params solución probablemente.

Cuestiones relacionadas