Sto provando molto seriamente a ridefinire parte del mio codice legacy nel progetto utilizzando best practice e pattern di progettazione + DDD, quindi mi piacerebbe avere un feedback su un problema che sto attualmente avendo.
Supponiamo di avere due classi di entità:
class Dog
{
protected $name;
function __construct($name)
{
$this->name = $name;
}
/**
* @return mixed
*/
public function getName()
{
return $this->name;
}
function bark()
{
echo 'Rawr';
}
}
class Husky extends Dog
{
/**
* @var Sledge
*/
protected $sledge;
function __construct($name, Sledge $slegde)
{
parent::__construct($name);
$this->sledge = $slegde;
}
function pull()
{
echo $this->sledge->pull();
}
}
Dog
è la mia entità regolare e la sua unica responsabilità è quella di mappare i campi del database.
Husky
d'altra parte ha le stesse responsabilità del cane ma delega anche Sledge
pulling.
Normalmente, entrambe le entità avrebbero repository diversi (dovrebbero? Dal momento che uno eredita l'uno dall'altro) da richiedere, tuttavia i requisiti aziendali implicano che il cliente non deve specificare il tipo di cane (quindi può essere una percentuale "base"Dog
o speciale Husky
), solo il suo nome http://localhost/animal/fluffy
.
Inoltre, attualmente risiedono entrambi nella stessa tabella di database (riconosciuta dal campo type
) e al momento non ci sono piani tecnici per cambiarlo (per ragioni di prestazioni e di tempo).
Qual è il modo migliore per farlo?
- Dovrei creare un po 'di
AnimalRepository
, estrarre i dati e trattarli come DTO, rilevare il suo tipo e quindi creare la classe appropriata? - Dovrei creare un qualche tipo di mappatore del livello di astrazione più alto? Come dovrebbe essere?