Книга: Swift. Основы разработки приложений под iOS, iPadOS и macOS. 5-е изд. дополненное и переработанное
Назад: 38. Разработка приложения под iOS
Дальше: Заключение

39. Паттерны проектирования при разработке в Xcode

Мы близки к завершению нашего курса. Вам осталось познакомиться всего с одной темой, прежде чем вы самостоятельно продолжите свой путь в качестве iOS-разработчика.

В своей практике разработчикам часто приходится решать типовые задачи, для реализации которых уже найдены оптимальные пути и шаблоны. Они называются паттернами проектирования. Благодаря паттернам программисты могут, что называется, не изобретать велосипед, а использовать опыт сотен тысяч или даже миллионов людей. Говоря другими словами, шаблоны проектирования формализуют и описывают решение типовых задач программирования.

В настоящее время существует большое количество книг, описывающих огромное число всевозможных паттернов, часть из которых важно знать и понимать при разработке приложений под iOS и macOS. Если вы занимались программированием ранее, то наверняка слово «паттерны» неоднократно вам встречалось, а может, вы даже использовали некоторые из них в своей работе.

В этой главе приведены несколько основных паттернов, с которыми вы встретитесь в ходе создания приложений в Xcode.

39.1. Паттерн MVC. Фреймворк Cocoa Touch

MVC расшифровывается как Model-View-Controller (Модель-Отображение-Контроллер) и является основой построения программных продуктов в среде Xcode. Этот паттерн предполагает полное разделение кода, данных и внешнего вида приложения друг от друга. Каждый из этих элементов создается и управляется отдельно. Сегодня большинство объектно-ориентированных библиотек построены с учетом MVC.

Как говорилось ранее, данный шаблон подразумевает разделение всех составляющих разработки на три категории:

• Модель — классы, которые обеспечивают хранение данных ваших приложений.

• Отображение (Представление) — позволяют создать различные графические элементы, которые видит пользователь при работе с приложением.

• Контроллер — обеспечивает совместную работу «отображения» и «модели». Данный блок содержит логику работы приложения.

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

MVC позволяет достичь максимального разделения трех основных категорий, что впоследствии позволяет удобно обновлять и перерабатывать программу, а также повторно использовать отдельные компоненты. Так, например, класс, который обеспечивает отображение кнопки, без труда может быть дополнен, расширен и многократно использован в любых приложениях.

Все возможности по разработке iOS-приложений предоставляет iOS SDK (software development kit, комплект средств разработки), который входит в состав Xcode. Данный SDK предоставляет огромное число ресурсов, благодаря которым вы можете строить UI, организовывать мультитач-управление, хранение данных в БД, работу с мультимедиа, передачу данных по сети, использование функций устройств (акселерометр и т.д.) и многое-многое другое. В состав iOS SDK входит фреймворк Cocoa Touch, который как раз построен на принципе MVC.

Во время разработки приложений в Xcode вы работали с категорией «Отображения» с помощью Interface Builder, но при этом не обеспечивали решения каких-либо бизнес-процессов с помощью графических элементов.

Категория «Контроллер» включает в себя специфические классы, обеспечивающие функциональность ваших приложений, например UIViewController, а точнее, его потомок ViewController, с которым вы работали ранее.

Элементы категории «Модель» не были рассмотрены в книге, тем не менее в будущем вы станете создавать механизмы, обеспечивающие хранение данных ваших приложений.

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

39.2. Паттерн Singleton. Класс UIApplication

Глобальные переменные могут стать значительной проблемой при разработке программ с использованием ООП. Они привязывают классы к их контексту, и повторное использование этих классов в других проектах становится просто невозможным. Если в классе используется глобальная переменная, то его невозможно извлечь из одного приложения и применить в другом, не убедившись, что в новом проекте используется в точности такой же набор глобальных переменных.

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

В хорошо спроектированных системах внешние относительно классов параметры обычно передаются в виде входных аргументов для методов этого класса. При этом каждый класс сохраняет свою независимость от других. Тем не менее время от времени возникает необходимость использовать общие для некоторых классов ресурсы.

Предположим, в вашей программе требуется хранить набор параметров в константе prefences, который должен быть доступен любому классу в рамках приложения. Одним из выходов является объявление этого параметра в виде глобального и его использование внутри классов, но, как мы говорили ранее, такой способ не является правильным. Другим способом решения этой задачи может служить использование паттерна Singleton.

Шаблон проектирования Singleton подразумевает существование только одного экземпляра класса, который может быть использован в любом другом контексте. Для того чтобы обеспечить это требование, в классе создается единая точка доступа к экземпляру этого класса. Так, например, мог бы существовать класс Prefences, для доступа к экземпляру которого мы могли бы использовать метод Prefences.singleton(). При попытке использования данного метода из любого другого класса будет возвращен один и тот же экземпляр.

Примером использования паттерна Singleton при разработке под iOS может служить класс UIApplication, экземпляр которого является стартовой точкой каждого приложения. Любое приложение, которое вы создаете, содержит в себе и использует только один экземпляр класса UIApplication, доступ к которому обеспечивается с помощью шаблона Singleton. UIApplication выполняет большое количество задач, в том числе обеспечивает вывод на экран устройства окна вашего приложения (экземпляр класса UIWindow) и отображение в нем стартовой сцены. Вам, как разработчику, никогда не придется самостоятельно создавать экземпляр класса UIApplication, система делает это автоматически, независимо от кода приложения, и постоянно работает фоном.

ПРИМЕЧАНИЕ Мы еще никогда не сталкивались с классом UIWindow. Он создается автоматически и обеспечивает отображение UI ваших приложений. Мобильные программы обычно имеют только один экземпляр класса UIWindow, так как одновременно отображают только одно окно (исключением является подключение внешнего дисплея), в отличие от программ настольных компьютеров, которые могут отображать несколько окон одной программы в один момент времени.

39.3. Паттерн Delegation. Класс UIApplicationDelegate

Паттерн Delegation (делегирование) является еще одним очень важным для iOS-разработчика паттерном. И знание о нем понадобится вам при создании приложений в Xcode. Его суть состоит в том, чтобы один класс делегировал (передавал) ответственность за выполнение некоторых функций другому классу. Со стороны это выглядит так, словно главный класс самостоятельно выполняет все возложенные на него функции (даже делегированные другому классу). Фреймворк Cocoa Touch очень активно использует делегаты в своей работе, чтобы одни объекты выполняли часть своих функций от лица других.

Ярким примером использования паттерна делегирования является уже знакомый нам класс UIApplication. Напомню, что каждое приложение имеет один-единственный экземпляр этого класса-синглтона. Во время работы приложения UIApplication вызывает некоторые специфические методы своих делегатов, если, конечно, делегаты существуют и реализуют в себе эти методы.

Откройте в Xcode ранее разработанный нами проект MyName. Мы рассмотрели еще не все ресурсы, доступные разработчику в Project Navigator. Одним из них является AppDelegate.swift. Откройте его в редакторе проекта и взгляните на строку инициализации класса AppDelegate (листинг 39.1).

Листинг 39.1

class AppDelegate: UIResponder, UIApplicationDelegate {

  //...

}

AppDelegate является делегатом для UIApplication, об этом говорит протокол UIApplicationDelegate, который принимает данный класс. Во время выполнения программы экземпляр класса UIApplication в определенные моменты вызывает методы, описанные в AppDelegate.

Назад: 38. Разработка приложения под iOS
Дальше: Заключение