Как лучше всего создавать и хранить переменные приложения? - PullRequest
5 голосов
/ 29 ноября 2011

Я использую ColdFusion 9.0.1

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

По сути, он имел это в Application.cfc:

APPLICTION.VariableOne = "SomeStringOne";
APPLICTION.VariableTwo = "SomeStringTwo";
APPLICTION.VariableThree = "SomeStringThree";

Мой план состоит в том, чтобы сделать его простым и в то же время очень читабельным, чтобы проверить конкретную структуру в области приложения. Если его там нет, создайте структуру и переменные:

if (not isDefined("APPLICTION.AppInfo") or not isStruct(APPLICTION.AppInfo)) {
    APPLICTION.AppInfo = structNew();
    APPLICTION.AppInfo.VariableOne = "SomeStringOne";
    APPLICTION.AppInfo.VariableTwo = "SomeStringTwo";
    APPLICTION.AppInfo.VariableThree = "SomeStringThree";
}

Конечно, как только сайт заработает и мы закончили создание всех переменных приложения, я перенесу это в метод onApplicationStart ().

Решение, которое я хочу, должно быть больше о «читабельности» и меньше о «эффективности». Несколько не-CFers, но очень опытных кодеров будут использовать это и должны будут быстро "получить это".

Есть ли в моем плане зияющие дыры или он слишком неэффективен?

Есть ли более читабельный способ создания и управления переменными приложения?

Ответы [ 3 ]

5 голосов
/ 29 ноября 2011

Почему бы не переместить определение в onApplicationStart () прямо сейчас? Если вам нужно сбросить их во время разработки, вы всегда можете передать переменную URL, чтобы пометить ее для сброса, например:

<!--- in Application.cfc --->

<cffunction name="onRequestStart">
<cfif IsDefined("url.resetApp")>
  <cfset ApplicationStop()>
  <cfabort><!--- or, if you like, <cflocation url="index.cfm"> --->
</cfif>
</cffunction>
1 голос
/ 29 ноября 2011

На самом деле, после перечитывания ОП и прочтения предложенных решений мне придется согласиться с ОП по его настройке по этой очень важной причине:

Это в onApplicationStart ()

APPLICTION.AppInfo = structNew();
APPLICTION.AppInfo.VariableOne = "SomeStringOne";
APPLICTION.AppInfo.VariableTwo = "SomeStringTwo";

Позже может быть превращен в это, в onRequestStart ()

<cflock name="tmp" type="readonly" timeout="15">
   <cfset REQUEST.AppInfo = APPLICATION.AppInfo />
</cflock>

Ваше приложение может затем перейти к доступным переменным REQUEST, особенно, если вы решите, что выхотите кэшировать ХФУ в той же области - они просто войдут в отдельный ключ:

   APPLICATION.Model.MyObject = CreateObject('component','myobject');

Который, разумеется, также добавляется в ЗАПРОС (если вы выберете)

Хотитеидти по маршруту Джейк Физель выше?Нет проблем:

   <cfif isDefined('URL.reload')>
      <cfset APPLICATION.Model = StructNew() />
   </cfif>

Теперь вы можете гибко уничтожать кеш объектов, но сохранять свои переменные (или наоборот, по вашему выбору).

Это отличная установка по другой причине.: Если вы хотите создать свой собственный «режим» разработки / производства, в котором режим разработки всегда перекомпилирует CFC, но режим производства сохраняет их в кэше.Единственное изменение, которое вам нужно сделать, это набор REQUEST, отмеченный выше:

<cfif (isProduction)>
    <cflock name="tmp" type="readonly" timeout="15">
       <cfset REQUEST.AppInfo = APPLICATION.AppInfo />
    </cflock>
<cfelse>
   <cfset REQUEST.AppInfo = StructNew() />
   <cfset REQUEST.AppInfo.VariableOne = "SomeStringOne" />
   ...etc...
</cfif>

Вы также можете выполнить настройку vars и создание объектов в закрытом методе в Application.cfc,для еще большего удобства.

1 голос
/ 29 ноября 2011

Я бы пошел дальше и просто использовал OnApplicationStart, но в те дни, которые были до Application.cfc, мы делали что-то вроде Application.Build, и если значение Build было другим, мы делали все наши наборы для переменных Application. Так быстро и грязно было бы что-то вроде:

<cfparam name="Application.Build" default="" />

<cfset Build = "28-Nov-2011" />

<cfif Application.Build IS NOT Variables.Build OR StructKeyExists(URL, "Rebuild")>
 <cfset Application.Build = Variables.Build />
 <!--- A bunch of other CFSETs --->
</cfif>

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

...