Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    Funzioni ridondanti tra più classi, come risolvere una situazione del genere?

    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 cformInputs.getChildren())
       {
           
    humanModel.validate(c);
       } 


    Codice PHP:
    public class AnimalController(){

    private 
    animalModel;

    ...

    private 
    void validate(Composite formInputs)

       for (
    Children cformInputs.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 cformInputs.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 cformInputs.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 cformInputs.getChildren())
         {
            ((
    MainModel)this.getModel()).validate(formInputs);
         } 

    E' il giusto approccio?

  2. #2
    Sinceramente è abbastanza bruttina come cosa o perlomeno si potrebbe fare meglio.
    Mantenendo la tua struttura o meglio il tuo ragionamento cioè quello di far si che sia la classe figlia (AnimalController,HumanController) a restituire il modello allora sarebbe meglio rendere la classe padre (MainController) astratta (abstract) e dichiare all'interno il metodo astratto getModel in modo da evitarti il casting nel metodo validate es:
    codice:
    public abstract class MainController
    {
         public abstract MainModel getModel();
    
         public void validate(Composite formInputs){
    
         for (Children c: formInputs.getChildren())
         {
            this.getModel().validate(formInputs);
         } 
      }
    La cosa invece che fare io è creare un interfaccia/classe da associare a tutti i model (es: MainModel) e rendere la classe MainController generica in modo che possa accettare un qualsiasi MainModel
    codice:
    public class MainController<T extends MainModel>
    {
         public abstract T getModel();
    
         public void validate(Composite formInputs){
    
         for (Children c: formInputs.getChildren())
         {
            this.getModel().validate(formInputs);
         } 
      }
    
    //ESEMPIO DI IMPLEMENTAZIONE
    
    public class HumanController extends MainController<HumanModel> //ovviamente HumanModel estende o implementa MainModel
    {
    
          //obbligato a implementare getModel
        public HumanModel getModel()
        { 
            return humanModel;
        }
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.