Статьи

Пользовательские функции в ColdFusion

Пользовательские функции позволяют разработчикам хранить часто используемые фрагменты кода вместе в повторно используемых единицах. Например, вы можете часто проверять размер определенного файла или подсчитывать количество записей в таблице базы данных. Вы можете обнаружить, что вам нужно выяснить, является ли строка заглавной или строчной буквой, или преобразовать строку в массив из отдельных символов.

Независимо от ваших потребностей, пользовательские функции (UDF) могут помочь вам в достижении вашей цели. В этой статье я покажу вам, как создавать пользовательские функции с использованием cfscript, чтобы ваша функция была совместима как с ColdFusion 5, так и с ColdFusion MX.

Функции cfscript

cfscript существует примерно с версии 4.01 . Это в основном позволяет разработчику писать код ColdFusion в синтаксисе в стиле C. Однако у cfscript есть свои ограничения. Например, вы не можете вызывать теги ColdFusion из cfscript . Вы должны использовать доступные функции. cfscript , что cfscript предлагает некоторые преимущества в производительности по сравнению с использованием тегов в некоторых ситуациях, и это часто приводит к тому, что вы используете меньше кода, чем вам может понадобиться. Кроме того, в ColdFusion 5 вы можете создавать свои собственные функции только с помощью cfscript . Именно в этом контексте мы будем использовать cfscript для создания наших собственных функций, совместимых вплоть до версии 5.

Для наших первых примеров мы будем использовать пару функций, которые я разместил в блоге ColdFusion в апреле, которые позволяют нам определить, является ли символ прописным или строчным. Затем мы добавим несколько функций для расширения возможностей скрипта способами, которые могут быть полезны в будущем.

Прописная функция

Для начала давайте создадим функцию, которая сообщит нам, является ли символ заглавными. Затем мы создадим его, чтобы сообщить нам, является ли символ строчным. Вот код для функции:

 <cfscript>   function isUpperCase(character) {      if (Asc(character) gte 65 and Asc(character) lte 90)         return true;      return false;   }  </cfscript> 

Сначала мы открываем наш блок cfscript . Далее мы создаем функцию, используя ключевое слово function. Мы даем ему имя и затем указываем в скобках параметры, которые он принимает. Вам это знакомо? Если вы когда-либо работали с JavaScript, так и должно быть. Именно так объявляется функция JavaScript (за исключением блока cfscript ). Однако следует отметить несколько моментов, связанных с пользовательскими функциями ColdFusion:

  • Вы не можете перегрузить или повторно объявить функцию. Создав его, вы не сможете создать другую функцию с таким же именем.
  • Нельзя указывать значения по умолчанию для параметров в ColdFusion UDF.
  • Вы не можете указать дополнительные параметры для UDF. Каждый параметр, который вы используете в объявлении, должен быть передан в вызов функции.

Теперь, когда я сказал вам, что вы не можете делать с UDF, вот что вы можете сделать: вы можете указать параметры, которые не объявлены. Например, я объявил только один параметр для функции выше, но я могу передать три, четыре или более параметров. Итак, обычный вызов функции будет выглядеть так:

 <cfoutput>   #isUpperCase("A")#  </cfoutput> 

Это будет отображать значение «истина». Обратите внимание, что если бы я передал строку «Aaaa», это все равно было бы истиной, потому что функция Asc использует первый переданный символ строки и игнорирует остальные.

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

 <cfoutput>   #isUpperCase("A", "a", "b")#  </cfoutput> 

Это по-прежнему будет отображать «true». Он не использует эти дополнительные параметры. Но что, если мы хотим использовать дополнительные параметры, переданные в функцию? Вы спрашиваете, как мы к ним доберемся? Это действительно довольно просто. Внутри функции у нас есть массив с именем «arguments». Итак, если мы хотим использовать второй и третий параметры, мы можем просто получить к ним доступ через этот массив.

 <cfscript>   function argsTest() {      for (i = 1; i lte ArrayLen(arguments); i = i + 1) {         WriteOutput(arguments[i] & "<br />");      }   }  </cfscript> 

