C'è un modo migliore per progettare queste classi?

2

Ho due classi commerciali: TimesheetDay e TimeSlot. One TimesheetDay può avere uno o più TimeSlots.

Le classi TimesheetDay e TimeSlot dipenderanno da un oggetto che implementa un'interfaccia corrispondente di TimesheetDayData e TimeSlotData. In questo modo, posso scrivere classi di dati per mappare gli oggetti in un database MySQL, ma se uso un altro modo per archiviare i dati in futuro, posso iniettare oggetti da un dataclass diverso.

Questi oggetti non creeranno altri oggetti e mi rifiuto di usare la parola chiave "nuova" in essi. Voglio che siano testabili in completo isolamento.

Ad esempio, istanzio un oggetto TimesheetDay come questo (in un contenitore):

$mTimesheetDayData = new TimesheetDayMysqlData($databaseHost, $timesheetDayId);
$mTimesheetDay = new TimesheetDay($mTimesheetDayData);

Gli oggetti TimeSlot saranno costruiti nello stesso modo:

$mTimeSlotData = new TimeSlotMySqlData($databaseHost, $timeSlotId);
$mTimeSlot = new TimeSlot($mTimeSlotData);

Il mio problema sta nell'ottenere oggetti TimeSlot contenuti in TimesheetDay. Non posso avere la classe TimesheetDay che crea oggetti. Altrimenti, potrei scrivere un metodo che restituisce una matrice di oggetti TimeSlot, qualcosa del tipo:

$timeSlotsForThatDay = array();
$timeSlotsForThatDay = $mTimesheetDay->getTimeSlots();

Ma ciò richiederebbe il metodo getTimeSlots () per creare oggetti.

Come gestiresti questo?

    
posta Lewis Bassett 05.01.2012 - 20:27
fonte

2 risposte

1

Raccomando di creare un'altra classe - TimesheetDataMapper , mapperebbe i dati e gli oggetti mysql. Come ho capito, intendi creare TimesheetDay e TimeSlot come POPO (Plain Old Php Object). Questa è una buona intenzione:)

Quindi quello che devi fare è iniettare TimeSlotMySqlData in TimesheetDataMapper , c'è un metodo getTimesheetDay($someCriteriaOrId); che otterrebbe i dati da mysql in base ai criteri, crea un nuovo oggetto TimesheetDay , seleziona i dati time slot e amp; iniettalo in TimesheetDay .

class TimesheetDataMapper {
    protected function _getTimeSlotData($someCriteriaOrId)
    {
         $timeSlotsForReturn = array();

         $someTimeSlotListFromDb; 
         foreach ($someTimeSlotListFromDb as $timeSlotData) {
             $timeSlotsForReturn[] = new TimeSlot($timeSlotData);
         } 

         return $timeSlotsForReturn;
    }
    public function getTimesheetDay($someCriteriaOrId) 
    {
        $timeSlotData = $this->_getTimeSlotData($someCriteriaOrId);
        $timesheetDay = new TimesheetDay($timeSlotData);

        return $timesheetDay;
    }
}

Potresti anche avere setter / getter su TimesheetDay / TimeSlot .

    
risposta data 05.01.2012 - 21:19
fonte
0

L'oggetto TimesheetDay dovrebbe interrogare il database affinché i dati possano costruire il suo elenco di TimeSlot, quando è costruito, o la prima volta getTimeSlots viene chiamato.

    
risposta data 05.01.2012 - 21:05
fonte

Leggi altre domande sui tag