Come rappresentare la personalità di una persona in classe?

1

Diciamo che ho una classe Person.

class Person{

    Person(std::string, int);
    void walk();
    void talk();
    void eat();

private:
    int age;
    std::string() name;

};

Ora diciamo che voglio aggiungere personalità a questo oggetto persona. Come dovrebbe aggiungere questa funzione a questa persona?

Stavo pensando all'eredità

class Persona: public Person{

    void charisma();
    void voice();
    void style();
}; 

o dovrei usare la composizione?

class Persona{

    void charisma();
    void voice();
    void style();
}; 

class Person{
 .....
private:
    int age;
    std::string name;
    Persona _persona;
};

o dovrei semplicemente aggiungere la nuova funzione direttamente a class Person , che davvero non voglio perché questo renderà il mio class Person grande e maldestro.

Una cosa che ho trovato è Decorator Pattern , ma mi sto ancora chiedendo se questo schema sia di qualche aiuto per me.

    
posta solti 28.12.2016 - 19:35
fonte

3 risposte

1

Questa è una domanda quasi filosofica.

Se usi l'ereditarietà:

  • le istanze di Persona saranno persone molto stereotipate. Una maggiore varietà richiederebbe più sottotitoli, dandoti tratti caratteriali molto rigidi.
  • l'ereditarietà non rifletterebbe l'interdipendenza tra le funzioni. Ad esempio, talk() non dipenderà da voice() a meno che tu non sostituisca talk() . E style() potrebbe dipendere da walk() ma walk() dovrebbe certamente dipendere anche da style()

Se usi la composizione:

  • Potresti perfezionare e sottoclasse Persona ulteriormente e popolarlo usando una fabbrica. Allo stesso modo, potresti ulteriormente sottoclasse Person ulteriormente. Ciò potrebbe consentire una più ampia varietà di persone più facilmente che con l'ereditarietà.
  • La dipendenza di talk () su voice () e walk () su style () potrebbe essere facilmente implementata. Tuttavia, non c'è ancora alcuna interdipendenza.

Può aiutare il decoratore? Sicuro ! Un decoratore è un'alternativa alla sottoclasse per estendere la funzionalità (vedi GoF). Combinandolo con il tuo approccio compositivo, puoi ulteriormente modificare Person . È molto flessibile Tuttavia, si raffina ancora qualcosa aggiungendo nuovi metodi di responsabilità o di sovrascrittura.

Se vuoi qualcosa di più creativo, puoi ispirare il tuo design con una tecnica comunemente usata nella codifica del gioco: rendi la tua persona una collezione di componenti. Ogni comportamento o proprietà avrebbe il proprio componente. Potresti quindi facilmente aggiungere nuovi tratti di carattere (ad esempio introverso, estroverso). Potresti quindi combinare dinamicamente i componenti (ad es. Per talk (), cercare il componente vocale per il rendering audio e osservare gli altri tratti del carattere per decidere forza (volume) della voce e lunghezza delle frasi.

Guarda anche questa risposta relativa ai modelli di design per i personaggi del gioco e questa risposta sull'implementazione di un tale progetto . Troverete ulteriori riferimenti a questa architettura, promossi tra l'altro da McShaffry .

Se vuoi un'altra alternativa

    
risposta data 28.12.2016 - 21:14
fonte
2

Il modo tradizionale di formulare questa decisione è la distinzione tra "is-a" e "has-a". Una persona è un tipo speciale di una persona, o è una persona qualcosa che una persona ha? "Is-a" rende l'ereditarietà un punto di partenza ragionevole e "ha-a" indica la composizione.

    
risposta data 28.12.2016 - 21:48
fonte
0

Hai ragione di evitare di rendere Person troppo "grande" in termini di dati che gli oggetti del suo tipo conterranno.

Come si dovrebbe strutturare la soluzione dipende in parte se si intende per tutti gli oggetti Person per avere una personalità. Se lo fai, preferirei strongmente la composizione. Altrimenti, la classe Person è ridondante. L'ereditarietà non è l'idea migliore per ridurre la complessità delle classi.

Tuttavia, se vuoi che alcuni oggetti Person non abbiano una personalità, l'ereditarietà come descrivi è un approccio semplice.

    
risposta data 28.12.2016 - 19:58
fonte

Leggi altre domande sui tag