Un modulo utilizzato dalla maggior parte degli altri moduli

4

Sto perseguendo la progettazione orientata agli oggetti. Quindi non vogliamo usare le globali, ma a volte abbiamo un modulo utilizzato dalla maggior parte degli altri moduli. Questo significa che dobbiamo solo passarlo a tutti gli altri moduli e questo può essere letteralmente tutti i moduli!

class Logger
{
public:
    Logger(void);
    ~Logger(void);
};


class Calculator
{
public:
    Calculator(Logger *logger);
    ~Calculator(void);
};


class Taxation
{
public:
    Taxation(Logger *logger);
    ~Taxation(void);
};

Quindi l'idea è che i moduli Calculator e Taxation utilizzino il modulo Logger per registrare tutto. Allo stesso modo la maggior parte degli altri moduli lo useranno anche, e il logging è richiesto ovunque. Questo metodo è ok o dovrebbe Logger essere globale invece?

    
posta zadane 14.03.2014 - 21:12
fonte

2 risposte

4

Evitare le variabili globali (e i singleton, che sono variabili globali mascherate) è una buona cosa per cui lottare. Il più importante è non pensarci come globale e singleton essere impuri OO, che non ti porta da nessuna parte. Il concetto importante da tenere a mente è "dipendenze". Qualsiasi dipendenza che è esplicitamente iniettata nel client è liberamente accoppiata. Qualsiasi dipendenza invisibile dall'esterno del client è strettamente accoppiata. Sì, serve più codice per iniettare esplicitamente le dipendenze, ma il tuo codice risulta più flessibile, più testabile e più facile da ragionare.

In C ++, se puoi, inserisci le tue dipendenze come parametri del modello. Se questa non è un'opzione, considera l'utilizzo di std :: function. Passare da un puntatore raw non è una buona idea, ma potresti prendere in considerazione l'utilizzo di un riferimento const.

B.t.w, qualche tempo fa risultante da una discussione su linkedin, ho creato una libreria di logging (che in seguito altri hanno contribuito) per la ragione che nelle librerie di logging il pattern singleton è maltrattato. Non è necessario utilizzare singleton (o variabili globali) per cose come una libreria di logging.

link

In altre situazioni, i singleton sono spesso usati nello scenario di gestione delle risorse. Questo post del blog su un'alternativa alle variabili globali e ai singleton per l'allocazione delle risorse scarse può essere utile:

link

    
risposta data 15.03.2014 - 00:11
fonte
3

Sarebbe meglio se tu definissi il Logger come un Singleton invece di passare l'oggetto su ogni classe.

Definisci il Logger come:

class Logger
{
  private:
    Logger()
    {
        //private constructor
    }
  public:
    static Logger& sharedInstance()
    {
        static Logger singleTon;
        return singleTon;
    }
    ~Logger()
    {
       // Cleanup
    }
};

Ovunque tu abbia bisogno di un logger, prendilo come:

Logger::sharedInstance();
    
risposta data 14.03.2014 - 21:39
fonte

Leggi altre domande sui tag