2017-01-23 6 views
1

Ich habe eine Swift Singleton-Klasse, die App-Status durch Speichern mehrerer Arrays hält. Wie gehen die besten Praktiken hier vor? Sollten wir es ändern, und wenn wir es tun, wie? HierSwift: Refactor Singleton Muster

ist die Singleton-Klasse:

import Foundation 


class FilterModel { 
    static let sharedInstance = FilterModel() 
    private init() { } 

    var muscleExercisesArray = [Int]() 
    var equipmentExercisesArray = [Int]() 
    var typeExercisesArray = [Int]() 
} 
+0

Fügen Sie NSCoding hinzu, damit Sie die Daten zwischen den App-Starts persistieren können. – muescha

Antwort

2

Wenn Sie über die Grund Singletonmuster sich fragen, ein paar Beobachtungen:

  1. könnte ich Ihnen vorschlagen, erklären die Klasse final zu sein auch, um zu vermeiden, dass irgendein zukünftiger Entwickler eine Unterklasse bildet und Verwirrung darüber weckt, auf welchen Typ sich sharedInstance bezieht.

  2. Ich könnte auch vorschlagen, dass in Swift 3 die Konvention ist, den Namen sharedInstance zu nur shared zu vereinfachen. Es ist keine feste Regel, aber es ist der neue Standard.

  3. Diese Implementierung ist nicht Thread-sicher. Wenn Sie damit einverstanden sind, würde ich zumindest eine Warnung in die Kommentare aufnehmen, in der künftige Entwickler dieses Problems gewarnt werden. Oder, natürlich, mit ein wenig Arbeit könnten Sie dies threadsicher ändern, indem Sie all dies in einen internen Synchronisationsmechanismus einbetten.


Sie sagte:

Singletons ein schlechter Ansatz zur App-Architektur angesehen werden, so dass ich frage mich, was anstatt es zu tun, wenn wir App Zustand halten müssen. Irgendwie kann ich nicht alles online außer für DI Ansatz finden, die nicht (oder ich weiß nicht, wie) funktionieren in diesem Fall, wenn wir App-Status müssen von verschiedenen Dateien

Ja modifiziert werden, Singletons sind nicht ideal für Modellobjekte aus verschiedenen Gründen (macht Komponententests schwieriger, macht Verantwortlichkeiten unklar usw.) und es gibt bessere Muster (siehe What's Alternative to Singleton). Mindestens ein einfacher Ansatz besteht darin, dass der App-Delegat oder der Root-Ansichtscontroller dieses Modellobjekt instanziiert und es dann nur an die nachfolgenden Controller weitergibt, die darauf zugreifen müssen (z. B. in prepareForSegue). Auf diese Weise wird deutlich, welche Objekte mit dem Modell interagieren und die Verantwortlichkeiten ein wenig klarer machen.

+0

Singletons werden als schlechte Annäherung an die App-Architektur betrachtet. Daher habe ich mich gefragt, was zu tun ist, wenn der App-Status beibehalten werden soll. Irgendwie kann ich nichts online finden, außer für den DI-Ansatz, der in diesem Fall nicht funktioniert (oder ich weiß nicht wie), wenn wir den App-Zustand durch verschiedene Dateien ändern müssen –

+0

Aha, verstanden. Vielen Dank! –