2010-03-31 7 views
7

Supongamos que tengo dos funciones que se parecen a esto:código de repetición: Llamar a funciones con un poco diferentes firmas

public static void myFunction1(int a, int b, int c, string d) 
{ 
    //dostuff 
    someoneelsesfunction(c,d); 
    //dostuff2 
} 

public static void myFunction2(int a, int b, int c, Stream d) 
{ 
    //dostuff 
    someoneelsesfunction(c,d); 
    //dostuff2 
} 

¿Cuál sería una buena manera de evitar hacerTarea repetida?

ideas que he pensado, pero no me gustan:

  1. que podría hacer d un objeto y fundido en RUNTYPE en función del tipo, pero esto me parece no ser ideales; elimina una comprobación de tipo que estaba ocurriendo previamente en el momento de la compilación.
  2. También podría escribir una clase auxiliar privada que tome un objeto y escriba ambas firmas como funciones públicas.
  3. Podría reemplazar dostuff y dostuff2 con delegados o llamadas a funciones o algo así.
+0

Definitly # 2 ... 1 –

Respuesta

4

yo podría hacer algo como esto:

public static void myFunction1(int a, int b, int c, string d) 
{ 
    //dostuff 
    someoneelsesfunction(c, d); 
    //dostuff2 
} 

public static void myFunction2(int a, int b, int c, Stream d) 
{ 
    string str = d.ReadEntireString(); // no such method, but basically 
     // whatever you need to do to read the string out of the stream 
    myFunction1(a, b, c, str);  
} 

... y cambiar el nombre de las dos funciones a MyFunction (para tomar ventaja de la sobrecarga, lo que es lo mismo que está haciendo someoneelsesfunction()

. NOTA: esta solución no sería práctica si la cadena contenida en Stream es descomunal. De ser así, es posible que desee hacerlo al revés: lea la cadena d en una secuencia y llame a la anulación con el parámetro de secuencia

+0

Ack, me siento tonto. Esto no es realmente lo que hace el código real, pero aplica casi el mismo principio. – Brian

+0

Por cierto, otra opción es envolver una cadena en un 'MemoryStream'. – Brian

+0

@Brian: sí, eso es lo que quise decir con mi última edición (leer la cadena en la transmisión). – MusiGenesis

6

Simplemente refactorice "doStuff" y "doStuff2" en métodos separados.

Obviamente están haciendo "cosas" que están separadas del método "someoneelsesfunction", por lo que deben ser métodos separados de todos modos. Cada método debería tener una tarea, idealmente.

Esto es incluso una refactorización admitida en Visual Studio: simplemente resalte el código en "dostuff", y haga clic con el botón secundario, y elija Refactorizar -> Extraer método.

+0

para "Deben ser métodos separados de todos modos" – Kane

+1

también 1 para "Refactor-> Extraer método" sugerencia. –

+0

En el código real, no creo que 'dostuff',' dostuff2', y 'someonelsesfuction' realmente pertenezcan a métodos separados.De hecho, creo que el código sería mucho menos legible si lo hiciera. – Brian

0

Comenzaré extrayendo los métodos DoStuff y DoStuff2 y llamándolos desde ambas funciones.

Podrías empezar a obtener funky envolviendo el bloque en otro método y pasando la función de alguien a usar para ese método, pero eso es un paso demasiado lejos. desea que las cosas sean fáciles de leer y cambiar, y que no contengan repetición.

1

Eventualmente puede crear

public static void myFunction3(int a, int b, int c, Stream d, string e) 

que se llamará a partir function1 y function2 con juego de D o E en nulo. Entonces function3 distinguiría entre llamadas a la función de alguien (c, d). Es una solución posible, pero para desesperados :)

+0

+1 para contrarrestar los votos negativos inevitables. En mi humilde opinión, esto no es funcionalmente peor que la sobrecarga. – MusiGenesis

+0

gracias por entender el riesgo ;-) – twk

+0

No hubo downvotes: P – Brian

3

Utilice Action para personalizar lo que hace una función en un lugar específico.

public void myF1(int a, int b, int c, int d) 
{ 
    internalF(a, b, { someelse1(c, d); }); 
} 
public void myF2 (int a, int b, int c, Stream d) 
{ 
    internalF(a, b, { someelse2(c, d); }); 
} 
private void internalF (int a, int b, Action action) 
{ 
    // dostuff 
    action(); 
    // dostuff2 
} 
+0

genial :) Me gusta – twk

Cuestiones relacionadas