5

我正在使用 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,但非常有经验的编码人员将使用它,并且需要快速“获取”它。

我的计划是否有漏洞或效率太低?

是否有更易读的方式来创建和管理应用程序变量?

4

3 回答 3

5

为什么不立即将定义移到 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>
于 2011-11-28T20:42:35.803 回答
1

我会继续使用 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 时,这种方法虽然是我们使用的东西

于 2011-11-28T21:25:46.163 回答
1

实际上,在重新阅读 OP 并阅读建议的解决方案之后,我将不得不同意 OP 关于他的设置,因为这个非常重要的原因:

这个,在 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');

当然,这也被倒入 REQUEST (如果你选择)

想走上面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>

您还可以在 Application.cfc 中将 vars 的设置和对象的创建设置为私有方法,以更加方便。

于 2011-11-29T07:18:58.120 回答