Alternativa a Singleton quando D.I. non è un'opzione

4

Ho svolto ricerche approfondite e sono bloccato. Sto scrivendo un modulo Drupal che usa una classe che ho creato. Questa classe è un Singleton classico: deve essere istanziata una sola volta, dal momento che sta assemblando una serie di dati da un database. Si noti che il mio potenziale Singleton non aggiornerà alcun dato nel database: leggerà solo dai dati esistenti. Inoltre, tieni presente che i processi esterni al contesto del mio programma possono aggiornare i dati.

So che la risposta da portare a casa qui è "usa Iniezione di dipendenza". Tuttavia, non posso usare Dependency Injection - Drupal usa gli hook e questi hook accettano determinati parametri. Ad esempio, non posso (a mia conoscenza) inserire un oggetto in questo modo.

Vorrei sottolineare che anche i test sono una mia preoccupazione (anche se testare il mio modulo in Drupal ha avuto una sua serie di sfide). Tuttavia, sono disposto ad accettare che un Singleton possa essere il minore di due mali qui.

Ecco un esempio:

function mymod_block_view($var) {
    //$var is required by drupal
    $obj = new Object()
    ....
}

function mymod_block_info() {
    ... 
    $obj = new Object()
}

Le mie opzioni al momento sono di usare una variabile globale (non ideale) o un Singleton (secondo la mia ricerca, anche non ideale, ma potrebbe essere la mia unica opzione). Ho altre opzioni oltre a dichiarare un nuovo oggetto variabile all'interno di ogni funzione?

    
posta JRizz 25.11.2013 - 17:28
fonte

3 risposte

3

Sembra di essere bloccato tra una roccia e un luogo difficile. Né una variabile globale né un singleton sono una pratica molto "buona". Il problema principale che vedo è che i singleton non sono realmente da utilizzare quando solo è necessario per istanziarlo una volta, ma invece quando DEVE li istanzia solo una volta. Ad esempio, puoi avere bisogno di un'istanza di un tabellone in un gioco, ma nulla si interrompe quando hai due o tre istanze (se fatto bene). La scrittura su un file di log su più thread potrebbe interrompersi se le scritture non sono thread-safe (quasi sicuramente non saranno native) e quindi avere più istanze dell'handle del file potrebbe essere distruttivo. Questa è una ragione migliore per avere un singleton.

Poiché non credo che tu abbia un vero caso d'uso per un singleton, suggerisco una variabile globale. Questo è essenzialmente ciò che un singleton sarebbe comunque, qui, ma ottieni i vantaggi di essere variabile . Ciò renderebbe più semplice il passaggio tra i database a metà dell'esecuzione, e potresti persino trovare più semplice test rispetto a un singleton.

    
risposta data 16.12.2013 - 07:58
fonte
0

Utilizza un database per scopi di raccolta dati. Una sorta di pipeline di produzione del flusso di dati. Dati a livello di applicazione, dati a livello utente, dati a livello di sessione (stessa pagina in due schede). Un database NoSQL andrebbe bene, ma un database classico potrebbe essere più conosciuto e più veloce.

    
risposta data 16.12.2013 - 15:45
fonte
-1

Mi sembra che tu stia cercando di applicare le migliori pratiche per Java (processi multi-thread, lunga durata ecc., linguaggio generico) a PHP (thread singolo, processi inizializzati su ogni richiesta, specializzati per la pubblicazione di pagine HTML ).

Ci sono buone ragioni per evitare i singleton in Java, ma non vedo come si applicano nel breve ciclo di vita a thread singolo di un programma php.

    
risposta data 16.12.2013 - 09:31
fonte

Leggi altre domande sui tag