以正确的方式开发Swift iOS应用程序

18

最近,我学习了Swift和开发iOS应用的基础知识。现在,我想自己开发一个真正的应用程序,但我非常关心编写良好的代码,因此我查找了“最佳实践”,“设计模式”和“正确的方式”来实现它。

在我的搜索中,我找到了这篇很棒的教程,介绍了Swift iOS应用通常使用的所有设计模式以及它们使用的示例。

但尽管我认为这个教程非常好并帮助了我很多,但我感觉这只是一个开始,因为我看到了许多S.O.L.I.D.原则的违规。例如:

请看LibraryAPI中实现的Facade模式:

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会变得很大,违反单一责任原则吗?
最后但并非最不重要的...... DIP中存在与PersistencyManager相同的问题。它不应该实现DAO模式,这样`PersistencyManager就不会依赖于其他类了。
预先感谢您,希望我自己解释得足够清楚!

6
这个问题也许更适合在 Code Review Stack Exchange 上提问。 - Daniel Storm
3
@DanielStorm,抱歉,我甚至不知道这个网站的存在。 - barbarity
2个回答

17

一些建议

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

7
由于您在问题的第一行中提到了想要“自己开发一个真正的应用程序”,因此我想给您指明正确的方向。事实上,没有一种“最好”的代码结构方式。有许多方法可以编写完成同样任务的代码。除非您正在团队中工作并构建非常复杂的应用程序,否则您遵循的方法并不重要。
既然您已经学习了Swift,我建议您现在专注于学习Swift的高级特性,如闭包和协议。一旦您熟悉了这些内容,就需要熟悉iOS SDK,它具有许多内置框架,您需要在应用程序中使用它们。
最后,尽快开始您的应用程序。您可能无法在第一次应用程序中编写干净和良好结构化的代码,但是通过犯错误并随后进行更正,您会逐渐学会。只是为了鼓励您,我想告诉您制作一个简单的应用程序并不是很难,我学习了Objective-C并在20天内制作了我的第一个游戏,您也可以做到。如果您需要任何教程/资源,请留言,我会更新答案。
专注于构建应用程序。建立后再进行改进。

我一直在犯一个错误。总是想从一开始就完美地做好它。但我会听取你的建议。谢谢! - barbarity
1
如果你想要在掌握最佳编码设计和模式等方面之前就开始自己的应用程序...你永远不会开始你的应用程序。顺便说一下,这就是我的问题。我一直在考虑应用程序的每一个细节,而实际上应用程序根本不存在。只要开始并从错误中学习。我可以告诉我的儿子要注意生活中所有危险的事情,但他只有在跌倒后才能学会站起来。就这样做吧,我们以后再解决问题 :) - AndaluZ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接