Здесь я буду обсуждать шаблоны проектирования, которые используются в большинстве фреймворков Apple.

Давайте нырнем! 😀

Что такое шаблоны проектирования?

Шаблоны проектирования - это решение повторяющихся проблем, с которыми сталкивается разработчик программного обеспечения. Использование шаблонов проектирования помогает нам разделить код, обеспечить единоличную ответственность и возможность тестирования. Это дает нам общий словарь для использования в сообществе, не зависящий от какого-либо языка. Это вдохновляет меня изучать и писать вечнозеленые шаблоны дизайна.

Ниже представлены три типа шаблонов проектирования.

1. Шаблоны создания предоставляют механизмы создания объектов, которые помогают нам повысить гибкость и возможность повторного использования существующего кода.

2. Структурные шаблоны объясняют, как собирать объекты и классы в более крупные структуры.

3. Поведенческие шаблоны дизайна - это шаблоны проектирования, которые определяют общие шаблоны взаимодействия между объектами

Давайте поговорим о шаблонах, используемых в iOS SDK.

Синглтон - это творческий шаблон дизайна. Он позволяет существовать только одному объекту за весь жизненный цикл. Чтобы избежать неправильного использования, мы должны сделать init () закрытым, чтобы никакой другой экземпляр не мог быть создан за пределами, чтобы избежать ненужных ошибок. Внедрение синглтонов делает зависимость более понятной и простой для имитации во время тестирования.

let defaults = UserDefaults.standard
let application = UIApplication.shared

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

Если вам необходимо выполнить дополнительную настройку помимо инициализации. Затем вы можете присвоить результат вызова замыкания глобальной константе.

Подробнее читайте в документации по Apple здесь.

Цепочка ответственности ⛓️ - это шаблон поведенческого проектирования. Это позволяет передавать запросы по цепочке обработчиков. Получив запрос, каждый обработчик решает либо обработать запрос, либо передать его по цепочке.

например, каждый UIResponder в иерархии пользовательского интерфейса решает, обрабатывать касание или передавать другим респондентам

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

Выход:

Фасад - шаблон структурного проектирования. Это позволяет использовать единый упрощенный интерфейс для всех внешних клиентов. Один класс представляет все подсистемы.

например, CoreData NSPersistentContainer. Контейнер, который инкапсулирует стек Core Data в вашем приложении. NSPersistentContainer упрощает создание стека Core Data и управление им, обрабатывая создание модели управляемых объектов (NSManagedObjectModel), постоянного координатора хранилища (NSPersistentStoreCoordinator) и контекста управляемого объекта (NSManagedObjectContext).

Давайте посмотрим, как мы строили основной стек данных до iOS 10.

guard let modelURL = Bundle.main.url(forResource: "DataModel",
                                     withExtension: "momd") else {
    fatalError("Failed to find data model")
}
guard let mom = NSManagedObjectModel(contentsOf: modelURL) else {
    fatalError("Failed to create model from file: \(modelURL)")
}
let psc = NSPersistentStoreCoordinator(managedObjectModel: mom)
let dirURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last
let fileURL = URL(string: "DataModel.sql", relativeTo: dirURL)
do {
    try psc.addPersistentStore(ofType: NSSQLiteStoreType,
                               configurationName: nil,
                               at: fileURL, options: nil)
} catch {
    fatalError("Error configuring persistent store: \(error)")
}

Но после реализации фасада все стало намного проще.

lazy var persistentContainer: NSPersistentContainer = {        
        let container = NSPersistentContainer(name: "DataModel")
        container.loadPersistentStores { description, error in
            if let error = error {
                fatalError("Unable to load persistent stores: \(error)")
            }
        }
        return container
    }()

Наблюдатель - это поведенческий паттерн, который создает взаимозависимость между объектами. Когда один объект меняет состояние, все его иждивенцы получают уведомление и могут обновляться.

например, KVO, NotificationCenter.

Давайте посмотрим, как мы можем быстро реализовать наш собственный шаблон наблюдателя.

Выход:

Спасибо за прочтение! 🚀

Ресурсы:
https://sourcemaking.com/design_patterns

Https://www.geeksforgeeks.org/software-design-patterns/

Https://refactoring.guru/design-patterns



Спасибо за чтение! Если вам понравилась эта статья, пожалуйста 👏, чтобы ее могли прочитать и другие люди :)

Подпишитесь на меня в Twitter, чтобы узнать больше.

📝 Сохраните эту историю в Журнале.

👩‍💻 Просыпайтесь каждое воскресное утро и слушайте самые интересные истории недели в области технологий, которые ждут вас в вашем почтовом ящике. Прочтите информационный бюллетень« Примечательно в технологиях .