Modello di rendering del motore uso legittimo di un singleton?

0

Ho scritto una classe singleton standalone (scaffold) stasera che funge da facciata per poche altre classi, tra cui una classe template e una classe view. Modelli e viste sono entrambi nominati e le istanze di ciascuno sono memorizzati nell'oggetto scaffold. I modelli possono contenere viste e le viste possono contenere altre viste. Un modello e le sue viste contenute vengono visualizzate quando:

scaffold->render('template_name')

Rendere un'impalcatura un Singleton mi è sembrata una buona idea, perché:

  • Voglio controllare quando e come viene costruito l'oggetto
  • Voglio solo un'istanza (la GUI verrà renderizzata una sola volta, indipendentemente dal modello che viene renderizzato)
  • Tutto lo stato può essere facilmente rilasciato dalla classe scaffold (se, per ragioni di test o altro, volevo)

Questo sembra un caso d'uso accettabile? In caso contrario, quali considerazioni di progettazione specifiche sto trascurando?

Nessuna guerra religiosa, per favore. Non ho incluso la lingua perché spero in una considerazione agnostica della lingua, ma dirò:

  • Linguaggio di scripting
  • Filettato singolo
posta Calvin Froedge 01.08.2012 - 09:21
fonte

2 risposte

3

Ci sono pochissime circostanze in cui un singleton sia legittimo (l'unico che mi viene in mente è fornire un'interfaccia a un dispositivo hardware o registro che deve essere condiviso ma per il quale sarebbe catastrofico se ogni programma che accede al risorsa lo ha fatto allo stesso tempo). I singleton presentano molte più difficoltà di quanto non facciano, sono essenzialmente stati globali e creano dipendenze nascoste, il che rende il test delle unità molto più difficile di quanto sarebbe se si passassero le dipendenze come parametri

    
risposta data 01.08.2012 - 10:00
fonte
2

La particolarità di Singletons è che impone che non può esserci una sola istanza in un dato momento. I singleton sono in qualche modo appropriati quando devi far rispettare questo; se essere unico nel suo genere è conveniente, ma non assolutamente necessario, non è necessario un Singleton.

Non c'è motivo di nascondere il costruttore: rendilo accessibile pubblicamente e fornisci un metodo statico per ottenere l'istanza 'predefinita' globale. La maggior parte della tua base di codice lo utilizzerà, è accessibile da qualsiasi luogo (che non è necessariamente una buona cosa, stai scambiando la sicurezza per comodità), ma se decidi che ad un certo punto hai bisogno di un'istanza dedicata (ad esempio per i test, o perché il motore del modello presenta uno stato in cui è necessario interagire senza influire su altre parti della base di codici), sei libero di crearne uno.

    
risposta data 01.08.2012 - 13:36
fonte

Leggi altre domande sui tag