2012-03-30 19 views
19

que tenían un método como este que sus consumidores están llamando:¿Es esto una mala práctica sobrecargar un método?

static public void DisplayOrderComments(param1, param2, param3, param4) 

Ahora añade una sobrecarga de esta manera:

static public void DisplayOrderComments(param1, param2, param3, param4, param5) 
{ 
    DisplayOrderComments(param1, param2, param3, param4); 
    param5.Foo(); 
} 

¿Es una mala práctica? ¿Hay mejores formas de hacerlo?

+0

Esto debería estar en [programadores] (http://programmers.stackexchange.com) o incluso [codereview] (http: //codereview,stackexchange.com). –

Respuesta

27

Esto es absolutamente correcto: mantiene el código DRY y evita la duplicación innecesaria.

No solo no es una mala práctica, es una buena práctica de .


Si está usando C# 4.0 y superior (VS 2010+), se puede utilizar un optional argument para su param5 en lugar de sobrecarga, como menciona Mikey Mouse en this answer.

+0

+1 para el argumento opcional – KindDragon

20

Buena pregunta.

Yo diría que no, es una sobrecarga normal. pero voy a cambiarlo como tal (ha puesto en práctica en la que tiene la mayoría de los parámetros):

static public void DisplayOrderComments(param1, param2, param3, param4) 
{ 
    DisplayOrderComments(param1, param2, param3, param4, null); 
} 

static public void DisplayOrderComments(param1, param2, param3, param4, param5) 
{ 
    ... // do the work 
    if(param5!=null) 
    param5.Foo(); 
} 
+1

Esta estrategia también tiene el efecto secundario de facilitar el acceso a los idiomas que no tienen sobrecarga, como Javascript, ya que usarán este formulario. –

+0

@smackfu, de hecho, se desaconsejan los parámetros opcionales, que no sean el uso con interfaces COM. No lo recomiendo – Aliostad

4

No, en absoluto. Esto es perfectamente aceptable, pero hay dos problemas.

  1. param5 se puede pasar como nulo: es posible que desee escribir un código para verificar esa condición y hacer lo correcto.
  2. Esto le impedirá usar parámetros opcionales más adelante. Pero es posible que no te importe eso.

Por cierto codereview.stackexchange.com podría ser un lugar mejor para este tipo de pregunta.

6

Sí, no diría que es malo, pero si está utilizando C# 4.0, le recomendaría hacer el último parámetro opcional.

Usted puede leer todo acerca de ellos aquí http://msdn.microsoft.com/en-us/library/dd264739.aspx

+2

+1 para parámetros opcionales. – Oded

+0

Los parámetros opcionales no se recomiendan para la API pública – Sujeewa

+0

@Sujeewa ¿Por qué? Si simplifican el código como en el ejemplo anterior, por qué no usarlos. La respuesta aceptada también los recomienda. –

2

Ésta es también la práctica bienes comunes para proporcionar más fácil de usar API para una interfaz. Mantiene interfaz de pequeña con el método de múltiples parámetros, sino que utiliza múltiples métodos de extensiones (a veces con el mismo nombre) que proporcionan más fácil de usar API de interfaz sin contaminar:

interface ILog 
{ 
    void Log(string message, int someNumber, float anotherParam, object moreParams); 
} 

public static class LogExtensions 
{ 
    public void Log(ILog this log, message) 
    { 
     log.Log(message, 42, 0, null); 
    } 
// more methods using ILog.Log like LogFormat that takes format string... 
} 
1

diría que depende de lo que DisplayOrderComments y param5.Foo () hace. Si hace param.Foo() para los parámetros 1 a 4, entonces absolutamente, si no lo hace, entonces está haciendo algo extra, que posiblemente valga la pena su propio nombre.

¿Está cambiando lo que DisplayOrerComments hace o los efectos secundarios, o solo las condiciones bajo las cuales se ejecuta? Si está presentando nuevos efectos secundarios, puede valer la pena tenerlos como su función/nombre que llama a DisplayOrderComments.

Cuestiones relacionadas