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

10-09 08:40