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

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

Ответы

Ответ 1

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

Хорошо.

Ответ 4

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

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