ColdFusion组件中Client范围和Arguments Scope的用法是什么?

时间:2014-09-05 06:19:18

标签: coldfusion scope argument-passing cfc

实际上我使用UserId和Client范围。

我可以直接在组件文件中使用Client范围,还是仅通过参数范围使用? 鉴于以下代码哪一个是正确的?或者两者都对吗?

使用客户端范围:

<cfset getUsers = Application.Users.getAllUsers()>

<cffunction name="getAllUsers" returntype="query">
    <cfquery name="read" datasource="myDsn">
        Select * 
        from Users
        Where UserID = <cfqueryparam cfsqltype="cf_sql_integer" value="#Client.UserID#">
    </cfquery>
    <cfreturn read>
</cffunction>

使用参数范围:

<cfset getUsers = Application.Users.getAllUsers(UserID = Client.UserID)>

<cffunction name="getAllUsers" returntype="query">
    <cfargument name="UserID" type="any" required= "true">

    <cfquery name="read" datasource="myDsn">
        Select * 
        from Users
        Where UserID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.UserID#">
    </cfquery>

    <cfreturn read>
</cffunction>

请给我方便的解决方案。提前致谢。

3 个答案:

答案 0 :(得分:7)

当我们谈论组件时,我们讨论OOP及其概念。当我们谈论OOP时,我们也谈论封装。虽然你的第一种方法可行,但它打破了封装。对象方法应该忽略外部世界。因此,第二种方法是正确的方法。有时候会遇到一些挑战,需要采用第一种方法,但这是个案方法和具体情况。

答案 1 :(得分:6)

@CFML_Developer给出了一个很好的答案。要建立一点......

事实上,OO理论在现实中具有良好的基础(就像它通常所说的那样)。打破封装并挖掘出函数的调用上下文,用于其输入&#34;几乎将函数锁定在一个上下文中使用。您的函数需要该客户端变量存在,这意味着在客户端变量不存在的情况下使用它并不好用:它只是断裂。

如果你把你的功能写成封装的单位,那么你就会知道&#34;如果调用它的代码传递正确的值,该函数将起作用。它是正确的 - 直到调用代码以确保存在这些值。

这也有两种方式:一个函数不应该混淆调用上下文中的任何信息:它应该只返回一个值(或者没有值),并且它取决于调用代码&#39 ; s完成了该值:函数不应该指示。有时,当函数作为参考传入时,函数可能会操纵数据(例如,大多数CFML的数组和结构函数),但这应该有详细记录。即便如此:它是调用调用函数时使用的引用的调用代码。

答案 2 :(得分:-5)

两种方法都是正确的。 您可以直接在组件文件中使用Client范围,也可以通过参数范围使用Client范围。 您可以使用这两种方法。 您选择哪一个,取决于您的要求。 第二个是可取的。