【问题标题】:ColdFusion non-scoped vs. VARIABLES scope: performance vs. readability?ColdFusion 非范围与变量范围:性能与可读性?
【发布时间】:2014-11-22 11:24:56
【问题描述】:

在我的 ColdFusion 代码中,我养成了一种习惯,即始终将变量范围视为我的默认范围(即,当另一个范围不适合时)。我的理解是,这提高了效率,因为 ColdFusion 处理器不必花费周期来确定包含变量的范围。但是,我一直对这使我的代码变得如此冗长感到恼火。

所以,我的问题是,实际上,是否明确界定每个变量的范围值得冗长?我知道每个应用程序都有不同的“价值”定义,但我只是想从更有经验的开发人员那里得到一些意见。你总是在每个变量的范围内吗?仅用于生产代码?您是否发现具有显式范围变量的代码更具可读性,并且增加的可读性胜过“更漂亮”(因为没有更好的词)代码?提前感谢您的任何回复。

【问题讨论】:

  • 我倾向于定义除变量范围之外的所有内容。话虽如此,我有时也会发现似乎有必要对其范围进行界定。

标签: variables coldfusion scope


【解决方案1】:

在确定范围时,需要考虑两件事:

  1. 可读性
  2. 出血与性能

出于这两个原因,我(通常)建议您在 CFC 类内外设置所有范围。如果你这样做,你永远不会对结果感到惊讶。但是,这是两种不同的情况:

在 CFC 内部:

总是作用域Variables,因为它是在类的方法和主体之间共享的“受保护”作用域。并且仅在您非常确定要使用它时才使用它。您可以将它用作实例化类的属性成员,但如果您在单例类中使用它(缓存到Application 范围),请务必小心。这可能会导致意外出血。此外,如果有任何同名的外部变量,您可能会再次无意中将它们从空中抓取。不是你想要的。此外,在 CFC 中不限定 Variables 范围会令人困惑,因为还有不带范围前缀的本地 var 范围值。如果您在此处使用它,请在此处查看Variables

在 CFC 之外:

只要清楚,恕我直言,您可以不在 CFM 页面/包含中限定 Variables。实际上应该没有性能损失,因为 CF 将首先检查此范围(在 CFC 之外)。我的一般偏好是在我设置/声明它时首先确定范围,然后,如果它清晰且在视觉上下文中,则将其保留为无范围。如果页面很长,或者我将页面(例如长报告)分成块(包含),我将确保再次添加前缀,以便清楚它的来源。如果我始终确定所有其他范围的范围(我推荐),应该明确 unscoped 是 Variables,但我希望它明确。特别是如果其他人也在编写代码库。因此,如果不清楚,请确定范围。良好的经验法则。

搜索顺序:

最后,我讨厌人们谈论搜索顺序,然后将 CFC 和页面范围混为一谈。请记住,它们是不同的,CF 没有很好或清楚地记录这些(LocalVar 在最后获胜的情况下“相等”,Arguments 将在 CFC 中的 Local 之前找到,当未声明或超载时, VariablesProperty 也混合在一起)。在页面(CFM 模板/包含)中,Variables 范围是默认值并首先被搜索。一个例外是查询块上下文中的查询范围。再一次,没有很好的文档记录,在 CF 中,我们并不总是像某些语言那样考虑块作用域,但实际上就是这种情况。在查询上下文之外,期望Variables 胜出。如果您不确定某个案例,请确定范围或对其进行测试。另请记住,当 CF 遇到无前缀变量时,不会搜索 thisRequestApplicationSession 范围。

【讨论】:

    【解决方案2】:

    答案的客观部分(因此人们不会因为“过于主观”而投票结束它)是始终确定范围变量可以带来性能提升。也就是说,我听说过一些 - 轶事 - 建议在 ColdFusion(与 Railo 相对)上,不限定变量范围的变量实际上更快。

    但在现实世界中:差异是无关紧要的。

    我宁愿保持代码更简洁和更易于阅读,为此我只在必要时说范围变量-范围变量。

    注意:我总是限定表单、URL 等变量,即使 CF 会在没有范围的情况下“找到”它们。不限定这些范围似乎很麻烦(再次,主观的,在这种情况下只有 IMO)。

    【讨论】:

    • 在我公司的编码标准文档中,所有变量都必须限定范围。如果不是,我们将拒绝代码审查。
    • 是的,我们的编码标准也有很多内容 ;-)
    【解决方案3】:

    我参与过许多 CFML 项目,并且我看到开发人员将所有内容都定义为范围,有些则根本没有范围(不要这样做!),还有一些人将除变量范围之外的所有内容都定义为范围。虽然作用域很重要,但我认为在变量作用域中定义变量的作用域是多余的,会使代码膨胀,并且对您的应用程序几乎没有性能提升。

    我会说除了变量范围之外的所有内容。这将使您的代码库更易于阅读。专注于应用程序的其他领域,例如良好的缓存技术、数据库索引和查询优化、将 HTML / CSS / JS 资源最小化到浏览器等,这些都会对应用程序的性能产生显着影响。

    【讨论】:

      【解决方案4】:

      我更喜欢定义所有内容的范围,但我确实发现变量范围很烦人(一个字母的范围名称会很好,比如 v。是的,我知道这听起来很傻。)我倾向于认为范围设置有助于提高可读性。

      我(离开页面一段时间后)或其他开发人员查看我的代码,只需要查看#form[...]# 即可知道页面的该部分依赖于#form# 变量。在有 [url 和/或 form] 和查询列具有相同名称(如 url.userID、form.userID、getUserInfo.userID)的情况下特别方便。

      此外,自然地,冷聚变对于查找非作用域变量的方式具有优先顺序。

      1. 函数局部(VAR 关键字)
      2. 线程本地 (CFTHREAD)
      3. 查询结果
      4. 函数参数
      5. 局部变量
      6. CGI 变量
      7. 文件变量
      8. 网址参数
      9. 表单字段
      10. COOKIE 值
      11. 客户变量

        来源: In ColdFusion, variables are resolved in what order?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-14
        • 2013-01-27
        • 1970-01-01
        • 2014-04-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多