Это запишет все аргументы, которые мы передаем. Мы вызываем функцию следующим образом:

 <cfset a = argsTest("I", "am", "ready", "to", "code")> 

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

  • Мы используем "lte" для нашего сравнения. Это потому, что, хотя это и другой синтаксис, это все же ColdFusion. Мы должны использовать нормальные операторы CF для сравнения и логики.
  • Мы используем i = i + 1 вместо i++ . Это потому, что мы снова используем ColdFusion, который не поддерживает оператор ++ .
  • Мы используем WriteOutput() для отображения переменных и другой информации на странице. Это похоже на использование document.write() в функции JavaScript.
  • Как и в нашей заглавной функции, обратите внимание, что мы также можем использовать обычные функции ColdFusion, такие как Asc(), Chr(), Len(), ArrayLen(), ArrayNew() и т. Д.
  • Обратите внимание на оператор return в нашей заглавной функции. В этой функции мы возвращаем простое логическое значение, которое затем может быть присвоено любой переменной, которую мы выберем. Но мы также можем возвращать сложные значения, такие как структуры и массивы. Мы увидим это через минуту.
Функция нижнего регистра

Теперь давайте закодируем нашу строчную функцию. Значения ASCII для наших строчных символов составляют от 97 до 122, поэтому мы в основном скопируем и вставим функцию верхнего регистра и изменим эти два значения.

 <cfscript>   function isLowerCase(character) {      if (Asc(character) lte 97 and Asc(character) gte 122)         return true;      return false;   }  </cfscript> 

Это будет делать для этих функций. Теперь давайте создадим функцию, чтобы решить, является ли она прописными или строчными, и предупредим нас об этом. Мы вернем значение «upper», «lower» или «false» в зависимости от переданного символа.

 <cfscript>   function isUpperOrLowerCase(character) {      if (Asc(character) gte 65 and Asc(character) lte 90)         return "upper";      else if (Asc(character) gte 97 and Asc(character) lte 122)         return "lower";      return false;   }  </cfscript> 

Мы можем использовать функцию следующим образом:

 <cfif not isUpperOrLowerCase("a")>   This is not a character.  <cfelseif isUpperOrLowerCase("a") eq "upper">   This is an uppercase character.  <cfelse>   This is a lowercase character.  </cfif> 

Это демонстрирует способность возвращать тип данных, отличный от логического, из UDF. Теперь давайте вернем что-то более сложное: массив. Мы создадим функцию, которая превратит строку в массив символов.

 <cfscript>   function toCharacterArray(str) {      var CharArray = ArrayNew(1);      for (i = 1; i lte Len(str); i = i + 1) {         CharArray[i] = Mid(str, i, 1);      }      return CharArray;   }  </cfscript> 

Это принимает строку в качестве аргумента, создает новый одномерный массив, переходит от 1 до длины строки и вытаскивает каждый символ, вставляя его в массив по текущему индексу, представленному переменной i . Затем мы возвращаем массив символов.

 <cfset a = toCharacterArray('This is my array")>  <cfdump var="#a#"> 

Приведенный выше скрипт отображает аккуратную маленькую таблицу, которая показывает каждое значение в массиве. Это действительно легко создавать пользовательские функции в ColdFusion. Теперь, когда вы знаете, как создавать пользовательские функции в ColdFusion с помощью cfscript, вот ваше назначение:

Просмотрите текущий проект или веб-сайт, который вы ранее создали в ColdFusion, и определите части этого проекта, которые можно встроить в функции. Возможно, вы используете одну и ту же функциональность в нескольких местах, или вы можете очистить свой код и упростить его, удалив его из тела ваших шаблонов и поместив в шаблон. Затем создайте свои функции, сохраните их в одном файле (если их не так уж много) и просто включите их там, где они вам нужны. Вы также можете создать на своем сайте каталог с именем «udfs» или что-то в этом роде и поместить каждую функцию в файл с тем же именем. Затем вы просто включаете нужные вам функции.

Если вам нужны бесплатные пользовательские функции, вы можете взглянуть на CFLib — там вы найдете множество очень полезных функций.