Недавно я научился 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 не зависит от других классов?
Заранее благодарим вас, и я надеюсь, что я достаточно хорошо себя зарекомендовал!