ColdFusion - Когда использовать область «запроса»? - PullRequest
13 голосов
/ 25 августа 2008

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

Ответы [ 4 ]

19 голосов
/ 25 августа 2008

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

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

15 голосов
/ 26 августа 2008

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

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

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

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

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

0 голосов
/ 27 сентября 2011

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

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

0 голосов
/ 12 августа 2010

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

Хорошо.

...