Salve, avrei un quesito a cui avrei anche trovaro una soluzione, ma vorrei un parere tecnico per capire se è il giusto approccio.
Considerando che in un applicazione realizzata seguendo il pattern mvc c'ho il controller che fa da tramite tra la view e il model, mi son accorto come i vari controller dell'applicazione abbiano delle funzioni QUASI identiche. Faccio un esempio:
Codice PHP:
public class HumanController{
private humanModel;
...
private void validate(Composite formInputs)
for (Children c: formInputs.getChildren())
{
humanModel.validate(c);
}
}
Codice PHP:
public class AnimalController(){
private animalModel;
...
private void validate(Composite formInputs)
for (Children c: formInputs.getChildren())
{
animalModel.validate(c);
}
}
come potete vedere le due classi un metodo che fa praticamente la stessa cosa, l'unica eccezione è rappresentata dal model a cui si fa riferimento all'interno del foreach.
Quello che io ho pensato è dunque creare un mainController che fa da padre ai due controller sopra riportati.
Codice PHP:
public class MainController(){
private void validate(Composite formInputs){
for (Children c: formInputs.getChildren())
{
//ops, mi manca il riferimento ai model!!
}
}
}
e quindi avrò
Codice PHP:
public class AnimalController extends MainController ()
e
Codice PHP:
public class HumanController extends MainController ()
in questo modo in entrambe le classi mi ritroverò il metodo validate, ma come potete vedere nell'implementazione di tale metodo all'interno di MainController, non conosco a priori il riferimento al Model che andrò ad utilizzare in runtime (che ovviamente potrà essere di due tipi: human o animal)
A sto punto mi viene in mente che nelle due sottoclassi dovrei creare i metodi
Codice PHP:
private HumanModel getModel(){return this.humanModel}
e
Codice PHP:
private AnimalModel getModel(){return this.animalModel}
così che in MainController potrò scrivere
Codice PHP:
public class MainController(){
private void validate(Composite formInputs){
for (Children c: formInputs.getChildren())
{
this.getModel().validate(formInputs);
}
}
}
Il problema tuttavia resta in quanto in MainController non so getModel quale dei due Model mi ritornerà, quindi il compilatore me lo segnalerà come errore, non avendo nemmeno la possibilità di fare un cast.
A sto punto penso che subentri la necessità di creare -anche in questo caso- un MainModel che fa da padre ad entrambi in modo tale da poter scrivere in entrambi i metodi:
Codice PHP:
private MainModel getModel(){return this.humanModel} //si suppone ovviamente che la classe HumanModel estenda MainModel
e
Codice PHP:
private MainModel getModel(){return this.animalModel}//si suppone ovviamente che la classe AnimalModel estenda MainModel
quindi nel mainController avrò:
Codice PHP:
for (Children c: formInputs.getChildren())
{
((MainModel)this.getModel()).validate(formInputs);
}
E' il giusto approccio?