Riduce la produttività facendo credere a Microsoft che sia corretto progettare funzioni con 10 o 12 parametri, quindi praticamente nessuno potrà mai avvicinarsi o imparare a usarle senza l'aiuto di (qualcosa di simile) Intellisense.
Modifica: Ok, diamo un'occhiata all'esempio di CreateAnimatedSprite
. In primo luogo, un nome di funzione con due verbi è un segno quasi certo di scarsa separazione delle preoccupazioni - cioè, hai una singola funzione che fa davvero due cose. Il nostro primo passo è quello di risolvere il problema in modo da ottenere un CreateSprite
(o, dal momento che apparentemente viene caricato da un file, probabilmente dovrebbe essere LoadSprite
) e un AnimateSprite
. Per il momento, supponiamo anche che @Mason sia sbagliato, e hai davvero bisogno di tutti quei parametri - ma quando abbiamo separato le preoccupazioni in modo decente, apparentemente abbiamo lasciato qualcosa del tipo:
sprite LoadSprite(std::string filename, int imageHeight, int imageWidth);
void AnimageSprite(sprite s, int frameWidth, int frameHeight, int numColumns, bool isLooped);
Dal mio conteggio, ora abbiamo il conto alla rovescia dei parametri fino a un massimo di 5 - metà del numero che ho menzionato come eccessivo.
Lo considererei comunque a corto di ideale. Prima di tutto, sconsiglio di usare un bool
come parametro di funzione nei casi più . Basta dare un'occhiata a una chiamata alla funzione, non è immediatamente ovvio a cosa farebbe riferimento a true
o false
. Sarebbe meglio avere qualcosa del tipo:
enum {LOOP, NOLOOP};
Quando qualcuno sta leggendo una chiamata alla funzione, LOOP
è molto più significativo di true
. A seconda della situazione, ci sono un paio di altre possibilità da considerare. Uno userebbe l'orientamento agli oggetti, quindi avremmo:
class Sprite {
public:
enum looping { LOOP, NOLOOP };
load(std::string filename, int imageWidth, int imageHeight);
animate(int frameWidth, int frameHeight, int numColumns, looping doLoop);
};
Questo ci porta solo a quattro parametri per una funzione, fornendo comunque i dati che ritenevi necessari.
In realtà, probabilmente possiamo fare ancora meglio. Prima di tutto, il file da cui cariciamo il nostro sprite può memorizzare la dimensione delle immagini che contiene, quindi potremmo non aver bisogno di fornirle (è utile soprattutto se stiamo selezionando uno sprite da un file che potrebbe contenere parecchi). In secondo luogo, come sottolineato da @Mason, probabilmente non è necessario fornire frameWidth / frameHeight o numColumns. Inoltre, l'animazione a passaggio singolo e l'animazione in loop sono abbastanza diversi da rendere spesso più ragionevole fornire quelli come due funzioni separate. Infine, potrebbe avere senso passare semplicemente il nome del file da cui andremo a leggere lo sprite come parametro per il ctor. Incorporando tutti questi elementi, otteniamo:
class Sprite {
public:
Sprite(std::string const &filename);
animate(page const &target);
loop(page const &target);
};
Quindi per caricare un animate di uno sprite, ora abbiamo bisogno di qualcosa come:
Sprite x("somefile.spr");
x.loop(animPage);
Ricorda che la memoria a breve termine delle persone varia da circa 4 elementi per una persona di intelligenza media a circa 8 per i migliori geni.
Questo significa che 10 parametri sono quasi sempre irragionevoli. 7 parametri lo mettono a portata di pochi, ma onestamente solo alcuni. 4 lo mette alla portata di quasi tutti i programmatori, e 1 (o anche 3, se davvero hai bisogno di specificare la risoluzione) lo mette nella semplice lista dei morti.