Как лучше всего создавать и хранить переменные приложения?
Я использую 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.