【问题标题】:Defining a custom data type?定义自定义数据类型?
【发布时间】:2018-01-30 16:24:15
【问题描述】:

我知道,通过在线阅读,当你打字时

function foo(required integer ObjectID)

CFML 引擎(对我来说是 Lucee)查找 integer.cfc,因为 CFC 不支持整数作为数据类型(奇怪)。

integer.cfc 应该是什么样子才能让 CF 将其视为有效数据类型。它是否必须在某个特定的位置,或者它可以在映射的文件夹之一中?

我进行了一些调查尝试,但并没有通过反复试验获得任何洞察力。

用例是,与大多数数据类型检查一样,我知道预期的数据类型,但它是防止客户端篡改的额外防线,而不必更详细地使用 paramif检查。

另外,如果有人这样做了,你能说一下性能差异吗?

我知道我可以按如下方式执行此操作,但这似乎应该是一个不必要的层。

function foo(required numeric myID)
  param name="arguments.myID" type="integer";

  ..use the parameter in queries..

为清楚起见进行编辑:目前,以下通过,但理想情况下我想说required integer myID,因此它会失败。

<cfscript>
  function TestNum(required numeric myID) {
    return myID;
  }
  writeoutput(TestNum(8.3));
</cfscript>

【问题讨论】:

  • 您必须将integer.cfc 放在您正在实施foo 的文件旁边。请记住,您必须实现整数可以执行的每个函数。我不会走这条路的。只需在需要时投射到int()

标签: coldfusion cfml cfc lucee


【解决方案1】:

Numeric 在 CFML 中与 CFML 得到的整数一样接近

虽然您可以(并且应该)将自定义数据类型定义为类,就像任何 OO 语言一样,但您可能不应该为特定类型的数字等简单数据类型这样做。

ColdFusion 中的类型是一个灰色区域。这是一个字符串。它是一个整数。它可以是一个布尔值。有一些简单的类型你不能乱用,但会直接输出到屏幕/页面/缓冲区/任何东西,还有一些复杂的类型,如数组、结构和查询,以及你可以用@987654323 可视化的 CFC 类型@和writeDump

如果您需要知道传入的数据类型是否为整数,您可能应该想出一个不同的方法。

不要声明自己的整数数据类型。尤其是在 ColdFusion 中。请记住,这是一种非常高级的语言,很多时候从硬件层中移除。通常,出于性能原因,类型检查在生产中被关闭。这是因为 ColdFusion 中的类型检查主要用作编程工具,而不是用户验证工具。一切都是为了仪式。

如果您希望验证用户输入,有更好的方法。我没有数量感;你要写多少?您将如何将消息返回给用户?想得大一点,但不要大到重新定义数学概念。

如果您的表单提交(或 REST API?无论输入什么...)为该类型填充了一个 cfc —— 不是单个字段,而是字段的集合,该怎么办。假设您正在编辑一个用户,创建一个包含所有属性的 User 类。

知道类型检查并不能真正做你想做的事,你可以让所有东西都是字符串(或any),但你可以用它们的验证类型装饰你的类的属性。

component name="User" {
  // notice that "validateType" is custom metadata, use anything you want
  property name="ID" type="string" validateType="integer";
  property name="Name" type="string" validateType="Name";
}

然后创建一个验证器来读取组件的元数据并以您想要的任何自定义方式进行验证。它可能就像这个未经测试的一样简单:

function validate(component obj) {
    var md = getMetaData(obj);
    for (var prop in md.properties) {
        if (structKeyExists(prop, "validateType") {
            switch (prop.validateType) {
                case "integer":
                isValid("integer", evaluate("obj.get#prop.name#()"));
                break;
                // other custom validation types
            }
        }
    }
}

然后将该验证器放在可重用的位置,例如验证类,或放在您自己的 cfc 的超类型中,以便它可以验证自己。

这只是一个想法。有很多方法可以给猫剥皮和验证字段。另一个不错的选择是尝试ValidateThis framework,它将为您设置一个已经为您编写的良好模式和代码。

【讨论】:

  • 有很多要读的,我会读,但整数是整数。 Numeric 不是整数。 param 加法会强制它为整数,但会引发不同类型的异常。稍后我将使用快速脚本编辑我的问题,以便自己测试。
  • “如果您使用这些常用术语作为数据类型,您也可能会遇到问题,因为它们可能是保留字” 在我的测试中,我试图创建一个 @987654330 @ 数据类型正是出于这个原因,并且兼容性应该 CFC 曾经获得 integer 类型和 cfc 导致冲突。 // 目前在我的应用程序中,我会将几乎所有出现的数字(货币值除外)都更改为整数。
  • create a whole data type 我不认为你可以......至少不是你描述的方式。 cfc 的问题是它只能让你走这么远......就像你说的,你真正需要的是一个 native 数据类型(原生转换和验证)和 afaik,这是不受支持的。
猜你喜欢
  • 2011-06-17
  • 2012-12-14
  • 1970-01-01
  • 1970-01-01
  • 2012-04-21
  • 2011-12-20
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多