Coldfusion 处理可选参数:CFArgument与isDefined

Coldfusion 处理可选参数:CFArgument与isDefined,coldfusion,parameter-passing,cffunction,Coldfusion,Parameter Passing,Cffunction,我有一个关于cfargument的问题。如果我在调用.cfc时发送参数,那么首先将其定义为参数有什么好处吗 <cffunction name="someFunction" ....> <cfargument name="myArg" required="no"> 或者我可以在函数内部使用IsDefined(),而不定义参数吗 <cffunction name="someFunction" ....> ... <cfif isDe

我有一个关于
cfargument
的问题。如果我在调用
.cfc
时发送参数,那么首先将其定义为参数有什么好处吗

<cffunction name="someFunction" ....>
    <cfargument name="myArg" required="no">

或者我可以在函数内部使用IsDefined(),而不定义参数吗

<cffunction name="someFunction" ....>
   ...
   <cfif isDefined("arguments.myArg")>
      do something
   </cfif>

...
做点什么

我试过了,知道它们都管用。但是,定义参数和使用isDefined()有什么区别?这会影响效率吗

这不是关于效率,而是关于文档。这是我公司的编码标准文档中关于
cfargument
的一个例外

在ColdFusion函数中使用CFARGUMENT标记时,需要以下属性:

  • 名字
  • 类型
  • 必需的
  • 暗示
ColdFusion不要求您使用
cfargument
标记,但它们提供验证(类型安全)并充当附加文档,因此始终为函数期望的每个命名参数提供
cfargument
标记

规则:

  • 参数的名称不必以数据类型作为前缀(避免匈牙利符号)
  • 始终在cfargument标记中指定
    type
    属性。尽量避免使用
    type=“any”
  • 如果需要参数,请指定
    required=“true”
    ,但不要指定
    默认属性值
  • 如果参数不是必需的,请指定
    required=“false”
    并指定
    默认值
    属性值
  • 如果需要检测是否提供了非必需的参数,请不要指定
    default
    ,而是在函数体中使用
    structKeyExists(参数,“ARGNAME”)
    (请记住,当您指定
    default
    时,您无法区分忽略该参数的调用方与提供与参数相同的默认值的调用方之间的区别)
  • 引用作为参数传递到函数中的变量时,始终引用参数范围。(不要引用
    foo
    ,引用
    arguments.foo
  • 不要操纵传递到函数中的参数值。CF通过引用传递一些变量数据类型,并且在函数中执行的任何操作都会在调用该变量的级别上更改该变量的值。使用duplicate()将arguments结构复制到函数局部变量为避免冲突,请根据需要操作函数局部变量
  • 不要向最初未传递到函数的arguments结构添加键。添加新键可能会使调试变得非常困难。相反,请使用duplicate将arguments结构复制到新函数局部变量以避免冲突,并向该结构添加新键

  • HTH

    @KevinB的评论是找到答案的途径。@DanBracuk*gong“ohmmmmmm”@espresso_coffee-IMO,它应该包含在cfarguments中。函数签名是一个合同,告诉消费者它需要和/或接受什么类型的信息。如果使用isDefined,调用方不知道要提供什么类型的值,这是不好的形式。请注意,使用structKeyExists而不是isDefined。前者更精确se.@espresso_coffee-KevinB指的是my。希望它能更好地反映您真正的要求。如果不是,请随意更改它。
    structKeyExists(参数“myArg”)
    应始终在函数中工作。如果您遇到涉及URL作用域的错误,则说明您做得不对。我不能确切地告诉您,因为我看不到您的代码…我始终使用
    cfargument
    定义任何可能的参数。这有助于下一个开发人员了解他们在函数中可以期望什么。另一个b好处是,如果在
    cfargument
    中定义type属性,则如果传入参数,它将在该类型上进行验证(例如,对于数值,
    type=“numeric”
    )。这将是对SO的coldfusion文档页面的一个很好的补充:不要评判您公司的指导原则,但规则#7可能会导致大量数据的开销。您应该考虑提供的参数实际用于什么。通过引用传递内容没有错(具有非确定性函数),如果有相应的文档记录。一般强制(如“始终重复参数范围”)可能有一天会适得其反。#7仅在通过引用(例如结构)传递参数时,他们希望操纵参数的值。我们有多个级别的代码审查、性能审查和在多个环境中的测试,可以捕获您描述的任何问题。不过,提出潜在的危险是值得的。