ColdFusion - Когда использовать объем “запроса”?

Я должен был сделать это некоторое время назад и использовал приведенный ниже код. Он подключается к оболочке. Боюсь, у меня больше нет полного скрипта. Если вы работаете в операционной системе unixish, вы можете использовать «tac», но, например, Команда Mac OSX tac не работает, используйте tail -r. Ниже приведен фрагмент кода, для которого вы находитесь, и соответственно корректирует команду

# We need a command to reverse the line order of the file. On Linux this
# is 'tac', on OSX it is 'tail -r'
# 'tac' is not supported on osx, 'tail -r' is not supported on linux.

if sys.platform == "darwin":
    command += "|tail -r"
elif sys.platform == "linux2":
    command += "|tac"
else:
    raise EnvironmentError('Platform %s not supported' % sys.platform)
14
задан Jeromy French 8 March 2013 в 14:47
поделиться

3 ответа

Существует несколько объемов, которые доступны любой части Вашего кода: Сессия, Клиент, Cookie, Приложение и Запрос. Некоторые нецелесообразны для использования определенными способами (т.е. использующий Запрос или Область действия приложения в Пользовательских Тегах или CFC's; это - связь , нарушает принципы инкапсуляции и считается плохой практикой), и у некоторых есть особое назначение: 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 включая все различные специальные доступные функции и каждая небольшая деталь о том, что и как использовать его, , я рекомендую, это сообщение на блоге .

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

20
ответ дан 1 December 2019 в 07:41
поделиться

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

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

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

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

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

15
ответ дан 1 December 2019 в 07:41
поделиться

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