Разработка приложения Swift iOS "Правильный путь"
Недавно я научился 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 не зависит от других классов?
Заранее благодарим вас, и я надеюсь, что я достаточно хорошо себя зарекомендовал!
Ответы
Ответ 1
Несколько предложений
- Шаблоны проектирования - это руководство, которое поможет вам сэкономить ваши усилия на решении уже разрешенных проблем, они не являются строгими правилами.
- В то время как сайт, на который вы ссылаетесь (raywenderlich.com), является хорошим началом для учебников, для более подробного изучения шаблонов проектирования в swift я предлагаю Шаблоны проектирования в Swift
- Если HttpClient и PersistencyManager являются базовыми классами, которые обеспечивают интерфейс, чем протокол, это не имеет особого значения. Я согласен с тем, что протоколы - это более общий способ перехода сюда.
- Если вы идете с протоколами, я бы указал менеджера клиента и постоянства в инициализаторе, поскольку они необходимы.
- Сохраняющиеся модели - достаточно определенная роль, которую нужно обрабатывать одним классом, см. realm.io для примера db
Ответ 2
Поскольку первая строка вопроса утверждает, что вы хотите "самостоятельно разработать реальное приложение", поэтому я просто хочу указать вам в правильном направлении.
Факт не существует "наилучшего" способа структурирования вашего кода. Существует множество способов написания кода, который выполняет одну и ту же задачу. И если вы не работаете в команде и не строите очень сложное приложение, на самом деле не имеет значения, какой подход вы следуете.
Как вы сказали, что вы научились быстро, я бы посоветовал вам сосредоточиться на изучении расширенных функций быстрого, например, закрытий и протоколов. После того, как вы знакомы с ними, вам нужно будет ознакомиться с SDK iOS, который имеет множество встроенных фреймворков, которые вам нужно будет использовать в вашем приложении.
Наконец, начните работу с вашим приложением как можно скорее. Возможно, вы не сможете писать чистый и хорошо структурированный код в своем первом приложении, но это то, чему вы научитесь со временем, совершив ошибки и исправив их позже. Просто чтобы вас поощрить, я хотел бы сказать вам, что сделать простое приложение не очень сложно, я узнал цель c и сделал свою первую игру за 20 дней, и вы тоже можете это сделать. Если вам нужны какие-либо учебники/ресурсы, просто оставьте комментарий, я обновлю ответ.
Сосредоточьтесь на создании приложения. Улучшите его позже, когда вы его построили.