Il modello attuale del modulo CoffeeScript è valido?

2

Ho un'applicazione web Node.js scritta in CoffeeScript, che ha una serie di "servizi". Questi vari servizi sono attualmente esposti come un CoffeeScript class , che fa alcune cose che mi piacciono.

Per uno, ottengo un metodo che viene eseguito una volta all'avvio dell'istanza del servizio. Su alcuni servizi questo mi consente di recuperare i token di autenticazione, creare connessioni, ecc. Che sono requisiti per tali servizi. L'uso delle classi CS mi consente anche di avere proprietà che possono essere referenziate nei metodi specifici esposti all'istanza della classe (stato, metodi di supporto, ecc.)

Inizialmente, quando ho rilevato i servizi dell'applicazione, sono stati esposti in questo modo:

class SchedulerService
  constructor: (@msgBus, connStr) ->
    # Some logic setting up service.
  somePublicMethod: (cb) ->
    cb()

module.exports = SchedulerService

Più di recente, ho preso l'abitudine di non esporre la classe stessa, ma un'istanza della classe.

# Some code that grabs msgBus connection, dbConnStr

class SchedulerService
  constructor: (@msgBus, connStr) ->
    # Some logic setting up service.
  somePublicMethod: (cb) ->
    cb()

module.exports = new SchedulerService(msgBus, dbConnStr)

Se si guardano i documenti questi moduli verranno memorizzati nella cache, consentendo di richiedere questi servizi e di avere l'inizializzazione viene eseguita una volta per servizio.

Ci sono degli svantaggi in questo tipo di modello di modulo? Una cosa di cui dovrei preoccuparmi è di invalidare la cache dei moduli, ma sembra che ciò non avvenga in circostanze normali.

Un'altra preoccupazione è il codice boilerplate per afferrare questi valori comuni, ma ritengo che sia risolvibile da un modulo il cui unico compito è fornire questo tipo di argomenti.

Qualche altra cosa che mi manca qui? Sembra un modello di servizio valido con CoffeeScript.

    
posta AlbertEngelB 02.03.2015 - 16:50
fonte

1 risposta

2

Posso pensare ad alcuni motivi per esporre la classe e non l'istanza di singleton.

  1. Testabilità del servizio
  2. Riusabilità della classe
  3. Gestione del ciclo di vita delle istanze di servizio

Se si sta nascondendo intenzionalmente il costruttore della classe, come si possono mai scrivere test unitari che esercitano solo il proprio codice e nessuna delle sue dipendenze (i suoi argomenti del costruttore). Hai appena rimosso la possibilità di prendere in giro le sue dipendenze e testare la classe in modo isolato.

Se la classe non è destinata a far parte di un'API pubblica, la riusabilità non è un grosso problema in quanto è sempre possibile modificare il codice in un secondo momento. Tuttavia, la strutturazione del codice per i costi iniziali della riusabilità è minima e ha il potenziale per farti risparmiare un sacco di lavoro quando il tuo schema di singleton non funziona per alcuni problemi di classe.

Il mio terzo punto è meno comune, ma se vuoi che le istanze dei servizi vengano create e gestite nel contesto di qualcosa come una connessione al database, diventa più importante. La gestione del ciclo di vita di creazione / pulizia delle risorse diventa molto più semplice quando puoi incapsulare il concetto nella sua piccola scatola.

    
risposta data 02.03.2015 - 20:39
fonte

Leggi altre domande sui tag