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

StackOverflow https://stackoverflow.com/questions/25672

  •  09-06-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top