【发布时间】: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
}
}
看到这个我首先想到的是:这不违反依赖倒置原则吗?不应该将httpClient 和persistencyManager 声明为协议,然后HttpClient 和PersistencyManager 类实现该协议吗?
如果是这样的话,在某些时候,我将不得不定义我将使用哪些实现这些协议的类。我应该在哪里告诉应用程序?
我的另一个问题是:这个例子只实现了一个模型 (Album),但如果它实现了许多其他模型呢? (Album、Author、Genre...)。 LibraryAPI 会不会太大以至于违反单一责任原则?
最后但并非最不重要... DIP 存在同样的问题PersistencyManager。不应该实现DAO模式,所以`PersistencyManager不依赖其他类吗?
提前谢谢你,我希望我解释得足够好!
【问题讨论】:
-
这个问题最好在Code Review Stack Exchange上问
-
@DanielStorm 对不起,我什至不知道这个网站的存在。
标签: ios iphone swift design-patterns solid-principles