ColdFusion: безопасно ли не указывать ключевое слово переменных в CFC? - PullRequest
5 голосов
/ 12 сентября 2008

В компоненте ColdFusion (CFC) необходимо ли использовать полные имена для переменных в области переменных?

Собираюсь ли я попасть в беду, если я изменю это:

<cfcomponent>
    <cfset variables.foo = "a private instance variable">

    <cffunction name = "doSomething">
        <cfset var bar = "a function local variable">
        <cfreturn "I have #variables.foo# and #bar#.">
    </cffunction>
</cfcomponent>

к этому?

<cfcomponent>
    <cfset foo = "a private instance variable">

    <cffunction name = "doSomething">
        <cfset var bar = "a function local variable">
        <cfreturn "I have #foo# and #bar#.">
    </cffunction>
</cfcomponent>

Ответы [ 9 ]

10 голосов
/ 12 сентября 2008

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

<cfcomponent>
    <cfset foo = "a private instance variable">

    <cffunction name="doSomething">
        <cfargument name="foo" required="yes"/>
        <cfset var bar = "a function local variable">
        <cfreturn "I have #foo# and #bar#.">
    </cffunction>

    <cffunction name="doAnotherThing">
        <cfargument name="foo" required="yes"/>
        <cfset var bar = "a function local variable">
        <cfreturn "I have #variables.foo# and #bar#.">
    </cffunction>

</cfcomponent>

doSomething ("args") возвращает "У меня есть args и локальная переменная функции "

doAnotherThing ("args") возвращает "У меня есть частный экземпляр переменной и локальная переменная функции ."

6 голосов
/ 24 сентября 2008

Я скажу Да. Это явно необходимо? Нету. Можете ли вы сойти с рук, не делая этого? Конечно. Вы просите неприятностей? Абсолютно. Если у вас есть следующее внутри функции:

<cfset foo = "bar" />

Это не поместит эту переменную в область действия локальной переменной var, а поместит ее в глобальную область VARIABLES CFC, что означает, что она доступна для каждого метода этого CFC. Есть моменты, когда вы можете захотеть сделать это, но большую часть времени вы будете просить о состоянии гонки.

Когда сервер читает какую-либо переменную, если эта переменная не является явным, объявленным как часть области (REQUEST., SESSION. И т. Д.), То ColdFusion запустит ScopeCheck (), чтобы определить, в какой области находится переменная Это не только накладывает ненужные накладные расходы на сервер приложений, но также предоставляет возможность перехвата, когда ваша переменная находится в одной области видимости, но ScopeCheck () обнаружил переменную с тем же именем выше в порядке приоритета.

Всегда, всегда, ВСЕГДА, охватывайте все переменные. Неважно, как тривиально. Даже такие вещи, как имена запросов и циклические индексы. Спаси себя и тех, кто позади тебя, от боли.

5 голосов
/ 15 сентября 2008

Особенно в ХФУ, правильная оценка важна. Дополнительное «многословие» стоит ясности. Если переменные выскользнут из их области с отступом, это вызовет серьезные проблемы и будет очень трудно диагностировать.

Многословие не всегда плохо. Мы называем наши функции и методы описательными способами, такими как getAuthenticatedUser (), а не gau (). Столбцы и таблицы базы данных лучше оставить описательными, как EmployeePayroll, а не empprl. Таким образом, быть кратким может быть «проще», когда ваша кратковременная память заполнена деталями проекта, но описательность показывает ваши намерения и помогает на этапе обслуживания приложения, еще долго после того, как ваша кратковременная память была заполнена другими вещами .

3 голосов
/ 12 сентября 2008

Краткий ответ на ваш вопрос: нет, вероятно, вы не столкнетесь с проблемами, пытаясь это сделать. Вне контекста UDF (даже внутри CFC) оператор set с незаданной областью подразумевает область действия переменных.

Кроме того, в CFC область действия переменных доступна для всех его функций; это своего рода глобальная область видимости внутри этого CFC - аналогично области видимости «this», за исключением того, что область видимости переменных похожа на «частные» переменные, тогда как область видимости this похожа на публичные переменные.

