在ColdFusion件(氟氯化碳),是否有必要使用完全限定名称的变量范围的变数?

我要让自己陷入麻烦,如果我改变这个:

<cfcomponent>
    <cfset variables.foo = "a private instance variable">

    <cffunction name = "doSomething">
        <cfset var bar = "a function local variable">
        <cfreturn "I have #variables.foo# and #bar#.">
    </cffunction>
</cfcomponent>

要这个吗?

<cfcomponent>
    <cfset foo = "a private instance variable">

    <cffunction name = "doSomething">
        <cfset var bar = "a function local variable">
        <cfreturn "I have #foo# and #bar#.">
    </cffunction>
</cfcomponent>
有帮助吗?

解决方案

它不会的问题,要指定"变量"的时候,你创建的变量,因为foo将被放置在变量范围默认情况下;但它将此事,当你接入变量。

<cfcomponent>
    <cfset foo = "a private instance variable">

    <cffunction name="doSomething">
        <cfargument name="foo" required="yes"/>
        <cfset var bar = "a function local variable">
        <cfreturn "I have #foo# and #bar#.">
    </cffunction>

    <cffunction name="doAnotherThing">
        <cfargument name="foo" required="yes"/>
        <cfset var bar = "a function local variable">
        <cfreturn "I have #variables.foo# and #bar#.">
    </cffunction>

</cfcomponent>

或重写现有的("参数")返回"我有 args 和一个 功能局部变量"

doAnotherThing("参数")返回"我有 一个私人实例中的一个变量 和一个 功能局部变量."

其他提示

我会说是的。是它明确确有必要吗?不。你可以摆脱不这样做呢?肯定的。是你自找麻烦?绝对的。如果你有以下内cffunction:

<cfset foo = "bar" />

这不会变的功能的地方var范围,它将在氯氟化碳的全球变量范围,这意味着提供给每一个方法,CFC。有些时候你可能会想要这样做,但大多数时候你会可要求竞争条件。

当任何变量正在读通过的服务器,如果这个变量是不明确宣布为一部分的范围(请求。, 会议。, 等等)。 然后ColdFusion将运行ScopeCheck()来确定其范围的变量。不仅是这把不必要的开销应用程序服务器上,还介绍了能力劫持,从而变量是在一个范围,但ScopeCheck()已经发现了一个变量的相同名字更高的优先顺序。

总是,总是,总是,范围的所有变量。无论如何微不足道的。即使事情象的查询名字和循环的索引。保存自己及那些在你后面,从痛苦。

特别是在氟氯化碳,正确的界定范围是重要的。额外'的详细程度'是值得的清晰度。具有的变量溜出他们indended范围将引起严重问题和很难诊断。

详细程度并不总是一件坏事。我们的名字我们的功能和方法的描述性的方式喜欢getAuthenticatedUser(),而不是gau().数据库和列表的最好描述像EmployeePayroll而不是empprl.因此,正在简短的可能会被更容易'时你的短期记忆是完整的项目的细节,但是描述性的表示你的意图是有用的,在维持阶段的应用程序,经过长期短期的记忆已经填充有其他的东西。

简短的回答你的问题是,不,你可能不会遇到麻烦试图做到这一点。上下文之外的一位(甚至还在里面一个氟氯化碳)、联合国范围内设定的声明意味着变量范围。

此外,在一个氟氯化碳,该变量范围是提供给它的所有职能;它是一种全球范围内,氟氯化碳--的类似"这"范围,除非变量范围类似于"私人"变量,而这个范围类似于公共变量。

来测试这个,建立测试。氟氯化碳:

<cfcomponent>
    <cfset foo = "bar" />
    <cffunction name="dumpit" output="true">
        <cfdump var="#variables#" label="cfc variables scope">
        <cfdump var="#this#" label="cfc this scope">
    </cffunction>
</cfcomponent>

和一个网页,以测试,测试。cfm:

<cfset createObject("component", "test").dumpit() />

结果将是:


现在,以解决的另一个问题,我看到在你的代码...

在CF,所有用户自定义功能,有一个特殊的联合国命名的范围通常被称为"var"的范围。如果你这样做以下内UDF:

<cfset foo = "bar" />

然后你告诉CF把这变成var范围。

化合物的事情一点,可能会遇到的问题(变量值的改变时,你不希望他们到),当你 使用var范围在你的内联Udf。

这样的经验法则是,总是,总是,总是, 总是 var-范围您的功能的内部变量(包括查询名)。有一个工具,称为 varScoper 这将有助于你在找的变量,需要var范围。上次我检查它是不完美的,但它肯定是一个开始。

然而,它是一个 糟糕 想法参照(显示使用)的变量没有一个范围(显然除了var范围的变量,因为你不能指定范围以从中读取)在氟氯化碳或甚至在你的标准CFM页。为CF7,有9个范围,进行检查,在一个特定的顺序,当你读一个变量,而不指定的范围,第一场比赛的胜利。与CF8,可能有更多的范围在该列表中,我还没有检查。当你做这个,你冒的风险的一个值从一个范围的时候你期待它从另一个;这是一场噩梦调试...我向你保证。;)

因此,在短期: 这意味着 一个可变的范围内(集)不是一个可怕的想法(虽然我通常指定它无论如何);但 推断 变量的范围(阅读)是自找麻烦。

没有明确界定的变量范围可以工作,但它不是一个好主意,并且诚实的唯一原因 要是出于懒惰国际海事组织。如果你明确范围的一切1)避免潜在的问题,和2)它使代码的更易于阅读,因为毫无疑问,其范围内的事情。

我不会让的代码的更多详细的(而且肯定不会不必要的冗长的)--其实更易于阅读,可以避免混淆,并避免了奇怪的负面影响,可能会突然出现如果你不明确的范围。

简单的回答你的问题是:"不,这不是必要的"

然而,我认为最好的做法会建议你这样做,事实上,使用的变量标识符的时候访问这些变量。在我看来谁来当你的代码在未来,并寻求在中间的一个功能,将立即知道确定范围的变量,而无需扫描顶部的功能本地的功能。

事实上,我添加一点额外的详细程度给我的氟氯化碳Udf通过创建一个地方结构:

<cfset var="" local="structNew()" />

然后我把我所有当地增值在于结构和准它们这样所以我的代码会看起来像这样的东西:

<cfset local.foo="variables.bar" +="" 10="" />

后读取你的答案,这就是我想:

是的,它是安全的。在一般情况下,这是不必要的或有用的明确指定的变量范围。它只是增加了混乱,已经详细的语言。

授予的,还有一个小小的例外,因为 Soldarnal 所指出的,其中符合资格的一个变量范围的变是必需的。这就是如果你有一个功能的局部变量相同的名称。(但你也许不应该那样做。)

最佳做法放在一边,我认为它也可能取决于如何你要去访问你的氟氯化碳的我已经没有任何问题而使他们出来的时候建立的对象,并访问他们从coldfusion.但是我觉得它可能是需要时访问和/或映他们的远程通过actionscript在flex/闪光。

这是一个非常好的 氟氯化碳的范围参考 从雷蒙德卡登.就个人而言,我宁愿做一个'自我'哈希避免混淆(通知我,不要使用的'变量范围的职能):

<cfcomponent>
  <cfset variables.self = structNew()>
  <cfscript>
    structInsert(variables.self, <key>, <value>);
    ...
  </cfscript>

  <cffunction name="foo">
    self.<key> = <value>
    <cfreturn self.<key> />
  </cffunction>

  ...
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top