我正在与Quizlet API
交互,我一直在争论构建代码的最佳方式。Quizlet API具有多种功能,例如查看Sets
、Classes
和其他User
信息。我正在尝试为此创建APIClients
,但我一直在努力寻找更好的解决方案来建模客户或从这些潜在解决方案中选择最佳解决方案。
解决方案1:创建一个名为QuizletManager
的superclass
,并存储基本信息,如clientID
、access codes
和相关信息,这些信息在所有子类中都很有用。然后我可以创建单独的subclasses
,如QuizletSet
、QuizletClass
等来处理获取集合、类和相关信息。当我实际需要获取数据时,我可能永远不会最终调用QuizletManager
;但是,我会创建QuizletSet
和相关类的新实例来执行网络。
解决方案 2:再次创建一个QuizletManager
超类及其所有相关子类。但是,这次我将实例化与 Set 相关的所有子类以及QuizletManager
类中的所有子类,并在QuizletManager
中具有在获取信息时调用子类的方法。 在这种情况下,我总是调用QuizletManager
,QuizletManager
将使用子类来实际获取信息。
解决方案 3:创建一个QuizletManager
类并使其更具可读性,使用扩展来添加获取Sets
、Classes
等功能。这些扩展基本上包含添加获取Sets
和相关信息的功能的函数。
解决方案4:在此解决方案中,我将在类中有一个类。 本质上,我只是有这样的东西:
class QuizletManager {
var clientID: String
// Other related properties important for sets, classes, etc.
class SetClient: APIClient {
// Fetch related info for sets.
}
}
在前面的每个示例中,您都耦合到层次结构或将所有与 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...
}
}
我希望这有帮助! :-]