Пользовательские функции (User Defined Functions - UDF) в ColdFusion MX

User Defined Functions (UDF) наиболее часто используемая и сильно ожидаемая новая возможность в ColdFusion 5.

В то время как разработчики долгое время могли создавать пользовательские теги (начиная с ColdFusion 2), они не могли создавать пользовательские функции до тех пор, пока не был выпущен ColdFusion 5 в 2001 году.

В ColdFusion 5 пользовательские функции можно было создавать только в <cfscript>, который появился еще в ColdFusion 4.

Таким образом, пользовательские функции - это была единственная возможность ColdFusion, требующая использования <cfscript>. В свою очередь, <cfscript> был создан для тех разработчиков, кому удобнее было писать код в стиле скрипта, а не тегами ColdFusion.

Пользовательские функции в ColdFusion 5 имели 2 главных недостатка:
  1. многим разработчика неудобно использовать <cfscript>
  2. <cfscript> может взаимодействовать только с функциями, поэтому пользоватеьсктие функции не могут взаимодействовать с тегами CFML или пользовательскими тегами.

Но в ColdFusion MX теперь есть мозможность создавать пользовательские функии без использования <cfscript>. Конечно, <cfscript> все еще поддерживается, но только для тех, кому он слишком сильно нравиться.

В ColdFusion MX функции можно создавать используя 3 новых тега:
  1. <cffunction> - создает функцию
  2. <cfargument> - определяет аргументы, передаваемые в функцию
  3. <cfreturn> - возвращает результат

Тег <cfargument> не обязвтелен, т.к. не во всех функциях нам нужно определять аргументы. Но другие два тега обязательны.

В ColdFusion есть функция Now(), которая возвращает текущие таду и время. Но в нем нет функции, которая вернула бы завтрашнюю дату - ее надо было вычислять самому, пока не было вот этой функции:
Функция Tomorrow() объявлена тегом <cffunction>. Название функции указывается в обязательном аттрибуте 'name'. Аттрибут 'returntype' не обязателен, но рпактика показывает, что лучше все-таки его указывать, чтобы быть уверенным, что возвращаемые данные именно того типа, который нам нужен.

Функция сама по себе просто возвращает данные, используя тег <cfreturn>. Возращенное нам значение - это текущая дата + 1 день полученные с помощью функции DateAdd().

Теперь, когда мы имеем функцию для получения завтраней даты ( Tomorrow() ), как насчет составить функцию для получения вчерашней даты ( Yesterday() )? Вот код:
Пользовательские функции используются как любые другие функции. Следующий пример кода показывает сегодняшнюю, вчерашнюю и завтрашнюю даты, используя сочетание встроенных и пользовательских функций:
Мы создали простейшую пользовательскую функцию с использованием тегов <cffunction> и <cfreturn>. Заметьте, что тег <cfreturn> всегда должен быть между тегами <cffunction> и </cffunction>.

 

Параметры, передаваемые в пользовательские функции

Большинство функций требуют (или принимают) параметры и в этом смысле пользовательские функции от них не отличаются.

Параметры (или говоря техническим языком "аргументы") обозначаются тегом <cfargument>. Каждый тег <cfargument> определяет один параметр в той последовательности, в которой они нужны при вызове функции.

Если параметр обязателен (выполнение функции не будет выполнено без него), то аттрибут required должен быть установлен в значение yes:

В этом примере, если параметр n не определен, то это приведет к ошибке и функция не будет отработана.

Также, можно обозначить, что требуемый параметр соответствует определенному типу:

В этом примере параметр n обязательно должен быть определен, а также должен быть числом, а не строкой или чем либо еще.

Некоторые функции принимают необязательные параметры и тег <cfargument> также их поддерживает и позволяет назначать им значения по-умолчанию:
В этом примере показано, что если параметр browser не определен, то ему присваивается значение cgi переменной.

 

Пример функций Square() и Cube()

Функция Square():
Как она работает:
  1. Тег <cffunction> создает функцию и указывает, что возвращаемое значение - число.
  2. Тег <cfargument> определяет, получила ли функция параметр n и является ли этот параметр числом. Иначе этот тег возвращает ошибку.
  3. И наконец, тег <cfreturn> возвращает параметр n, умноженный на сам на себя, т.е. n в квадрате.
Усложнив немного пример функции Square() может получить функцию Cube(), возращающую полученный параметр в кубе:
А теперь отобразим на странице результат отработки этих двух функций:
Еще один пример. Пример функций обнаружения броузера: Функция IsIE() проверяет, смотрим ли мы страницу в броузере Internet Explorer:
Как она работает:
  1. Тег <cffunction> создает функцию и указывает, что возвращаемое значение - булево ("да" или "нет").
  2. Тег <cfargument> определяет, получила ли функция параметр browser и если нет, то этому параметру присваивается cgi значение по-умолчанию.
  3. Затем определяем возвращаемую переменную result.
  4. Выражение <cfif> проверяет, содержит ли параметр browser строку MSIE и устанавливает переменную result в значение "да", если такая строка есть.
  5. И наконец, тег <cfreturn> возвращает переменную result, которая равна "да" или "нет".
А вот похожая функция для обнаружения броузера Netscape:
И в заключение, приведем еще один пример обнаружения броузера программы Dreamweaver, который не является ни Netscape'ом, ни IE:
Подведем черту и отобразим результат отработки всех вышеприведенных функций обнаружения броузера:

 

От UDF к CFC

Как видите, использование пользовательских функций в ColdFusion MX не такое уж и сложное дело. И в отличие от ColdFusion 5, теперь нет никаких ограничений в отношении того, что вы можете делать внутри ваших функций.

И как приятное дополнение к полученным вами знаниям, следует сказать, что рассмотренные здесь три новых тега также исползуются при создании ColdFusion компонент (CFC). Так что вы уже легко сможете освоить и эту новую возможность в ColdFusion MX.


Автор статьи: Бен Форта (ben(at)forta.com)

 


Hosted by uCoz