Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    88

    Singleton input parametro generico

    Ho un metodo singleton, ogni volta che viene chiamato con i parametri input (può essere id intero o una stringa che nel mio caso è un codice alfanumerico) e il database, deve istanziare in base a ciò che ho passato da input.

    Dichiarazione della classe

    codice:
    class wbmTableOggetti extends JTable
    {
     ppublic $nomiDeicampi, .....;
     public function __construct( & $db, $id=0 ) { //il costruttore è sempre istanziato con id (intero)
    
            parent::__construct( '#__wbm_oggetti', 'id', $db );
    
            if ($id) $this->load( $id );
    
                else $this->cdata = date('Y-m-d H:i:s');
    
        }



    Singleton
    per istanziare gli oggetti con id (intero)
    codice:
      public function getInstance( & $db, $id = 0) {
    
            static $istanze;
            if (!isset($istanze)) {
    
                $istanze = array();
    
            }
            if (empty($istanze[$id])) {
    
                $ist = new wbmTableOggetti( $db, $id );
    
                $istanze[$id] = $ist;
    
            }
            return $istanze[$id];
        }

    Singleton con input (che può essere un intero quindi prende l'id oppure se stringa è il codice)
    ho provato a fare cosi

    codice:
    public function getInstance( & $db, $input = "") 
        {
            static $istanze;
      
            if (!isset($istanze)) {
                $istanze = array();
            }
            if ( is_string($input) ) // se input è una stringa (cioè codice)
            {
             
                if (empty($istanze[$input])) //ed in precedenza non è stato già caricato un istanza
                {
                    if ( is_null ($this->_messaggio))
                    {
                        $query = "SELECT codice,oggetto,testo FROM #__wbm_Oggetti WHERE codice LIKE '" . $input ."'"; 
                        $this->_db->setQuery( $query );
                        $istanze[$input] = $this->_db->loadObjectList(); // codice è la chaive
                        $this->_messaggio = $istanze[$input]; // oggetto (codice,testo,oggetto del msg)
                       
                    }
                }
               
            }
            else
            {
               if (empty($istanze[$input]))
                {
                   $ist = new wbmTableOggetti( $db, $input );
                   $istanze[$input] = $ist; //id è la chiave
                }
            }
            
            return $istanze[$input];
        }
    non mi sembra una soluzione buona, ho verificato per alcuni casi e funziona, ma non penso che sia abbastanza robusto da prendere in considerazione casi particolari.

    Consigli per migliorare o una soluzione più compatta e robusta?

    Grazie in anticipo

  2. #2
    c'è tutta una sfilza di roba che non mi torna da quei frammenti di codice... e cmq usare una classe sola per istanziare models diversi (nel tuo caso quel TableOggetti e quella cosa che tiri fuori quando l'input è di tipo stringa) mi sembra particolarmente errata come idea... normalmente si usa un repository ad entity e il caching delle entities ritornate piu che dal repository (quello che invoca $this->_db) dovrebbe essere fatto dal motore di persistenza ( il $this->_db), ma incorri in tutta una serie di casini che farli a mano mi sembra un suicidio e fossi in te lascerei perdere. Ah no scusa il model è sempre lo stesso... guarda magari ti funziona pure, concettualmente è molto confusa l'idea e anche errata, soprattutto il discorso di tenersi i record estratti in $istanze lascia il tempo che trova se fatto in maniera così "rozza" e dovresti vedere quanti benedici effettivamente ti dà (ma quante volte nella stessa esecuzione richiami la stessa query? se lo fai più di una volta direi che ci sia qualcosa da rivedere a livello di struttura del codice intorno a queste classi). Poi difficile dire, si capisce poco da quello che è il codice effettivo...troppo frammentata l'informazione
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    88
    Quote Originariamente inviata da Santino83_02 Visualizza il messaggio
    (ma quante volte nella stessa esecuzione richiami la stessa query? se lo fai più di una volta direi che ci sia qualcosa da rivedere a livello di struttura del codice intorno a queste classi).
    Innanzitutto grazie per la risposta.
    Allora questa classe crea solo un oggetto, ad ogni nuovo record l'id viene incrementato (ogni id del record va da 0...n).
    se serve una particolare istanza non è molto difficile basta specificare l'd (con tutta una logica del framework Joomla).
    il problema è che, per ricavare questi record possono essere chiamati sia per id(intero) che per codice(stringa).
    supponiamo:
    prodotto 1 (id: 1, nome, marca, codice="111a")
    prodotto 2 (id: 2, nome, marca, codice="222b")

    con il metodo getInstance se in input riceve come parametro il codice="222b" e questo record in precedenza è stato già caricato non deve fare altro che restituire l'istanza associato al l'id precedentemente caricato (ovvero istanza di id 2) altrimenti fa una query per recuperare l'istanza di un singolo record.
    Spero che si è capito l'utilità.
    Ultima modifica di feys88; 11-11-2014 a 01:13

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.