Недавно я научился Swift и основам разработки приложения для iOS. Теперь я хочу разработать собственное приложение самостоятельно, но я очень обеспокоен написанием хорошего кода, поэтому я искал "лучшие практики", "шаблоны проектирования" и "правильный путь" для его достижения.
В моем поиске я нашел этот отличный учебник о всех шаблонах проектирования, обычно используемых в приложении 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 не зависит от других классов?
Заранее благодарим вас, и я надеюсь, что я достаточно хорошо себя зарекомендовал!