Стоп! Стоп! Стоп! НЕПРАВИЛЬНЫЙ. ПЛОХОЙ.

Сложность: Начинающий | Легко | Нормальный | Испытывающий

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

Локальные переменные - это переменные, которые определены в функции, методе или закрытии.

Так почему же существуют глобальные переменные, когда люди в Интернете говорят, что их никогда не следует использовать ????

Нам нужно подумать об альтернативах, которые они рекомендуют (если они вообще есть), и сделать лучший выбор для нашей собственной ситуации.

Эта статья о том, как сделать правильный выбор в нужное время ...

Предпосылки:

  • Кодирование в Swift Playgrounds (руководство ЗДЕСЬ) или создание приложения с одним представлением в Xcode (руководство ЗДЕСЬ)

Пример

В вашем приложении есть переменная счетчика (возможно, в вашем AppDelegate), которую затем можно обновить из любого места в вашем приложении (возможно, когда пользователь нажимает кнопку).

Когда пользователь обновляет counter с menuviewcontroller, переходит к detailviewcontroller, а затем обновляет counter, counter будет читать 2.

Аргументы в пользу: Globals - это быстрый и простой в использовании метод

Я хотел бы представить пример использования глобальных функций и переменных. Я выберу несколько причин их использования и объясню это ниже:

Делайте небольшие программы проще!

Когда мы создаем небольшие демонстрационные программы, мы можем захотеть написать код и как можно быстрее выпустить решение в мир. Мы не хотим увязать в спорах об архитектуре, мы просто хотим заставить код двигаться и заставить его работать!

Что-то доступно везде

Возможно, вы захотите настроить константу с URL-адресом, и это доступно во многих частях программы. Это не меняется, так что в этом вред?

Обертывание глобалов как синглтонов - не лучший вариант

Если вы тратите время и силы на то, чтобы обернуть глобал как синглтон ... в чем смысл. Использование другого инструмента и называть его чем-то другим, чтобы скрыть плохой дизайн приложения, никому не помогает. Если вы используете глобальный, используйте глобальный и гордитесь тем, что вы сделали!

Глобалы могут экономить нажатия клавиш

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

Проблема мысли

Чтобы не думать о том, куда должны идти данные, вы можете просто использовать глобальный. Никаких мыслей не требуется. Работа сделана. Просто!

Аргументы против: глобалы злы

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

Безопасность потоков

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

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

Сцепление и испытания

Поскольку у нас есть просто простая переменная (как предлагается в App Delegate), трудно утверждать, что она тесно связана с чем-либо (хотя глобальные переменные и функции часто бывают такими).

Однако проверить счетчик сложно, поскольку он используется всеми видами функций в приложении и может быть изменен в нескольких местах. Поскольку это правда, как мы можем исключить побочные эффекты всех функций, использующих счетчик?

Мы всегда должны (где это возможно) использовать независимую архитектуру, которая позволяет нам адекватно тестировать наше приложение и функции. Можно сказать, что это невозможно в случае глобальных переменных.

Даже для небольших программ стоит делать все правильно

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

Если нужно писать код, стоит писать правильно!

Альтернативы

Передача данных по контроллерам представления

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

Однако есть проблема, и эта проблема заключается в том, правильно ли мы используем модели в нашей архитектуре, если мы просто передаем переменные от контроллера представления к контроллеру представления. Это, конечно, неясно, хотя многие разработчики будут использовать массивный контроллер представления (простите, MVC), что означает, что этот их подход может быть… возможно, не лучшим. В любом случае, у вас есть такие опции, как MVVM, которые могут дать вам гибкость здесь.

Вариант синглтона

По сути, класс обернут вокруг глобальной переменной и известен как шаблон проектирования.

Это антипаттерн? Вы решаете, но есть руководство по Singletons ЗДЕСЬ, которое дает вам представление о том, как это может работать.

Формат синглтонов в Swift следующий:

Class SingletonClass {
    static let sharedInstance = SingletonClass
    private init() {}
}

Заключение

Остановитесь и подумайте о том, что вы делаете. Следует ли вам действительно использовать глобальную переменную для вашего конкретного использования? Вы единственный, кто может решить - при программировании нужно учитывать текущий контекст и производить программное обеспечение в меру своих возможностей. Другими словами, выбор за вами.

Контактное лицо в Twitter:

Любые вопросы? Вы можете связаться со мной ЗДЕСЬ