Sono relativamente nuovo al mondo di OOP e, avendo letto alcuni schemi di progettazione, sto lottando con quel momento "aha".
Ho i seguenti oggetti Evento (evento singolo, con ora di inizio e ora di fine e disponibilità) EventCollection (Contiene più istanze dell'Evento, clonate e impostate o istanziate con 'new' e un attributo date) Prenotazione (con una collezione di EventCollections)
Questo a sua volta, dà la possibilità di scegliere più "slot" di eventi al giorno.
L'oggetto, EventCollection, conterrà le "fessure" temporali pre-calcolate, per il "prelievo" o un insieme di eventi per i quali è stato prenotato.
Ora la mia prima pugnalata a questo, almeno fino al punto di EventCollection è stata lungo queste linee
class Event {
protected startTime
protected endTime
protected status //available, booked, unavailable
public function __construct(startTime, endTime, status = 'available')
{
this->startTime = startTime
this->endTime = endTime
this->status = status
}
public function changeStatus(status)
{
this->status = status
}
public function getStatus()
{
return this->status
}
}
class EventCollection {
protected date
protected events
public function __construct(date)
{
this->date = date
}
public function buildAvailableEvents()
{
// Loop through construction of events calculated by pre defined offsets
this->events[] = new Event(startTime, endTime, 'available')
}
public function populateFromDb(SomeInterface db)
{
// Loop through construction of events determined by the interface of a database source
this->events[] = new Event(startTime, endTime, status)
}
public function getAvailableEvents()
{
return this->getEvents('available')
}
public function getBookedEvents()
{
return this->getEvents('booked')
}
public function getUnavailableEvents()
{
return this->getEvents('unavailable')
}
protected function getBlocks(status)
{
selectedEvents = []
foreach (this->events as event) {
if(event->getStatus() == status)
{
selectedEvents[] = event
}
}
return selectedEvents
}
}
class Booking {
protected name
protected email
protected moreCustomerDetails
protected EventCollection
public function __construct(name, email ...)
{
this->name = name
this->email = email
}
public function addEventCollection(EventCollection eventCollection)
{
this->eventCollection[] = eventCollection
}
}
//Client
booking = new Booking('me', '[email protected]')
eventCollection = new EventCollection()->buildAvailableEvents()
booking->addEventCollection(eventCollection)
Questo è conforme a qualsiasi schema? Sento che mi manca qualcosa perché sto semplicemente usando gli oggetti come possessori semplificati di matrici di oggetti. Questo può essere rielaborato in tali modelli per ridurre la massa della classe? Vedo alcune duplicazioni di codice, ma ho semplicemente refactato quello all'interno della stessa classe.
Ho cercato di separare le singole responsabilità.
Qualcuno può suggerire miglioramenti? Questo non è un codice operativo, l'ho solo parzialmente soppresso.