最近,我学习了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类实现该协议?
如果是这种情况,在某些时候,我将必须定义什么类,实现这些协议,我将要使用。我应该在哪里告诉应用程序?
我还有一个问题是:这个例子只实现了一个Model(Album),但是如果它会实现很多其他的呢? (专辑,作者,类型…)。 LibraryAPI不会如此大,以致违反单一责任原则?
最后但并非最不重要的一点:在PersistencyManager中存在DIP的相同问题。不应该实现DAO模式,所以`PersistencyManager不依赖于其他类?
谢谢你提前,我希望我自己解释够好!