2013-08-23 6 views
5

La società per cui lavoro ha una classe ENORME (Globals.m) che è un singleton. Memorizza principalmente un gruppo di BOOL che dovrebbero andare in NSUserDefaults, ma ci sono anche indicazioni su cose come videoplay che appartengono a vari viewcontrollers. Sono abbastanza nuovo per lo sviluppo di iOS (e sono un internato modesto), ma so nel mio intestino che il codice odora il paradiso. Come posso spiegare perché usare un singleton per memorizzare tutte le variabili è sbagliato?Perché si sta utilizzando una cattiva pratica della classe Variabili globali (singleton)?

Modifica: Non voglio dire che i singleton sono cattivi, intendo solo in questo caso. Essenzialmente ogni variabile significativa nell'app è memorizzata in questa istanza.

+1

Un modello è solo uno schema ... Ciò che è veramente brutto è dire ciecamente qualcosa che è male solo perché pensi che sia ... I singleton non sono male, ma puoi ovviamente usare/creare singleton cattivi ... Dipende dal modo in cui li hai progettati/usati ... – Macmade

+0

Singleton è uno schema ... non usare in modo appropriato è cattivo e sento che qualcuno pensa che stia usando singleton quando in realtà non è singleton –

+0

Grazie a @JoshCaswell, l'ho visto prima , ma non ho seguito completamente tutti i suoi punti. Ci scusiamo per la ripetizione! – Febble

risposta

3

Un sacco di oggetti in UIKit sono singleton. L'oggetto UIApplication è un singleton. NSUserDefaults ha il singleton standardUserDefaults. UIDevice currentDevice restituisce un singleton.

Solo perché è un singleton non significa che sia cattivo. Ciò che è male è quando si inizia a legare funzionalità in altre classi al proprio oggetto singleton, con così profondamente radicato che non è possibile modificare facilmente il singleton o l'oggetto interessato.

Uso un singleton per archiviare le strutture di oggetti non-CoreData. Definisco anche alcuni metodi di supporto per ottenere la directory della libreria, i dati di codifica e l'archiviazione con chiave. Quindi posso fare riferimento a un oggetto matrice matrice ovunque ne abbia bisogno, o accedere facilmente a metodi che altrimenti sarebbero solo copia e incolla.

+0

Quindi se tutto ciò che stanno usando è variabile, allora non c'è nulla di male? – Febble

+0

Direi che se si accede direttamente e si modificano gli oggetti del singleton all'interno del codice del View Controller, invece di assegnare tali oggetti come proprietà della classe View Controller, questo è il momento in cui è sbagliato. ie '-viewDidLoad {[[[Singleton shared] array] addObject: newObject]; } 'sarebbe male, invece di impostare una proprietà per l'array nel View Controller e modificarlo lì. – Justin

0

Globals.m non sembra davvero un singleton e, in caso affermativo, sembra che sia utilizzato solo per scopi di configurazione? Quindi un file pieno di #defines o extern farebbe lo stesso, suppongo. Senza ulteriori dettagli è difficile sapere cosa stai cercando.

+0

È impostato come un singleton e ha esplicitamente un commento che si riferisce ad esso come un singleton. Ed è attivamente utilizzato per memorizzare qualsiasi variabile che deve accedere ad altre classi, non solo per la configurazione. A parte l'interfaccia utente, in realtà non si riferiscono tra loro. Tutto viene eseguito tramite NSNotificationCenter e questa istanza Globals. È molto probabile che sia appena arrivato alla conclusione che è una cattiva pratica, come ho detto, non sono molto esperto. – Febble