Devo apportare modifiche in una classe che ha molti membri, che sono impostati da una funzione che implementa alcuni algoritmi, e quindi vengono letti da qualche altra funzione che implementa qualche altro algoritmo.
class Clazz{
private int[] someArray1;
private string[] someOtherArray2;
.
.
.
.
private DataStructure[] someArray10;
public Output createOutput(Input input){
algorithm1(input);
return createOutput();
}
private void algorithm1(Input input){
//many conditions and loops which change the data structures someArray1 ... someArray10
}
private Output algorithm2(){
//many conditions and loops which read (or change?) the data from the data structures and finally produce another data structure.
}
}
Voglio rifattorizzare questa implementazione in modo che tutte le funzioni possibili diventino "funzionali", in modo che non abbiano effetti collaterali e restituiscano un risultato ben definito nel valore restituito.
La soluzione immediata che ho trovato è quella di creare molti oggetti di% co_de nidificati che contengono i campi di ciascuna funzione e passare questi contesti da una funzione all'altra.
class Context10 {
private DataStructure[] someArray10;
/*ctor, get, set*/
}
class Context2 {
private string[] someOtherArray2;
private Context10 context10;
/*ctor, get, set*/
}
.
.
.
class Context {
private int[] someArray1;
private Context2 context2;
/*ctor, get, set*/
}
class Clazz{
public Output createOutput(Input input){
Context context = algorithm1(input);
return createOutput(context);
}
private Context algorithm1(Input input){
Context10 context10 = foo(input);
Context2 context2 = bar(context10, input);
Context2 context2_1 = baz(context2, context10, input);
.
.
.
Context returnContext = createReturnContext(context2, context10);
return returnContext;
}
private Output algorithm2(Context context){
/* use the data structures in the context to produce the output. */
}
}
Questa soluzione sembra essere ingombrante e non troppo efficiente.
C'è qualche tecnica per affrontare questo tipo di classi?