开发 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
}
}
看到这个我首先想到的是:这不是违反了依赖倒置原则吗?不应该将 httpClient
和 persistencyManager
声明为协议,然后 类 HttpClient
和 PersistencyManager
实现该协议?
如果是这样的话,在某些时候,我将不得不定义 类,它实现了我将要使用的那些协议。我应该在哪里告诉应用程序?
我的另一个问题是:这个例子只实现了一个模型(Album
),但如果它会实现许多其他模型呢? (Album
、Author
、Genre
...)。不会 LibraryAPI
大到违反单一职责原则吗?
最后但并非最不重要的... PersistencyManager
中存在与 DIP 相同的问题。它不应该实现 DAO 模式,所以 `PersistencyManager 不依赖于其他 类?
提前谢谢你,我希望我解释得足够好!
几点建议
- 设计模式是一种指南,可以帮助您省去解决已经解决的问题的精力,它们并不是严格的规则
- 虽然您 link (raywenderlich.com) 的站点是教程的良好开端,但要更详细地了解 swift 中的设计模式,我建议 Design Patterns In Swift
- 如果 HttpClient 和 PersistencyManager 是提供接口的基础 classes,那么协议并不是严格必需的。我同意协议是一种更通用的方式
- 如果您使用协议,我会在初始化程序中指定客户端和持久性管理器,因为它们是必不可少的
- 持久模型是一个足够具体的角色,可以由单个 class 处理,请参阅 realm.io 示例 db
由于问题的第一行表明您想 "develop a real application on your own" 因此我只想为您指出正确的方向。
事实是没有"best"方式构建代码。您可以通过多种方式编写代码来完成相同的任务。除非您在团队中工作并构建非常复杂的应用程序,否则采用哪种方法并不重要。
正如您所说,您已经学习了 swift,我建议您现在重点学习 swift 的高级功能,例如闭包和协议。一旦您熟悉了这些,您就需要熟悉 iOS SDK,它有大量您需要在您的应用程序中使用的内置框架。
最后,请尽快开始使用您的应用程序。您可能无法在您的第一个应用程序中编写干净且结构良好的代码,但随着时间的推移,您将通过犯错误并在以后更正它们来学习。只是为了鼓励你,我想告诉你做一个简单的应用程序并不难,我学会了 objective c 并在 20 天内制作了我的第一款游戏,你也可以做到。如果您有任何需要tutorials/resources,请留下评论,我会更新答案。
专注于构建应用程序。构建应用程序后对其进行改进。
最近,我学习了 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
}
}
看到这个我首先想到的是:这不是违反了依赖倒置原则吗?不应该将 httpClient
和 persistencyManager
声明为协议,然后 类 HttpClient
和 PersistencyManager
实现该协议?
如果是这样的话,在某些时候,我将不得不定义 类,它实现了我将要使用的那些协议。我应该在哪里告诉应用程序?
我的另一个问题是:这个例子只实现了一个模型(Album
),但如果它会实现许多其他模型呢? (Album
、Author
、Genre
...)。不会 LibraryAPI
大到违反单一职责原则吗?
最后但并非最不重要的... PersistencyManager
中存在与 DIP 相同的问题。它不应该实现 DAO 模式,所以 `PersistencyManager 不依赖于其他 类?
提前谢谢你,我希望我解释得足够好!
几点建议
- 设计模式是一种指南,可以帮助您省去解决已经解决的问题的精力,它们并不是严格的规则
- 虽然您 link (raywenderlich.com) 的站点是教程的良好开端,但要更详细地了解 swift 中的设计模式,我建议 Design Patterns In Swift
- 如果 HttpClient 和 PersistencyManager 是提供接口的基础 classes,那么协议并不是严格必需的。我同意协议是一种更通用的方式
- 如果您使用协议,我会在初始化程序中指定客户端和持久性管理器,因为它们是必不可少的
- 持久模型是一个足够具体的角色,可以由单个 class 处理,请参阅 realm.io 示例 db
由于问题的第一行表明您想 "develop a real application on your own" 因此我只想为您指出正确的方向。
事实是没有"best"方式构建代码。您可以通过多种方式编写代码来完成相同的任务。除非您在团队中工作并构建非常复杂的应用程序,否则采用哪种方法并不重要。
正如您所说,您已经学习了 swift,我建议您现在重点学习 swift 的高级功能,例如闭包和协议。一旦您熟悉了这些,您就需要熟悉 iOS SDK,它有大量您需要在您的应用程序中使用的内置框架。
最后,请尽快开始使用您的应用程序。您可能无法在您的第一个应用程序中编写干净且结构良好的代码,但随着时间的推移,您将通过犯错误并在以后更正它们来学习。只是为了鼓励你,我想告诉你做一个简单的应用程序并不难,我学会了 objective c 并在 20 天内制作了我的第一款游戏,你也可以做到。如果您有任何需要tutorials/resources,请留下评论,我会更新答案。
专注于构建应用程序。构建应用程序后对其进行改进。