实际上我使用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>
请给我方便的解决方案。提前致谢。
答案 0 :(得分:7)
当我们谈论组件时,我们讨论OOP及其概念。当我们谈论OOP时,我们也谈论封装。虽然你的第一种方法可行,但它打破了封装。对象方法应该忽略外部世界。因此,第二种方法是正确的方法。有时候会遇到一些挑战,需要采用第一种方法,但这是个案方法和具体情况。
答案 1 :(得分:6)
@CFML_Developer给出了一个很好的答案。要建立一点......
事实上,OO理论在现实中具有良好的基础(就像它通常所说的那样)。打破封装并挖掘出函数的调用上下文,用于其输入&#34;几乎将函数锁定在一个上下文中使用。您的函数需要该客户端变量存在,这意味着在客户端变量不存在的情况下使用它并不好用:它只是断裂。如果你把你的功能写成封装的单位,那么你就会知道&#34;如果调用它的代码传递正确的值,该函数将起作用。它是正确的 - 直到调用代码以确保存在这些值。
这也有两种方式:一个函数不应该混淆调用上下文中的任何信息:它应该只返回一个值(或者没有值),并且它取决于调用代码&#39 ; s完成了该值:函数不应该指示。有时,当函数作为参考传入时,函数可能会操纵数据(例如,大多数CFML的数组和结构函数),但这应该有详细记录。即便如此:它是调用调用函数时使用的引用的调用代码。
答案 2 :(得分:-5)
两种方法都是正确的。 您可以直接在组件文件中使用Client范围,也可以通过参数范围使用Client范围。 您可以使用这两种方法。 您选择哪一个,取决于您的要求。 第二个是可取的。