Inizializza le risorse fisiche nel costruttore

2

È una pratica accettabile inizializzare risorse fisiche / esterne da un costruttore quando la risorsa è necessaria perché l'oggetto faccia il suo lavoro?

Ad esempio, supponiamo di voler creare un oggetto che trasmetta una coda di messaggi durevole e che la coda di messaggi sia una tabella fisica del database.

Avrebbe senso creare un costruttore idempotente che crea fisicamente la tabella se non esiste ancora?

es.

IMessageQueue queue = new SQLTableMessageQueue('table_name', dataSource);

Forse un metodo statico di fabbrica sarebbe più appropriato? In tal caso, la creazione della tabella si verificherebbe nel metodo factory e il costruttore sarebbe libero da tale comportamento.

IMessageQueue queue = SQLTableMessageQueue.create('table_name', dataSource);

Non sono sicuro di quale sarebbe l'approccio appropriato? Un'altra idea che ho avuto è stata quella di utilizzare il schema del repository .

    
posta plalx 21.01.2015 - 02:44
fonte

2 risposte

3

Solitamente i costruttori non sono utilizzati per inizializzare risorse esterne, ci sono alcuni motivi,

  1. Testabilità - Sarebbe molto difficile creare test unitari
  2. Per essere in conformità con SRP

Puoi sempre passare la coda dei messaggi al costruttore dove la usi.

class QueueProcessor
{
    private IMessageQueue _queue;

    public QueueProcessor(IMessageQueue queue)
    {
        _queue = queue;
    }
}

Sì, puoi usare una fabbrica per creare la coda

class QueueFactory
{
    public IMessageQueue CreateMessageQueue
    {
        return new SQLTableMessageQueue('table_name', dataSource);   
    }
}

Con questo approccio puoi facilmente prendere in giro la coda dei messaggi per i test e anche rispettare l'SRP rispetto alla costruzione della coda all'interno del costruttore.

    
risposta data 21.01.2015 - 03:59
fonte
0

La guida di stile C ++ di Google ti chiede di astenermi da a fare lavori nei costruttori . Le loro argomentazioni potrebbero o potrebbero non essere applicabili alla tua lingua. Testare il consiglio n. 3 del WC di sei anni a> su come scrivere codice verificabile non facendo lavoro nel costruttore tiene comunque.

Se lo cerchi online, troverai tonnellate, / * I programmatori * / sono un punto di partenza.

    
risposta data 21.01.2015 - 15:38
fonte

Leggi altre domande sui tag