Attualmente sto implementando funzionalità in Symfony (PHP - non che dovrebbe fare alcuna differenza quale lingua sto usando) dove ho circa quattro controller che fanno quasi esattamente la stessa cosa. L'unica differenza tra loro è che usano oggetti entità e oggetti modulo diversi.
Ho già rifattorizzato tutte le funzionalità comuni in una classe genitore astratta. Poi ho due metodi astratti chiamati getEntityInstance
e getFormInstance
, che restituiscono solo le istanze oggetto appropriate.
Le istanze entità e modulo restituite avrebbero entrambe interfacce comuni, chiamate rispettivamente AbstractQuery
e AbstractForm
.
Ad esempio, diciamo che ho le seguenti due classi.
abstract class AbstractQueryController {
abstract protected function getEntityInstance();
abstract protected function getFormInstance(AbstractQuery $query);
public function queryAction(Request $request) {
//Do some stuff
$form = $this->getFormInstance($this->getEntityInstance());
//Do something with $form
}
}
class SomeRandomController extends AbstractQueryController() {
protected function getEntityInstance() {
return new SomeRandomQuery();
}
protected function getFormInstance(AbstractQuery $query) {
return new SomeRandomForm($query);
}
}
Ora questo approccio funziona, ma sembra sbagliato. Quale modello di progettazione o altro concetto dovrebbe essere applicato qui per rendere il codice "più pulito"? Il problema è che, con ogni nuovo controller che estende AbstractQueryController
, sto fondamentalmente facendo cuocere la "configurazione" (se è possibile chiamarla così) nella classe figlio, che sembra non corretta.