Обработка необязательных аргументов: CFArgument против isDefined
У меня есть вопрос о cfargument
, Если я посылаю параметр при вызове .cfc
Есть ли польза от определения его в качестве аргумента в первую очередь?
<cffunction name="someFunction" ....>
<cfargument name="myArg" required="no">
Или я могу просто использовать IsDefined() внутри функции, без определения аргумента?
<cffunction name="someFunction" ....>
...
<cfif isDefined("arguments.myArg")>
do something
</cfif>
Я попробовал их и знаю, что они оба работают. Однако в чем разница между определением аргумента и использованием isDefined()? Может ли это повлиять на эффективность?
1 ответ
Дело не в эффективности, а в документации. Вот выдержка из документа о стандартах кодирования моей компании на cfargument
,
При использовании тега CFARGUMENT в функции ColdFusion необходимы следующие атрибуты:
- название
- Тип
- необходимые
- намек
ColdFusion не требует использования cfargument
теги, но они обеспечивают проверку (безопасность типов) и действуют как дополнительная документация, поэтому всегда предоставляют cfargument
тег для каждого именованного аргумента, который ожидает ваша функция.
Правила:
- Имя аргумента не обязательно должно начинаться с префикса типа данных (избегайте венгерской нотации).
- Всегда указывайте
type
атрибут в ваших тегах cfargument. Старайтесь избегать использованияtype="any"
, - Если требуется аргумент, укажите
required="true"
но не указывайтеdefault
значение атрибута. - Если аргумент не требуется, укажите
required="false"
и укажитеdefault
значение атрибута. - Если вам необходимо определить, был ли предоставлен необязательный аргумент, не указывайте
default
, но вместо этого использоватьstructKeyExists(arguments,"ARGNAME")
в теле функции (помните, что при указанииdefault
Вы не можете сказать разницу между вызывающей стороной, опускающей этот аргумент, и вызывающей стороной, предоставляющей то же значение по умолчанию в качестве аргумента). - При ссылке на переменную, переданную в функцию в качестве аргумента, ВСЕГДА ссылайтесь на область действия аргументов. (Не ссылаться
foo
, ссылкаarguments.foo
.) - Не манипулируйте значением аргумента, переданного в функцию. CF передает некоторые переменные типы данных по ссылке, и любые манипуляции, выполняемые внутри функции, изменяют значение переменной на уровне, с которого она была вызвана. Скопируйте struct arguments в локальную переменную функции, используя duplicate(), чтобы избежать конфликтов, а затем при необходимости измените локальную переменную функции.
- Не добавляйте ключи к структуре аргументов, которые изначально не были переданы в функцию. Добавление новых ключей может затруднить отладку. Вместо этого скопируйте структуру arguments в локальную переменную новой функции, используя дубликат, чтобы избежать конфликтов и добавьте новые ключи в эту структуру.
НТН