Как лучше всего создавать и хранить переменные приложения?

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

Я беру на себя управление сайтом, а парень до меня создал около 100 переменных и поместил их в область ПРИМЕНЕНИЯ. Я считаю, что его 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 ответа

Решение

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

Это в 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, особенно, если вы решите, что хотите кэшировать CFC в той же области - они просто перейдут в отдельный ключ:

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

Который, конечно же, также попадает в запрос (если вы выберете)

Хотите пройти Jake Feasel выше? Нет проблем:

   <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 для еще большего удобства.

Почему бы не переместить определение в 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>

Я хотел бы пойти дальше и просто использовать 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.

Другие вопросы по тегам