ColdFusion - Когда использовать область «запроса»?

Перебираю код моего предшественника и часто вижу использование области «запрос». Как правильно использовать эту область?

25.08.2008 04:59:25
4 ОТВЕТА
РЕШЕНИЕ

Есть несколько областей, которые доступны для любой части вашего кода: Сеанс, Клиент, 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, включая все доступные специальные функции и каждую мелочь о том, что и как его использовать, я рекомендую этот пост в блоге Рэймонда Камдена .

Подводя итог, можно сказать, что область запроса доступна везде в вашем коде, но это не обязательно делает ее «правильной» для ее повсеместного использования. Скорее всего, ваш предшественник использовал его, чтобы нарушить инкапсуляцию, и это может быть громоздким для рефакторинга. Возможно, вам лучше оставить все как есть, но понимание того, какая область является лучшим инструментом для работы, определенно сделает ваш будущий код лучше.

20
11.11.2015 12:19:21

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

С этим отказом от ответственности давайте определим, что такое область запроса и где она будет полезна.

Область запроса - это абсолютная глобальная область в одном запросе страницы ColdFusion. Он не является общей областью, как области приложения, сервера, клиента и сеанса, поэтому блокировка не обязательна, чтобы сделать его поточно-ориентированным (если только вы не порождаете рабочие потоки из одного запроса, используя тег CFTHREAD CF8). Как глобальная область, это очень удобный способ сохранения переменных на любом уровне в стеке запроса без необходимости передавать их от родителя к вызывающей стороне. Это был очень распространенный способ сохранения переменных с помощью вложенных или рекурсивных пользовательских тегов в старых приложениях CF.

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

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

15
26.08.2008 07:04:13

Хорошо, я просто хотел прокомментировать ваш код. Пожалуйста, прости меня, если я выгляжу сумасшедшим. Но вы уже убедились, что 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>

Хорошо.

0
11.08.2010 22:16:18
Мандат лучших практик, который вы проверяете снова в цикле, чтобы избежать условий гонки
Vincent Buck 11.08.2010 22:20:38
«Лучшая практика» для установки переменных области приложения, так как CFMX6.0 должен использовать только CFLOCK, есть вероятность возникновения состояния гонки, которого нет в предложенном здесь коде. Если кто-то просто хочет установить простое значение в переменной области приложения, и весь процесс является атомарным (то есть: это один оператор, и нет места для условия гонки, как в этом примере), просто использование тега CFPARAM хорошо.
Adam Cameron 21.08.2011 16:34:32

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

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

0
27.09.2011 16:50:29