Domanda

Sto vivendo quello che credo sia un problema di dipendenza circolare con la mia applicazione PHP. Per favore fatemi sapere se questo non è corretto. Ecco la situazione:

Due classi, LogManager e DBSession.

DBSession viene utilizzato per interagire con il database e LogManager viene utilizzato per accedere ai file. Entrambi sono ampiamente utilizzati nella mia applicazione. Quando si crea un'istanza di DBSession, è necessario assegnargli un'istanza di LogManager tramite un parametro del costruttore. Questo perché DBSession a volte registra le informazioni in un file e utilizza l'istanza LogManager per fare ciò.

Ora, volevo estendere LogManager in modo che potesse anche accedere a una tabella di database, piuttosto che a un file di testo. Naturalmente, la mia preferenza è quella di riutilizzare le lezioni esistenti, ma presto ho capito che ciò ha provocato una situazione interessante.

DBSession richiede già un'istanza di LogManager per la costruzione. Se voglio riutilizzare la classe DBSession in LogManager, ora richiederà un'istanza di DBSession. Come posso soddisfare entrambe le richieste? Chiaramente, qualcosa deve essere sbagliato nel mio approccio.

Come mi consiglieresti di risolvere questo problema?

Grazie in anticipo, ragazzi.

È stato utile?

Soluzione

Non estendere LogManager, lascia che sia un tipo aggregato. E ritardare la scelta di dove si desidera accedere, ad esempio:

$logManager = new LogManager();
$dbSession = new DbSession($logManager);
$logManager->add(new FileLog($filename) );
$logManager->add(new DBLog($dbSession) );

Dove ovviamente FileLog e DBLog condividono un'interfaccia comune. Questa è un'applicazione del modello Observer, in cui add () è il "quotate" " operazione e FileLog / DBLog sono gli osservatori degli eventi di registrazione. (In questo modo puoi anche salvare i log in molti punti.)

Modifica Owen : adattato alla sintassi php.

Altri suggerimenti

Uno di questi oggetti in realtà non ha bisogno dell'altro: hai indovinato, è la DBSession. Modifica quell'oggetto in modo che il logger possa essere collegato ad esso dopo la costruzione.

Perché richiedere un oggetto LogManager per la creazione di un oggetto DbSession, se solo a volte scrive su file? pigro caricalo invece solo quando ne hai bisogno. Inoltre, secondo me entrambi dovrebbero essere indipendenti l'uno dall'altro. Ognuno potrebbe istanziare l'altro quando necessario.

Forse puoi applicare qualche motivo, come il Singleton Pattern per assicurarti di avere solo un'istanza della tua classe LogManager, ad esempio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top