开发Swift iOS应用程序"正确的方法"

bar*_*ity 17 iphone design-patterns ios solid-principles swift

最近,我学习了Swift以及开发iOS应用程序的基础知识.现在,我想自己开发一个真正的应用程序,但我非常关心编写好的代码,所以我一直在寻找"最佳实践","设计模式"和"正确的方法"来实现它.

在我的搜索中,我发现了这个关于Swift iOS应用程序中通常使用的所有设计模式的精彩教程以及它们在何处使用的示例.

但是我认为这个教程很棒并且对我帮助很大,我觉得这只是一个开始,因为我看到很多SOLID原则违规.例如:

请参阅LibraryAPI中实现的外观模式:

class LibraryAPI: NSObject {

    private let persistencyManager: PersistencyManager
    private let httpClient: HTTPClient
    private let isOnline: Bool

    class var sharedInstance: LibraryAPI {

        struct Singleton {
            static let instance = LibraryAPI()
        }

        return Singleton.instance
    }

    override init() {
        persistencyManager = PersistencyManager()
        httpClient = HTTPClient()
        isOnline = false

        super.init()
        NSNotificationCenter.defaultCenter().addObserver(self, selector:"downloadImage:", name: "BLDownloadImageNotification", object: nil)
    }

    deinit {
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }

    func getAlbums() -> [Album] {
        // ... Not relevant
    }

    func addAlbum(album: Album, index: Int) {
        // ... Not relevant
    }

    func deleteAlbum(index: Int) {
        // ... Not relevant
    }

    func downloadImage(notification: NSNotification) {
        // ... Not relevant
    }
}
Run Code Online (Sandbox Code Playgroud)

我想到的第一件事就是:这是否违反了依赖性倒置原则?不应该httpClientpersistencyManager被宣布为协议,然后将类HttpClientPersistencyManager落实该协议?

如果是这种情况,那么在某些时候,我将不得不定义实现这些协议的类,我将使用它.我应该在哪里告诉应用程序?

我的另一个问题是:这个例子只实现了一个Model(Album),但是如果它实现了许多其他的呢?(Album,Author,Genre...).会不会LibraryAPI那么大,以至于会违反单一责任原则?

最后但并非最不重要的...... DIP存在同样的问题PersistencyManager.它不应该实现DAO模式,所以`PersistencyManager不依赖于其他类吗?

提前谢谢你,我希望我解释得很好!

Mar*_*sel 17

一些建议

  1. 设计模式是帮助您节省解决已解决问题的工作的指南,它们不是严格的规则
  2. 虽然您链接到的网站(raywenderlich.com)是一个很好的教程开始,但是为了更详细地了解swift中的设计模式,我建议使用Swift中的Design Patterns
  3. 如果HttpClient和PersistencyManager是提供接口的基类,则协议不是严格必需的.我同意协议是一种更通用的方式
  4. 如果你使用协议,我会在初始化程序中指定客户端和持久性管理器,因为它们是必不可少的
  5. 持久模型是一个特定的角色,由单个类处理,请参阅realm.io以获取示例数据库


Ank*_*oel 7

由于第一行问题表明你想"自己开发一个真正的应用程序",因此我只想指出你正确的方向.

事实上,没有"最佳"的方法来构建代码.您可以通过多种方式编写完成相同任务的代码.除非您在团队中工作并构建一个非常复杂的应用程序,否则您遵循哪种方法并不重要.

正如你所说,你已经学会了迅速,我建议你现在专注于学习像闭包和协议这样的swift的高级功能.熟悉这些内容后,您需要熟悉iOS SDK,其中包含您需要在应用中使用的大量内置框架.

最后,请尽快开始使用您的应用.您可能无法在第一个应用程序中编写干净且结构良好的代码,但随着时间的推移,您将通过犯错并在以后更正它们来学习.为了鼓励你,我想告诉你,制作一个简单的应用并不是很难,我学会了客观的c并在20天内完成了我的第一场比赛,你也可以做到.如果您需要任何教程/资源,只需发表评论,我会更新答案.

专注于构建应用程序.在您构建它之后改进它.