最近,我学习了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
}
}
看到这个,我首先想到的是:这难道不违反了依赖倒置原则吗?httpClient
和persistencyManager
不应该被声明为协议,然后类HttpClient
和PersistencyManager
实现该协议吗?如果是这样的话,在某个时候,我将不得不定义要使用哪些实现了这些协议的类。我应该在哪里告诉应用程序呢?
我还有一个问题:这个例子只实现了一个模型(
Album
),但如果它实现了许多其他模型呢? (Album
,Author
,Genre
...)。LibraryAPI
会变得很大,违反单一责任原则吗?最后但并非最不重要的...... DIP中存在与
PersistencyManager
相同的问题。它不应该实现DAO模式,这样`PersistencyManager就不会依赖于其他类了。预先感谢您,希望我自己解释得足够清楚!