2014-09-05 48 views
0

其實我用UserId與客戶端範圍。ColdFusion組件中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

確保你''讀''變量在該函數,無論你走哪。 – 2014-09-05 08:13:40

回答

7

當我們談論組件時,我們討論OOP及其概念。當我們談論OOP時,我們也談論封裝。雖然你的第一種方法會起作用,但它會破壞封裝。對象方法應該不被外界所理解。因此,第二種方法是正確的方法。有時候會遇到一些挑戰,在第一種方法中需要採取措施,但這是逐案方法和特定情況。

+0

非常感謝CFML_Developer – 2014-09-05 12:47:14

-5

這兩種方法都是正確的。 您可以直接在組件文件中使用客戶端作用域,也可以通過參數作用域。 您可以使用這兩種方法。 您選擇哪一個取決於您的要求。 第二個是可取的。

+2

這是一個很不錯的答案,幾乎沒有任何意義。 OP在詢問最佳做法,而不是*可能*。 – 2014-09-05 07:38:40

6

@CFML_Developer給出了很好的答案。爲了建立這一點...

OO理論在現實中有一個良好的基礎(像它通常那樣說)。打破封裝並將其挖掘到函數的「輸入」調用上下文中,幾乎將函數鎖定在該上下文中使用。你的函數要求客戶端變量存在,這意味着在客戶端變量不存在的情況下使用它並不是一件好事:它只會中斷。

如果您將函數編寫爲封裝單元,那麼只要調用它的代碼傳遞了正確的值,您就會「知道」該函數將起作用。這是正確的 - 直到調用代碼來確保這些值存在。

這也適用於兩種方式:函數不應該混淆調用上下文中的任何信息:它應該只返回一個值(或者不會有任何值),並且由調用代碼完成該值:該函數不應該規定這一點。有時函數可能會在數據作爲引用傳入時(例如大多數CFML的數組和結構函數)來操作數據,但應該記錄在案。即使如此:這是調用代碼,它決定了哪些引用在調用該函數時使用。

+0

感謝Adam Cameron – 2014-09-05 12:47:42