Convalidare gli oggetti tra loro - Modello di progettazione necessario

1

Sto eseguendo un'applicazione zoo.

Il mio zoo include una classe astratta di "animale" e diverse classi derivate - "zebra", "elefante", "orangutan", "babbuino" e così via. Di ogni classe ho diverse istanze.

La mia domanda è: voglio verificare se due istanze animali possono accoppiarsi.

La logica aziendale è divisa in due parti:

  1. Voglio verificare se ciascun partner di accoppiamento è adatto per l'accoppiamento, ad es. non troppo giovane o troppo vecchio o malato ecc.
  2. Voglio verificare se i due partner corrispondono - ad es. una zebra non può accoppiare un elefante, ma un orangutan può accoppiarsi con un babbuino.

Presumo che il primo requisito sarebbe implementato da una funzione astratta che risiederebbe sotto la classe di base animale. Ma per quanto riguarda il secondo requisito?

Come progetteresti le lezioni nella questione più generale che aggiungere nuovi tipi di animali non richiederebbe molto di un sovraccarico?

    
posta Berlo 04.03.2014 - 20:15
fonte

2 risposte

1

Secondo Uncle Bob in Clean Code questo è un tipico esempio di quando scrivere più codice procedurale e meno orientato agli oggetti. Vuoi la flessibilità per aggiungere "strutture dati", quindi devi mettere la logica altrove.

Data/Object Anti-Symmetry

  • Procedural code (code using data structures) makes it easy to add new functions without changing the existing data structures.
  • OO code makes it easy to add new classes without changing existing functions.
  • Procedural code makes it hard to add new data structures because all the functions must change.
  • OO code makes it hard to add new functions because all the classes must change.

Ecco perché Michael consiglia istintivamente di avere una funzione per determinare se 2 animali possono accoppiarsi.

    
risposta data 04.04.2014 - 15:51
fonte
1

Dipende dai requisiti effettivi ... Cosa intendi con 'non richiedere un sovraccarico'?

Vuoi essere in grado di aggiungere animali dinamicamente, in fase di esecuzione (in un plugin)? Aggiungi un metodo astratto a Animal:

bool acceptsMate(Animal);

Quando si controllano i possibili compagni, se uno accetta l'altro come matto, possono farlo. Aggiunto un nuovo animale in una libreria di plugin significa implementare questo metodo, e gli altri animali esistenti non devono conoscere questa nuova specie per accoppiarsi con loro.

Se non hai questo requisito, utilizzerei una tabella di ricerca, in cui sono elencate le coppie di animali compatibili.

Se questa è una domanda scolastica, suppongo che stiano accennando al modello del visitatore, il che non è adatto a questo problema. Dovresti duplicare il codice per ogni corrispondenza, perché ci sono 2 modi per interrogare se possono accoppiarsi.

AnimalA->visitCanMateWith(AnimalB)

o

AnimalB->visitCanMateWith(AnimalA)
    
risposta data 05.03.2014 - 12:06
fonte

Leggi altre domande sui tag