Preambolo: Sto facendo un semplice gioco da tavolo in C ++, in cui i personaggi di IA si muovono attorno ai quadrati sulla scacchiera. Esistono diversi tipi di quadrati, ognuno ereditato da una classe astratta, ciascuno con effetti diversi sul carattere AI. Ad esempio, alcuni sono negozi in cui il personaggio può acquistare oggetti, altri sono luoghi di lavoro in cui i personaggi ricevono denaro, ecc.
Allo stesso modo, ci sono diversi personaggi AI (ereditati anche da una classe astratta), che fanno diversi tipi di decisioni. Alcuni lavorano più degli altri, altri mangiano più degli altri, ecc.
Il problema è che il personaggio AI deve conoscere il tipo di quadrato per prendere una decisione su cosa fare. Al momento la verifica del tipo utilizzando una stringa di tipo come variabile membro è la soluzione più semplice, ma risulta orribilmente inelegante e non molto utile quando si tratta di aggiungere nuovi tipi di quadrati e caratteri AI.
Domanda: È una cattiva pratica controllare il tipo di un oggetto chiedendogli un identificatore inserito nella sua classe per questo scopo? È una cattiva pratica utilizzare altri metodi di identificazione del tipo di runtime come dynamic_cast e typeinfo per controllare il flusso di esecuzione?
Esempio: Sotto la classe Square (accessibile tramite currentSquare () ha una funzione membro getType () che restituisce una stringa con il nome del tipo:
//Normal AI character
void decide() {
if(currentSquare()->getType()=="HOME") {
watchTV();
sleep();
}
if(currentSquare()->getType()=="WORKPLACE") {
work();
}
}
//Party animal AI
void decide() {
if(currentSquare()->getType()=="HOME") {
moveTo(getGameBoard()->closestBar());
}
if(currentSquare()->getType()=="WORKPLACE") {
sleep();
}
}