Чтобы проверить это, создайте test.cfc:

<cfcomponent>
    <cfset foo = "bar" />
    <cffunction name="dumpit" output="true">
        <cfdump var="#variables#" label="cfc variables scope">
        <cfdump var="#this#" label="cfc this scope">
    </cffunction>
</cfcomponent>

и страница для проверки, test.cfm:

<cfset createObject("component", "test").dumpit() />

И результаты будут:

image


Now, to address another problem I see in your example code...

In CF, all User Defined Functions have a special un-named scope commonly referred to as the "var" scope. If you do the following inside a UDF:


Then you are telling CF to put that variable into the var scope.

To compound things a bit, you can run into problems (variable values changing when you weren't expecting them to) when you are not using the var scope in your inline UDFs.

So the rule of thumb is to always, Always, ALWAYS, ALWAYS var-scope your function-internal variables (including query names). There is a tool called varScoper , который поможет вам найти переменные, которые должны быть в области видимости. В прошлый раз я проверил, что это не идеально, но это определенно начало.

Однако, это плохая идея ссылаться на (отображать / использовать) переменные без области (очевидно, исключая переменные в области видимости, поскольку вы не можете указать область для чтения) в CFC или даже на ваших стандартных страницах CFM. Начиная с CF7 было 9 областей, которые были проверены в определенном порядке, когда вы читаете переменную без указания области, первое совпадение выигрывает. С CF8 в этом списке может быть больше областей, я не проверял. Когда вы делаете это, вы рискуете получить значение из одной области видимости, когда ожидаете его от другой; это кошмар для отладки ... уверяю вас. ;)

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

2 голосов
/ 29 сентября 2008

Не может явно работать область видимости в области переменных, но это не очень хорошая идея, и, честно говоря, единственная причина, по которой не , заключается в лени ИМО. Если вы явно ограничиваете все 1) вы избегаете потенциальных проблем, и 2) это облегчает чтение кода, потому что не возникает вопроса, в чем заключаются области действия.

Для меня это не делает код более многословным (и, конечно, не слишком многословным) - на самом деле его легче читать, избегать путаницы и избегать странных побочных эффектов, которые могут возникнуть, если вы явно не определяете область действия. 1005 *

1 голос
/ 15 сентября 2008

Простой ответ на ваш вопрос: «НЕТ, это не нужно»

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

На самом деле, я добавляю немного дополнительной детализации в свои пользовательские функции CFC, создавая одну локальную структуру:

Затем я помещаю все свои локальные переменные в эту структуру и ссылаюсь на них таким образом, чтобы мой код выглядел примерно так:

0 голосов
/ 25 сентября 2008

Вот очень хороший справочник по объему ХФУ от Raymond Camden. Лично я предпочитаю делать хэш 'self', чтобы избежать путаницы (обратите внимание, я не использую область 'переменных' в функциях):

<cfcomponent>
  <cfset variables.self = structNew()>
  <cfscript>
    structInsert(variables.self, <key>, <value>);
    ...
  </cfscript>

  <cffunction name="foo">
    self.<key> = <value>
    <cfreturn self.<key> />
  </cffunction>

  ...
0 голосов
/ 19 сентября 2008

Отбросьте лучшие практики, я считаю, что это также может зависеть от того, как вы собираетесь получить доступ к вашим CFC. У меня не было проблем с их удалением при создании объектов и доступе к ним из Coldfusion. Однако я думаю, что это может понадобиться при удаленном доступе и / или отображении их с помощью Actionscript в flex / flash.

0 голосов
/ 13 сентября 2008

После прочтения ваших ответов вот что я думаю:

Да, это безопасно. Как правило, нет необходимости или полезно явно указывать область действия переменных. Это просто добавляет беспорядок к уже многословному языку.

Конечно, есть одно незначительное исключение, как указывало Soldarnal , где требуется указать переменную в области переменных. Это если у вас есть локальная переменная функции с тем же именем. (Но вы, вероятно, не должны этого делать.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...