Сведения о вопросе

SOON

04:22, 26th August, 2020

Теги

coldfusion   railo   cfml    

ColdFusion-когда использовать область "request"?

Просмотров: 527   Ответов: 4

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



  Сведения об ответе

FAriza

02:40, 5th August, 2020

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

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


  Сведения об ответе

VERSUION

18:06, 9th August, 2020

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

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

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

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

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


  Сведения об ответе

fo_I_K

17:23, 17th August, 2020

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

Хорошо.


  Сведения об ответе

SEEYOU

20:33, 28th August, 2020

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться