Problema di programmazione ad oggetti.

Sto facendo un applicativo in PHP usando la programmazione ad oggetti. Per spiegare il mio problema vi faccio un esempio:

- Pensate di dovere modellare questa realtà: una fattoria con animali di diverse razze.

- Pensate ora di creare una classe "animale" e due sottoclassi "mucca" e "anatra"... Sul database c'è una tabella "animali" con il codice animale e la tipologia (mucca o anatra) ed i dati comuni alle due tipologie + una tabella "mucche" con i relativi dati + una tabella "anatre" con altri dati ancora. Queste ultime due tabelle dipendono, mediante una foreign key, dalla tabella "animali".

- Adesso pensate di dover fare una pagina con un elenco degli animali presenti nella fattoria dove, su ogni rigo c'è il tasto di cancellazione...

Domanda: essendo la tabella composta da istanze della classe "animale", come posso fare per fare in modo che la cancellazione elimini il relativo record sulla tabella "animali" + quello sulla tabella figlio "mucche"/"anatra" ?

Posso farcela senza dover interrogare la tipologia sull'oggetto "animale" per poi istanziare la sottoclasse "mucca" o "anatra" ?

inviato 7 anni fa
dacdam
X 0 X

A dire il vero la questione non è di programmazione ad oggetti ma piuttosto di espedienti dello sviluppo web.

E' chiaro che il processo di cancellazione ha bisogno dell'informazione su quale tipo di animale si tratta.

Questa informazione può essere recuperata:

1) durante il processo di cancellazione attraverso una lettura del database

2) dall'URL del link di cancellazione (es.: cancella?animale=anatra&id=123)

3) dalla FK che lega la tabella animale alle tabelle figlie (ON DELETE CASCADE ...)

Il primo caso è quello che vuoi evitare, il secondo è quello che preferisco perché non bisogna mai usare l'ON DELETE CASCADE.

 :bye:

risposto 7 anni fa
Gianni Tomasicchio
X 0 X

Hai ragione Gianni, non si tratta di oop... ma solo in base all'esempio che ho fatto, per il quale la tua risposta è perfetta.

Purtroppo non sapevo come spiegarmi e questo mi ha portato a fare un esempio fuorviante.

Comunque, prova ad immaginare la stessa realtà che ho descritto calata in un contesto di elaborazione lato server: prova a pensare ad una routine che prende l'elenco degli animali dal database e, per ognuno di essi deve fare operazioni specifiche in base al tipo. In questo caso devo istanziare prima la superclasse e poi la sottoclasse ? Mi chiedevo se non c'è un metodo migliore per raggiungere l'obbiettivo.

Altro esempio: pensa ad una routine che riceve l'id animale e deve tornarne il verso. C'è un modo, ricevendo il codice "01", di tornare "mooo" o "quack" senza istanziare prima la classe "animale" e poi, valutatone il tipo, la

classe "mucca"/"anatra" ?

Fanno ridere stì esempi  :2funny:

Ciao!

risposto 7 anni fa
dacdam
X 0 X
Comunque, prova ad immaginare la stessa realtà che ho descritto calata in un contesto di elaborazione lato server: prova a pensare ad una routine che prende l'elenco degli animali dal database e, per ognuno di essi deve fare operazioni specifiche in base al tipo. In questo caso devo istanziare prima la superclasse e poi la sottoclasse ? Mi chiedevo se non c'è un metodo migliore per raggiungere l'obbiettivo.

Credo che tu possa procedere con un oggetto che prima estrae in modo grezzo i dati dal database, poi con un altro metodo inizi a "scremarli" e a stamparli a video (per esempio), per ogni "stampa" se hai bisogno di fare delle operazioni particolari potresti istanziare degli oggetti appositi. Ma ti ricordo che nella programmazione ad oggetti si parla anche di polimorfismo, il che dovrebbe semplificarti alcune operazioni...

risposto 7 anni fa
Mario Santagiuliana
X 0 X

Hai ragione Gianni, non si tratta di oop... ma solo in base all'esempio che ho fatto, per il quale la tua risposta è perfetta.

Purtroppo non sapevo come spiegarmi e questo mi ha portato a fare un esempio fuorviante.

Comunque, prova ad immaginare la stessa realtà che ho descritto calata in un contesto di elaborazione lato server: prova a pensare ad una routine che prende l'elenco degli animali dal database e, per ognuno di essi deve fare operazioni specifiche in base al tipo. In questo caso devo istanziare prima la superclasse e poi la sottoclasse ? Mi chiedevo se non c'è un metodo migliore per raggiungere l'obbiettivo.

Altro esempio: pensa ad una routine che riceve l'id animale e deve tornarne il verso. C'è un modo, ricevendo il codice "01", di tornare "mooo" o "quack" senza istanziare prima la classe "animale" e poi, valutatone il tipo, la

classe "mucca"/"anatra" ?

troppa carne al fuoco, cerchiamo di affrontare un problema alla volta, ciascuno in una sua discussione

 :bye:

risposto 7 anni fa
Gianni Tomasicchio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda