【问题标题】:Is it a good practice to use variables scope for defining constants in Coldfusion?在 Coldfusion 中使用变量范围定义常量是一种好习惯吗?
【发布时间】:2021-03-07 21:24:25
【问题描述】:

在我们的 Adob​​e Coldfusion 项目中,我们有一些组件用作单例,例如这个:

component name="Util" {
    public function init() {
        variables.settings = loadFromConig();
        variables.prefix = "my_";
        return this;
    }

    public string function getPrefix() {
        return variables.prefix;
    }

    public struct function getSettings() {
        return variables.settings;
    }
}

这应该正常工作,因为必须始终首先执行 init() 函数才能调用任何其他方法。 我担心的是:如果 loadFromConig() 函数花费的时间太长并且某些 getter 方法抛出未定义的变量异常,是否有任何风险不会按预期发生(例如在压力测试条件下)?

一般来说,在构造函数(方法 A)中使用变量范围定义一些“常量”是一种好习惯,还是使用 properties 更好使用默认值代替(方法 B)或者直接在 getter 中硬编码“常量”是否更安全:

public string function getPrefix() {
   return "my_";
}

(方法C)?

我们使用方法 A - 在这些行周围放置一个 cflock 是否是个好主意:

  variables.settings = loadFromConig();
  variables.prefix = "my_";

在构造函数中还是这样的锁没用?

【问题讨论】:

  • 根据我使用 VARIABLE 范围的经验,没问题,但我会将其移到 init() 方法之外,因为我知道 ColdFusion 中没有任何东西会固有地调用您的 init()创建组件时的方法。也就是说,如果您希望从组件外部直接访问它们,您可能会考虑将它们移动到 THIS 范围内。我认为不需要
  • 构造函数(init 函数)总是被隐式调用,例如 调用 service.MyService 中的 init() 至少在 Adob​​e Coldfusion 上是这样2018. 你的情况不也是这样吗?您使用的是 Adob​​e CF 还是 Lucee?
  • Milena 你能链接到 Adob​​e 文档,说明在创建组件时会隐式调用 init() 方法吗?我知道大多数语言都是如此,但我不知道这是 ColdFusion 的一项功能。
  • 这是一个来自 Adob​​e 的示例,展示了如何在不显式编写的情况下调用 init() 函数 - 感谢关键字“new”:helpx.adobe.com/coldfusion/developing-applications/… 使用“new”调用:bunny = new Animal( '小','兔子');这会调用“Animal”组件的构造函数。

标签: constructor constants singleton adobe coldfusion-2018


【解决方案1】:

在重新思考这个问题后,我得出结论,最好将 final 变量用作常量,因为一旦初始化 final 变量,就无法更改它的值。

component{
    final prefix = "my_";         
    function checkPrefix(){
        writeoutput("prefix: " & prefix);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-21
    • 2014-12-23
    • 1970-01-01
    • 2019-12-11
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多