2017-06-20 3 views
0

Ich interagiere mit der Quizlet API und ich habe debattiert die beste Möglichkeit, um meinen Code zu strukturieren. Die Quizlet-API verfügt über mehrere Funktionen wie die Anzeige von Sets, Classes und andere User Informationen. Ich versuche, APIClients dafür zu schaffen, aber ich habe gekämpft, um eine bessere Lösung zu finden, um die Klienten zu modellieren oder das beste dieser möglichen Lösungen zu wählen.Subclassing vs Extension vs Inner Class

Lösung 1: erstellen superclass genannt QuizletManager und speichern Sie die grundlegenden Informationen wie clientID, access codes und zugehörige Informationen, die durch alle Unterklassen nützlich ist. Dann kann ich individuelle subclasses wie QuizletSet, QuizletClass, usw. erstellen, um das Abrufen der Sätze, Klassen und damit verbundenen Informationen zu behandeln. Wenn ich die Daten tatsächlich abrufen muss, würde ich wahrscheinlich nie anrufen QuizletManager; Ich würde jedoch neue Instanzen der QuizletSet und verwandten Klassen für die Vernetzung erstellen.

Lösung 2: Neue QuizletManager Super wieder mit all ihren verwandten Unterklassen. Dieses Mal würde ich jedoch alle meine Subklassen in Bezug auf Sets und all das in der QuizletManager Klasse instanziieren und Methoden innerhalb von QuizletManager haben, die die Unterklassen beim Abrufen von Informationen aufrufen. In diesem Fall würde ich immer anrufen und QuizletManager würde die Unterklassen verwenden, um die Informationen tatsächlich abzurufen.

Lösung 3: erstellen QuizletManager Klasse und es besser lesbar Verwendung Erweiterungen die Funktionalität des Abrufens Sets, Classes usw. Die Erweiterungen würden im Wesentlichen Funktionen enthalten hinzufügen zu machen, die die Funktionalität des Abrufens Sets und verwandte Informationen hinzufügen .

Lösung 4: In dieser Lösung hätte ich eine Klasse in einer Klasse. Im Wesentlichen würde, ich habe nur so etwas wie dieses:

class QuizletManager { 
    var clientID: String 
    // Other related properties important for sets, classes, etc. 
    class SetClient: APIClient { 
     // Fetch related info for sets. 
    } 
} 

Antwort

1

In jedem Ihrer vorherigen Beispielen, werden Sie zu einer Hierarchie gekoppelt oder alle API bezogenen Anrufe als Erweiterungen auf einer einzigen Klasse platzieren. Dies könnte Ihren Code weniger flexibel und schwerer zu warten machen. Eine Lösung, die für Sie arbeiten kann, ist die Verwendung Abhängigkeitsinjektion.

Hier ist ein Beispiel, wie Sie Ihren Code strukturieren könnten.

struct QuizletAPICredentials { 
    var clientID: String 
    var accessCodes: [String] 
    //etc... 
} 

class QuizletSetClient { 
    var credentials: QuizletAPICredentials 

    init(credentials: QuizletAPICredentials) { 
     self.credentials = credentials 
    } 

    func fetchSets(...) { 
     //get data... 
    } 
} 

Ich hoffe, das hilft! : -]

+0

Ahh, ich mag diesen Ansatz. Ich werde sehen, ob es weitere Vorschläge/Empfehlungen gibt und dann werde ich deine Antwort akzeptieren :) – Harish