Un metodo di interfaccia implementato da una classe dovrebbe sempre utilizzare tutti i parametri? Per interfaccia non intendo necessariamente%% effettivo di%, queste potrebbero essere altre classi (astratte) anch'esse estese.
A volte trovo difficile usare tutti i parametri in tutte le implementazioni. Tuttavia, questo mi sembra un cattivo design. Mi fa pensare al mantra interfaces
.
Questo si applica in particolare nelle situazioni in cui il comportamento (parzialmente) opzionale - come i flag precedentemente impostati sull'istanza dell'oggetto - viene rifatto in un approccio che utilizza il polimorfismo.
In pseudo codice:
interface ValueProcesser {
public Value doSomethingWithValue(value, parameter1, parameter2);
}
class Implementation1 implements ValueProcesser {
// Does nothing - no optional behavior applies in here.
public Value doSomethingWithValue(Value value, parameter1, parameter2) {
return value;
}
}
class Implementation2 implements ValueProcesser {
// Behavior that only uses the first parameter
public Value doSomethingWithValue(Value value, parameter1, parameter2) {
doSomethingWithValueUsingParameter1(value, parameter1);
return value;
}
}
class Implementation3 implements ValueProcesser {
public Value doSomethingWithValue(Value value, parameter1, parameter2) {
doSomethingWithValueUsingParameter1AndParameter2(value, parameter1, parameter2);
return value;
}
}
Ora per il codice cliente con un'istanza perfection is achieved not when there is nothing more to add, but when there is nothing left to take away
, è davvero facile chiamare semplicemente:
public void main() {
ValueProcesser.doSomethingWithValue(value, parameter1, parameter2);
}
e tutto funzionerà. La domanda è: se i parametri inutilizzati vengono rifattorizzati in qualche modo e in che modo posso fare un refactoring per eliminare la loro ridondanza?
Per la cronaca, non ha senso impostare quei parametri come membri delle classi ValueProcesser
.