Я читал, что глобальные переменные являются плохими. Но как насчет глобальных функций? Скажем, я добавляю к моему проекту приложения iPhone файл с именем Globals.swift
, содержащий func foo() { print("foo") }
. Разве это не так плохо, потому что это может противоречить другим глобальным функциям с тем же именем? & подпись? По тому же аргументу, не так ли плохо использовать расширения для добавления новых методов к существующим типам?Swift: Являются ли глобальные функции плохой практикой?
ответ
Глобальные функции глобальны в лексическая область, но не в видимость. На самом деле вам не нужно беспокоиться о конфликтах. Глобальная лексическая область означает, что они не являются членами типа (класс, структура, протокол или перечисление) и не являются специфичными для локально локализованного кода, такого как тело другой функции.
Но это не то же самое, что глобальная видимость, несколькими способами.
Если вы определяете верхний уровень (aka global) func foo()
в модуле (приложении или фреймворке) с именем MyTarget
, то полная подпись для этой функции равна MyTarget.foo()
. Даже если бы стандартная библиотека Swift объявила глобальный func foo()
, ваш не обязательно конфликтует. (Тем не менее, любые сайты вызовов станут двусмысленными, поэтому вам нужно будет использовать имя модуля, чтобы отличать MyTarget.foo()
и Swift.foo()
.)
Если ваш код находится в модуле, который будет использоваться другим кодом (например, совместно используемый общий между приложением iOS и целями расширения), ваш func foo()
декларация - internal
. Таким образом, другой код, импортирующий ваш модуль, может объявить свой собственный func foo()
и называть его только foo()
, независимо от того, существует ли ваша функция. Это влияет только на модули, импортирующие ваши, если объявлено как public func foo()
. (И даже тогда вызывающие абоненты могут disambiguate использовать имя модуля, как указано выше.) Кроме того, вы можете объявить свою функцию как private
в файл Swift, в котором он определен, и в этом случае он глобальный в лексической области, но ограниченный только для использования другим кодом в этом файле.
Расширения типа следуют тем же соображениям - ваши расширения по умолчанию internal
к модулю, который их создает, и в его пространстве имен, поэтому существует небольшой риск конфликта.
Что касается ли это хороший дизайн программы, чтобы использовать свободные функции вместо типов с методами, это горячо обсуждается вопрос мнения ...
- 1. Являются ли фреймы «плохой практикой»?
- 2. Являются ли промежуточные файлы плохой практикой?
- 3. Являются ли DefType статутами плохой практикой?
- 4. Являются ли анонимные функции плохой практикой в JavaScript?
- 5. Почему глобальные переменные считаются плохой практикой?
- 6. Почему глобальные переменные считаются плохой практикой? (node.js)
- 7. Связаны ли функции jQuery с плохой практикой?
- 8. Являются ли команды с несколькими столами DELETE плохой практикой? Зачем?
- 9. Являются ли обратные вызовы для запросов плохой практикой в node.js?
- 10. Являются ли аннотации настойчивости в объектах домена плохой практикой?
- 11. Являются ли вложенные спички плохой практикой в идиоматической ржавчине?
- 12. Являются ли одинарные заявления или заявления без привязок плохой практикой?
- 13. Является ли ActiveRecord плохой практикой?
- 14. Является ли это плохой практикой?
- 15. Является ли CORS плохой практикой?
- 16. Вызов функции, подобной этой, считается плохой практикой?
- 17. Включить внутри функции считается плохой практикой?
- 18. Является ли дескриптор заголовка typedef плохой практикой?
- 19. Является ли typedef внутри тела функции плохой практикой программирования?
- 20. Является ли использование Javascript внутри функции jQuery плохой практикой?
- 21. Является ли [var = modify (var)] плохой практикой?
- 22. Является ли несколько HttpAsyncClient считаться плохой практикой?
- 23. Является ли это плохой практикой базы данных?
- 24. Является ли это плохой практикой MVVM?
- 25. Является ли такой метод bool плохой практикой?
- 26. Используется ли буферизация вывода, считающаяся плохой практикой?
- 27. Является ли это плохой практикой кодирования?
- 28. Считается ли плохой практикой использование абсолютного позиционирования?
- 29. Является ли циклическая ссылка плохой практикой?
- 30. Сохраняет ли транзакция открытой считающуюся плохой практикой?
Похоже Swift вызывает внутреннюю функцию, если не указан модуль. Чтобы проверить это, в моем проекте приложения iPhone я определил глобальную функцию 'func print (text: String) {Swift.print (text +" * ")}' и назвал 'print (" test ")' при запуске приложения. Я не уверен, что произойдет, если вместо этого я включу тридцатипартийную структуру, которая определяет глобальную функцию 'print'. – ma11hew28