Codice completo (2 ° ed.) dice:
"Se passi un parametro a una routine, usalo. Se non lo stai usando, rimuovi i parametri dall'interfaccia di routine."
Tuttavia, in passato, a volte dovevo farlo. Considera il seguente esempio:
Supponiamo di avere una classe base astratta chiamata Food
, contenente una pura funzione virtuale chiamata getEaten
. Deriviamo da due classi separate:
class Apple : public Food
{
void getEaten(const Utensil &utensil);
// otherstuff
};
e
class Soup : public Food
{
void getEaten(const Utensil &utensil);
// otherstuff
};
Quando chiamiamo mySoup.getEaten(spoon)
, la funzione utilizza il parametro spoon
per eseguire l'azione. Tuttavia, una mela non ha bisogno di un utensile, e in quei casi devo inviare un utensile fittizio a myApple.getEaten(emptyUtensil)
.
Sì, è brutto e ha il sovraccarico di creare e passare inutilmente un oggetto fittizio. Posso generalizzare il problema in questo modo:
"Quando abbiamo due concetti, che sono rappresentati come due classi, si applica la stessa azione su uno di essi, e uno ha bisogno di più informazioni rispetto all'altro quando si richiede di eseguire tali azioni, io tendo a passare informazioni fittizie al meno informazioni richiedendo oggetti. "
Quindi le mie domande sono:
1) Come possiamo cambiare il design di questo esempio un po 'sciocco, in modo da non dover passare l'utensile fittizio?
2) Se c'è una semplice soluzione alla prima domanda, ci sarebbe un modo per generalizzarlo al problema generalizzato sopra (come le soluzioni come "in quei casi creare una nuova x in modo che interagisca con la meno informante classe esigente come questa "ecc.)