Una delle funzioni di un'applicazione che gestisco è quella di gestire una flotta di veicoli. Ho un oggetto vehicle
con il quale posso eseguire attività correlate al veicolo; getMileage()
, setDriver()
, ecc. Ho anche una collezione di vehicles
con cui posso svolgere attività che sono correlate a più veicoli; fitWinterTyres()
, updateInsurance()
ecc.
Fino ad ora, quando sto creando la mia collezione di veicoli, ho utilizzato PDO::fetchAll
con l'argomento PDO::FETCH_CLASS
per restituire vehicle
oggetti nella mia lista di vehicles
. Ciò presenta dei vantaggi, poiché quando si attraversa la raccolta, posso utilizzare metodi noti per visualizzare e modificare singoli attributi in blocco.
Tuttavia, ho notato che spesso abbiamo creato raccolte in cui vengono calcolati gli attributi dei membri che sono rilevanti solo per la raccolta corrente. Ad esempio $vehicle->priority
aiuta il personale a decidere quale veicolo utilizzare in base alle condizioni di tutti i veicoli in questa raccolta. Un altro è $vehicle->service_due
che, quando calcolato, assicura che non tutti i veicoli siano prenotati per un servizio contemporaneamente. Per me, queste variabili calcolate dinamicamente sono ancora attributi di oggetto, ma non mi aspetto di vederle / modificarle su una singola istanza.
Inoltre, ci sono attributi che sono utili nella collezione ma ridondanti in una singola istanza. $vehicle->driver_ID
è memorizzato come numero intero nella tabella veicolo nel database. Posso ottenere una raccolta separata di drivers
e trovare il driver per ID o JOIN
l'ID con la tabella drivers
per ottenere il nome del driver e popolare l'attributo $vehicle->driver
.
Infine, ci sono spesso molti attributi che non sono mai necessari in una collezione, il che mi fa chiedere quanto sia efficiente usare l'intero oggetto nelle collezioni.
È una buona pratica avere un oggetto base che è stato esteso solo allo scopo di essere membro di una collezione? Altrimenti, come dovrei farlo?!
(l'ambiente di sviluppo è php e mysql, ma suppongo che la domanda sia indipendente dalla piattaforma)