Перебираю код моего предшественника и часто вижу использование области «запрос». Как правильно использовать эту область?
Есть несколько областей, которые доступны для любой части вашего кода: Сеанс, Клиент, Cookie, Приложение и Запрос. Некоторые из них нежелательно использовать определенными способами (например, используя область «Запрос» или «Приложение» внутри ваших пользовательских тегов или CFC; это связывание , нарушает принципы инкапсуляции и считается плохой практикой), а некоторые преследуют специальные цели: cookie сохраняется на клиенте компьютер как физические файлы cookie, и переменные области действия сеанса зависят от пользователя и истекают после сеанса пользователя на веб-сайте.
Если переменная крайне маловероятна для изменения (является постоянной для всех намерений и целей) и может быть просто инициализирована при запуске приложения и никогда не записываться снова, обычно вы должны поместить ее в область приложения, поскольку она сохраняется между каждым пользователем и каждым сеансом. При правильной реализации написано один раз и прочитано N раз.
Правильная реализация переменных приложения в Application.cfm может выглядеть следующим образом:
<cfif not structKeyExists(application, "dsn")>
<cflock scope="application" type="exclusive" timeout="30">
<cfif not structKeyExists(application, "dsn")>
<cfset application.dsn = "MyDSN" />
<cfset foo = "bar" />
<cfset x = 5 />
</cfif>
</cflock>
</cfif>
Обратите внимание, что наличие переменной в области приложения проверяется до и после блокировки, поэтому, если два пользователя создают условия гонки при запуске приложения, только один из них завершит настройку переменных приложения.
Преимущество этого подхода заключается в том, что он не будет постоянно обновлять эти сохраненные переменные при каждом запросе, тратя время пользователя и циклы обработки на сервере. Компромисс в том, что он немного многословен и сложен.
Это было значительно упрощено с добавлением Application.cfc. Теперь вы можете указать, какие переменные создаются при запуске приложения, и вам не нужно беспокоиться о блокировке и проверке существования и всех этих забавных вещах:
<cfcomponent>
<cfset this.name = "myApplicationName" />
<cffunction name="onApplicationStart" returnType="boolean" output="false">
<cfset application.dsn = "MyDSN" />
<cfset foo = "bar" />
<cfset x = 5 />
<cfreturn true />
</cffunction>
</cfcomponent>
Для получения дополнительной информации о Application.cfc, включая все доступные специальные функции и каждую мелочь о том, что и как его использовать, я рекомендую этот пост в блоге Рэймонда Камдена .
Подводя итог, можно сказать, что область запроса доступна везде в вашем коде, но это не обязательно делает ее «правильной» для ее повсеместного использования. Скорее всего, ваш предшественник использовал его, чтобы нарушить инкапсуляцию, и это может быть громоздким для рефакторинга. Возможно, вам лучше оставить все как есть, но понимание того, какая область является лучшим инструментом для работы, определенно сделает ваш будущий код лучше.
Это очень субъективный вопрос, и некоторые даже утверждают, что в современных приложениях ColdFusion никогда не «уместно» использовать область запроса.
С этим отказом от ответственности давайте определим, что такое область запроса и где она будет полезна.
Область запроса - это абсолютная глобальная область в одном запросе страницы ColdFusion. Он не является общей областью, как области приложения, сервера, клиента и сеанса, поэтому блокировка не обязательна, чтобы сделать его поточно-ориентированным (если только вы не порождаете рабочие потоки из одного запроса, используя тег CFTHREAD CF8). Как глобальная область, это очень удобный способ сохранения переменных на любом уровне в стеке запроса без необходимости передавать их от родителя к вызывающей стороне. Это был очень распространенный способ сохранения переменных с помощью вложенных или рекурсивных пользовательских тегов в старых приложениях CF.
Обратите внимание, что хотя многие приложения используют эту область для хранения переменных уровня приложения (например, параметров конфигурации), большая (а иногда и тонкая) разница между областью запроса и областью приложения заключается в том, что значение одной и той же переменной области запроса может отличаются между отдельными запросами страницы.
Я предполагаю, что ваш предшественник использовал эту область в качестве средства для удобной установки переменных, которые необходимы для выживания при переходе между инкапсулированными или вложенными единицами кода без необходимости их явной передачи.
Хорошо, я просто хотел прокомментировать ваш код. Пожалуйста, прости меня, если я выгляжу сумасшедшим. Но вы уже убедились, что structKeyExists в начале. Поскольку вы знаете, что это будет правдой, не имеет смысла проводить еще одну проверку. Так что моя версия была бы такой ... Но это только я.
<cfif not structKeyExists(application, "dsn")>
<cflock scope="application" type="exclusive" timeout="30">
<cfset application.dsn = "MyDSN" />
<cfset foo = "bar" />
<cfset x = 5 />
</cflock>
</cfif>
Хорошо.
Я писал основы моей компании, которые будут использоваться для питания нашего сайта.
Я использую переменную запроса, чтобы установить определенные данные, которые будут доступны для других CFC. Я должен был сделать это, чтобы данные были доступны во всем приложении, без необходимости непрерывной передачи данных. Я искренне верю, что при использовании запроса и приложения, если он является статическим компонентом функции, у вас не должно возникнуть проблем. Я не уверен, ошибаюсь ли я в своих мыслях с этим, но как только я выпущу фреймворк, мы увидим.