Подтвердить что ты не робот

Разработка приложения 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 не зависит от других классов?

Заранее благодарим вас, и я надеюсь, что я достаточно хорошо себя зарекомендовал!

4b9b3361

Ответ 1

Несколько предложений

  • Шаблоны проектирования - это руководство, которое поможет вам сэкономить ваши усилия на решении уже разрешенных проблем, они не являются строгими правилами.
  • В то время как сайт, на который вы ссылаетесь (raywenderlich.com), является хорошим началом для учебников, для более подробного изучения шаблонов проектирования в swift я предлагаю Шаблоны проектирования в Swift
  • Если HttpClient и PersistencyManager являются базовыми классами, которые обеспечивают интерфейс, чем протокол, это не имеет особого значения. Я согласен с тем, что протоколы - это более общий способ перехода сюда.
  • Если вы идете с протоколами, я бы указал менеджера клиента и постоянства в инициализаторе, поскольку они необходимы.
  • Сохраняющиеся модели - достаточно определенная роль, которую нужно обрабатывать одним классом, см. realm.io для примера db

Ответ 2

Поскольку первая строка вопроса утверждает, что вы хотите "самостоятельно разработать реальное приложение", поэтому я просто хочу указать вам в правильном направлении.

Факт не существует "наилучшего" способа структурирования вашего кода. Существует множество способов написания кода, который выполняет одну и ту же задачу. И если вы не работаете в команде и не строите очень сложное приложение, на самом деле не имеет значения, какой подход вы следуете.

Как вы сказали, что вы научились быстро, я бы посоветовал вам сосредоточиться на изучении расширенных функций быстрого, например, закрытий и протоколов. После того, как вы знакомы с ними, вам нужно будет ознакомиться с SDK iOS, который имеет множество встроенных фреймворков, которые вам нужно будет использовать в вашем приложении.

Наконец, начните работу с вашим приложением как можно скорее. Возможно, вы не сможете писать чистый и хорошо структурированный код в своем первом приложении, но это то, чему вы научитесь со временем, совершив ошибки и исправив их позже. Просто чтобы вас поощрить, я хотел бы сказать вам, что сделать простое приложение не очень сложно, я узнал цель c и сделал свою первую игру за 20 дней, и вы тоже можете это сделать. Если вам нужны какие-либо учебники/ресурсы, просто оставьте комментарий, я обновлю ответ.

Сосредоточьтесь на создании приложения. Улучшите его позже, когда вы его построили.