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

Posted

技术标签:

【中文标题】开发 Swift iOS 应用程序“正确的方式”【英文标题】:Developing a Swift iOS app "The Right Way" 【发布时间】:2015-08-02 11:37:58 【问题描述】:

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

在我的搜索中,我找到了这个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 会不会太大以至于违反单一责任原则?

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

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

【问题讨论】:

这个问题最好在Code Review Stack Exchange上问 @DanielStorm 对不起,我什至不知道这个网站的存在。 【参考方案1】:

一些建议

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

【讨论】:

感谢您的链接。非常非常非常有用!【参考方案2】:

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

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

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

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

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

【讨论】:

我一直犯的一个错误。从一开始就一直想把它做到完美。但我会听从你的建议。谢谢! 如果你想开始自己的应用程序,直到你掌握了最好的编码设计和模式等等......你永远不会开始你的应用程序。顺便说一句,那是我的问题。我在考虑应用程序的每一个细节,而应用程序根本不存在。刚开始并从错误中吸取教训。我可以告诉我儿子注意生活中所有危险的事情,但如果他摔倒了,他实际上会学会,因为他不能学会站起来。做吧,我们稍后会处理这个问题:)

以上是关于开发 Swift iOS 应用程序“正确的方式”的主要内容,如果未能解决你的问题,请参考以下文章

iOS oc/swift开发要知道的(应)知(付)识(面)点(试)

iOS oc/swift开发要知道的(应)知(付)识(面)点(试)

如何以正确的方式在 IOS SWIFT 3 中解析 Google 距离矩阵 API JSON

如何为带有应嵌入视图控制器的句子的文本文件制作 iOS Swift“应用内购买”托管内容 pkg 文件?

iOS Swift - 如何获取本地和远程视频的纵横比?

图像幻灯片 Swift ios