2014-09-05 2 views
0

Фактически я использовал UserId с областью клиента.Каково использование области «Клиент» и области «Аргументы» в компоненте ColdFusion?

Могу ли я использовать область «Клиент» непосредственно в файле компонента или использовать только через область аргументов? С учетом следующего кода Какой из них правильный? или Оба права?

Использование клиента Сфера:

<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> 

Использование Аргумент Scope:

<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

Убедитесь, что вы 'var' свою переменную' read' в этой функции, в зависимости от того, как вы идете. –

ответ

7

Когда мы говорим о компонентах, мы говорим о ООП и его концепциях. Когда мы говорим о ООП, мы также говорим об инкапсуляции. Хотя ваш первый метод будет работать, он разрушает инкапсуляцию. Объектные методы не должны забывать о внешнем мире. Следовательно, второй метод - правильный подход. Иногда возникают некоторые проблемы, когда вам необходимо принять подход в первом методе, но это случайный метод и конкретные ситуации.

+0

Спасибо большое CFML_Developer –

-5

Оба метода верны. Вы можете использовать область «Клиент» непосредственно в файле компонента, а также через область аргументов. Вы можете использовать оба метода. Какой из них вы выберете, зависит от вашего требования. Второй предпочтительнее.

+2

Это такой нехороший ответ, что почти нет смысла публиковать его. ОП спрашивал о лучших практиках, а не о том, что было возможно *. –

6

@CFML_Developer дал хороший ответ. Построить это немного ...

Теория ОО имеет прочную основу в реальности здесь (как это обычно бывает, что сказано). Прерывая инкапсуляцию и вырываясь в контекст вызова функции для своих «входов», в значительной степени блокирует функцию, которая будет использоваться в этом контексте. Для вашей функции требуется, чтобы клиентская переменная существовала, а это значит, что небезопасно использовать ее в ситуации, когда клиентская переменная не существует: она просто сломается.

Если вы записываете свои функции в виде инкапсулированных единиц, то вы «знаете», что функция будет работать, если код, который ее вызывает, передает правильные значения. Правильно - до вызывающего кода, чтобы убедиться, что эти значения существуют.

Это работает и в обоих направлениях: функция не должна возиться с какой-либо информацией в вызывающем контексте: она должна возвращать только одно значение (или не иметь никакого значения), и именно для вызывающего кода выполняется то, что сделано с этим значением: функция не должна диктовать это. Иногда функция может манипулировать данными, когда она передается как ссылка (например, большинство функций и функций CFML), но это должно быть хорошо документировано. И даже тогда: это код вызова, который определяет , который используется для вызова функции.

+0

Спасибо Адам Кэмерон –

Смежные вопросы