我正在与Quizlet API
交互,我一直在讨论构造代码的最佳方法。Quizlet API具有多种功能,例如查看Sets
、Classes
和其他User
信息。我试图为这个创建APIClients
,但我一直在努力寻找更好的解决方案来为客户建模,或者从这些潜在的解决方案中选择最好的解决方案。
解决方案1:
创建名为superclass
的QuizletManager
并存储基本信息,如clientID
、access codes
,以及在所有子类中都有用的相关信息。然后我可以创建单独的subclasses
,比如QuizletSet
,QuizletClass
,来处理集合、类和相关信息的获取。当我真正需要获取数据时,我可能永远不会调用QuizletManager
;但是,我会创建QuizletSet
和相关类的新实例来进行联网。
解决方案2:
使用所有相关的子类再次创建一个QuizletManager
超类。不过,这次我实例化了所有与集合相关的子类,以及QuizletManager
类中的所有子类,并且在QuizletManager
中有一些方法在获取信息时调用子类。
在这种情况下,我总是调用QuizletManager
并且QuizletManager
将使用子类来实际获取信息。
解决方案3:
创建一个QuizletManager
类并使其更具可读性,使用扩展来添加fetchingSets
、Classes
等功能。扩展实际上包含添加fetchingSets
和相关信息功能的函数。
解决方案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...
}
}
我希望这有帮助!:-]
关于swift - 子类化,扩展类与内部类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44657532/