开发 Swift iOS 应用 "The Right Way"

Developing a Swift iOS app "The Right Way"

最近,我学习了 Swift 和开发 iOS 应用程序的基础知识。现在,我想自己开发一个真正的应用程序,但是我很在意写出好的代码,所以我查找了 "best practices"、"design patterns" 和 "the right way" 来实现它。

在我的搜索中,我发现 great tutorial 关于 Swift iOS 应用程序中通常使用的所有设计模式以及它们在何处使用的示例。

但是我认为这个教程很棒,对我帮助很大,我觉得这只是一个开始,因为我看到很多 S.O.L.I.D。违反原则。例如:

查看 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
    }
}

看到这个我首先想到的是:这不是违反了依赖倒置原则吗?不应该将 httpClientpersistencyManager 声明为协议,然后 类 HttpClientPersistencyManager 实现该协议?

如果是这样的话,在某些时候,我将不得不定义 类,它实现了我将要使用的那些协议。我应该在哪里告诉应用程序?

我的另一个问题是:这个例子只实现了一个模型(Album),但如果它会实现许多其他模型呢? (AlbumAuthorGenre...)。不会 LibraryAPI 大到违反单一职责原则吗?

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

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

几点建议

  1. 设计模式是一种指南,可以帮助您省去解决已经解决的问题的精力,它们并不是严格的规则
  2. 虽然您 link (raywenderlich.com) 的站点是教程的良好开端,但要更详细地了解 swift 中的设计模式,我建议 Design Patterns In Swift
  3. 如果 HttpClient 和 PersistencyManager 是提供接口的基础 classes,那么协议并不是严格必需的。我同意协议是一种更通用的方式
  4. 如果您使用协议,我会在初始化程序中指定客户端和持久性管理器,因为它们是必不可少的
  5. 持久模型是一个足够具体的角色,可以由单个 class 处理,请参阅 realm.io 示例 db

由于问题的第一行表明您想 "develop a real application on your own" 因此我只想为您指出正确的方向。

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

正如您所说,您已经学习了 swift,我建议您现在重点学习 swift 的高级功能,例如闭包和协议。一旦您熟悉了这些,您就需要熟悉 iOS SDK,它有大量您需要在您的应用程序中使用的内置框架。

最后,请尽快开始使用您的应用程序。您可能无法在您的第一个应用程序中编写干净且结构良好的代码,但随着时间的推移,您将通过犯错误并在以后更正它们来学习。只是为了鼓励你,我想告诉你做一个简单的应用程序并不难,我学会了 objective c 并在 20 天内制作了我的第一款游戏,你也可以做到。如果您有任何需要tutorials/resources,请留下评论,我会更新答案。

专注于构建应用程序。构建应用程序后对其进行改进。