2017-06-20 93 views
0

我正在与Quizlet API进行交互,我一直在讨论构建代码的最佳方式。 Quizlet API具有多种功能,例如查看Sets,Classes和其他User信息。我试图为此创建APIClients,但我一直在努力寻找更好的解决方案来为客户建模或从这些潜在解决方案中选择最好的解决方案。继承vs扩展与内部类

解决方案1: 创建一个名为superclassQuizletManager存储像clientIDaccess codes这是在所有的子类有用的基本信息,以及相关的信息。然后我可以创建个人subclasses,如QuizletSet,QuizletClass等来处理获取集合,类和相关信息。当我真的需要获取数据时,我可能永远不会打电话给QuizletManager;不过,我会创建QuizletSet和相关类的新实例来完成联网。

解决方案2: 再次创建一个QuizletManager超类与它的所有相关子类。然而,这次我将实例化所有与集合相关的子类以及QuizletManager类中的所有子类,并在获取信息时调用子类中的方法QuizletManager。 在这种情况下,我总是打电话QuizletManagerQuizletManager将使用子类实际获取信息。

解决方案3: 创建QuizletManager类,并使其更具可读性使用附加功能来添加获取SetsClasses等扩展将基本上包含添加获取Sets和相关信息的功能函数的功能。

解决方案4: 在这个解决方案中,我将有一个类内的类。从本质上讲,我只希望有这样的事情:

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

回答

1

在每一个与你以前的例子,您连接到一个层次或将所有API相关的调用作为一个单独的类扩展。这可能会使你的代码变得更加灵活和难以维护。一种可能适用于您的解决方案是使用依赖关系注入

下面是如何构造代码的示例。

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

class QuizletSetClient { 
    var credentials: QuizletAPICredentials 

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

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

我希望这有助于! : - ]

+0

啊,我喜欢那种方式。我会看看是否有任何其他建议/建议,然后我会接受你的回答:) – Harish