Ho una situazione in cui voglio chiamare una funzione che richiede un numero di parametri. Questa funzione non viene chiamata direttamente, viene chiamata indirettamente e i parametri vengono delegati più volte. Alcuni parametri aggiuntivi possono essere aggiunti tra i diversi livelli, ma quelli non sono inclusi nell'esempio per semplicità.
In pseudo codice, A
chiama indirettamente la funzionalità che si verifica in C.abc
.
class A {
private B b;
public int abc() {
return b.abc(value1, value2, value3);
}
}
class B {
private C c;
public int abc(int x, int y, int z) {
return c.abc(x, y, z);
}
}
class C {
private int w = 100;
public int abc(int x, int y, int z) {
// Do something with parameters x, y, z, e.g.:
return w + x + y + z;
}
}
Il numero di parametri potrebbe essere diverso di tre, naturalmente: potrebbe essere più piccolo o più grande a condizione che i parametri vengano utilizzati insieme. Talvolta il Introduce Parameter Object
viene consigliato in tale situazione ( qui e qui ).
Sarebbe applicato come segue:
class XYZParameterObject {
private int x, y, z;
public constructor(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
}
public int abc(int w) {
return w + x + y + z;
}
}
class A {
private B b;
public int abc() {
return b.abc(new XYZParameterObject(value1, value2, value3));
}
}
class B {
private C c;
public int abc(XYZParameterObject xyz) {
return c.abc(xyz);
}
}
class C {
private int w = 10;
public int abc(XYZParameterObject xyz) {
// Do something with parameters x, y, z, e.g.:
return xyz.abc(this.w);
}
}
Per me sembra che una classe sia progettata attorno a un solo metodo, mentre non ha alcun comportamento. In realtà sarebbe come passare una chiusura invece di creare un'istanza XYZParameterObject
. In entrambe le situazioni i parametri x, y, z sono ridotti a un solo parametro. Entrambi sembrano abusare di una classe solo per non dover passare gli stessi argomenti più e più volte. D'altra parte, ciò sarebbe in qualche modo conveniente, naturalmente!
Quindi qual è una pratica consigliabile in una situazione del genere?