Miglior design pattern per rappresentare frutta e macchine

0

Sto cercando il modello di progettazione corretto per disaccoppiare parte della logica su alcune classi astratte che ho. Per prima cosa abbiamo una classe base: frutta e frutta, mela, arancia e mango. Poi ho alcune classi che eseguono alcune logiche sul frutto. Queste classi sono le classi di taglio, cottura e peeling. Ora gran parte della logica per tagliare è identica per ogni frutto, così come cucinare e sbucciare, tuttavia ci sono alcune differenze specifiche che si verificano per ogni tipo di frutta in tutte le classi lavoratrici. Non voglio particolarmente dare alle lezioni di frutta molte informazioni su ciò che serve per tagliare, cucinare o sbucciare dato che la logica è piuttosto complicata, eppure non mi piace che la classe chop / cook / peel abbia così tanto codice relativo a specifici frutti.

Quindi riassumendo tutto ciò che il modello di progettazione modella correttamente detto schema di frutti e azioni sui frutti. Grazie per tutti gli input.

    
posta Medran 21.09.2016 - 04:21
fonte

2 risposte

1

Stai richiedendo un modello di progettazione per implementare doppia spedizione . La logica per eseguire un'azione su un frutto dipende sia dal tipo di azione, sia dal tipo di frutto.

Non posso dare una risposta più specifica perché i frutti e le azioni di cottura non sono veri oggetti OOP. Il modello di design appropriato da utilizzare dipenderà da ciò che realmente sono i tuoi oggetti.

    
risposta data 21.09.2016 - 06:07
fonte
4

Questo è in realtà un enigma generale noto come problema di espressione .

L'essenza è questa: hai alcuni tipi e hai alcune funzioni che agiscono su questi tipi, e devi specificare l'azione di ogni funzione su ciascun tipo. Concettualmente, potresti pensare a una tabella bidimensionale in cui le righe sono etichettate dai tipi e le colonne dalle funzioni. La cella (i, j) specifica il comportamento della funzione j sul tipo i .

Quindi, se guardiamo solo una riga di questa tabella, otteniamo tutte le funzioni che agiscono su un tipo specifico, che è più o meno un oggetto. Se prendiamo invece una vista orientata alla colonna, otteniamo una singola funzione che agisce su tutti i diversi tipi, che è funzione dell'analisi caso per caso. Nessuno dei due punti di vista è unilateralmente superiore, quindi li coprirò entrambi.

Approccio orientato agli oggetti (basato su file)

Crea una classe base astratta Fruit con metodi slice , cut , peel , ecc. Crea classi Pear , Apple , ecc. che ereditano da Fruit . La logica condivisa va nella classe base, la logica specifica nelle sottoclassi.

Si noti che la maggior parte dei programmatori (me compreso) considera le cattive pratiche di ereditarietà. È meglio rendere Fruit un'interfaccia implementata dalle altre classi. Per riutilizzare il codice, usa la composizione (ovvero, crea una funzione che fa ciò che vuoi e usalo in ogni classe).

Approccio funzionale (orientato alla colonna)

Crea un tipo di somma Fruit con iniezioni Apple , Pear , ecc. Crea funzioni slice , cut , quel caso sul tipo di istanza del loro argomento, ad es.

fun slice (fruit: Fruit) = case fruit of Pear -> ... | Apple -> ...

Ovviamente ci sono altri approcci (ad esempio usando moduli e firme), ma questi sono due di quelli comuni.

    
risposta data 21.09.2016 - 06:15
fonte

Leggi altre domande sui tag