Статьи

Введение в структуру данных в ColdFusion Часть II — Структуры

Структуры являются очень полезным средством организации данных в ваших программах ColdFusion. Но их часто неправильно понимают, упускают из виду или не используют в полной мере — даже самые опытные программисты ColdFusion.

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

Что такое структура?

Прежде всего, что такое структура (или «структура», как она известна в ColdFusion)? Структура — это средство хранения данных. Если вы занимались программированием на Java, вы можете сравнить его с HashMap. Это также похоже на хэш в Perl. Мы можем хранить ряд связанных данных в структуре. Каждый фрагмент данных имеет имя и значение, и мы можем извлечь конкретное значение, вызвав структуру и передав ей имя нужного нам значения. Представьте, что этот процесс похож на хранение нескольких переменных с разными именами в одной переменной.

Давайте начнем с примера. Представьте, что мы создаем книжный интернет-магазин и хотим хранить информацию об одной книге в одной структуре данных. Теперь мы обычно храним наши данные в базе данных и используем запрос для доступа и отображения. Но для этого примера мы будем использовать структуры. Каждая книга будет иметь название, автора, описание, год публикации и номер ISBN. Мы начнем с создания структуры для хранения этих данных.

<cfset myBook = StructNew()> 

Здесь мы создаем переменную myBook и сообщаем ColdFusion, что это будет структура. Если мы не сообщим ColdFusion, что это будет структура, она не будет работать правильно. Теперь давайте добавим наши данные в структуру:

 <cfset a = StructInsert(myBook, \"title\", \"All About ColdFusion\", 1)> 

Давайте остановимся и поговорим об этой функции StructInsert прежде чем двигаться дальше. Первый параметр функции — это имя структуры, к которой мы хотим добавить ключ. Следующий параметр — это имя ключа, который мы хотим добавить. Для этого параметра вы можете использовать переменную или строковый литерал (как мы сделали здесь). Следующий параметр — это значение ключа. Как и в случае с именем ключа, в этом случае мы можем использовать переменную или строковый литерал. Четвертый параметр является необязательным параметром — параметр «разрешить перезапись». Если этот параметр установлен в 1 , он перезапишет любой существующий ключ с именем «title» в этой структуре. Если установлено значение 0 , будет выдано сообщение об ошибке, если вы попытаетесь добавить «заголовок» в структуру, которая уже имеет ключ с таким именем. Значение по умолчанию для этого параметра — 0 . Итак, давайте добавим остальные наши данные:

 

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

 <cfoutput>  Title: #myBook["title"]#<br />  Author: #myBook["author"]#<br />  Description: #myBook["description"]#<br />  Publish Year: #myBook["publishyear"]#<br />  ISBN: #myBook["ISBN"]#  </cfoutput> 

Здесь мы просто выгружаем содержимое структуры по одному ключу за раз. Но что произойдет, если мы не знаем, какие ключи содержит структура? Это не проблема — мы можем использовать тэг цикла ColdFusion для вывода всех ключей в структуре.

 <cfloop collection="#myBook#" item="key">  <cfoutput>    #key#: #myBook[key]#<br />  </cfoutput>  </cfloop> 

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

Хранение структур в массивах или других структурах

Так же, как мы можем хранить массивы внутри массивов, мы также можем хранить структуры внутри структур и массивов. Например, мы можем создать структуру с названием title, которая будет хранить удобную для пользователя метку для каждого из ключей в нашем массиве. Мы будем использовать те же ключи, что и в нашей структуре книги.

 <cfset titles = StructNew()>   <cfset a = StructInsert(titles, "title", "Title", 1)>  <cfset a = StructInsert(titles, "author", "Author", 1)>  <cfset a = StructInsert(titles, "description", "Book Description", 1)>  <cfset a = StructInsert(titles, "publishyear", "Publish Year", 1)>  <cfset a = StructInsert(titles, "isbn", "ISBN Number", 1)> 

Это было легко. Теперь мы немного усложним наши структуры данных. Мы собираемся создать структуру с именем bookshelf и поместить в myBook и titles .

 <cfset bookshelf = StructNew()>  <cfset a = StructInsert(bookshelf, "names", titles, 1)>  <cfset a = StructInsert(bookshelf, "values", myBook, 1)> 

Здесь мы просто инициализируем bookshelf как структуру, а затем помещаем в нее два ключа. Первый ключ называется « names », и мы помещаем структуру titles в этот ключ. Второй ключ называется « values », и мы myBook структуру myBook в это. Теперь у нас есть структура, которая содержит две структуры, каждая из которых содержит пять ключей. Теперь я хочу отсортировать структуру по имени ключа, поэтому я собираюсь сделать это:

 <cfset keyList = StructKeyList(bookshelf.names)>  <cfset keyList = ListSort(keyList, "TEXT")> 

У нас здесь есть новая функция StructKeyList , которая принимает в качестве параметра имя структуры. Затем он получает список всех ключей и возвращает их в списке через запятую. Затем мы используем функцию ListSort для упорядочения структурных ключей в алфавитном порядке. Однако я хочу указать на метод доступа к структурам, содержащимся на книжной полке. Если вы работали с любыми языками в стиле C, вы узнаете это как «точечную нотацию». Вы можете даже смотреть на эти структуры как на объекты и видеть, что вы получаете доступ к их элементам. В этом случае names является членом книжной полки. Теперь мы переберем наш список и выведем значения в каждой из двух структур.

 <cfloop list="#keyList#" index="key">  <cfoutput>    #bookshelf.names[key]#: #bookshelf.values[key]#<br />  </cfoutput>  </cfloop> 

Это приводит к хорошему небольшому списку для нашей книги. Но мы не часто сталкиваемся с книжными магазинами, которые продают только одну книгу. Итак, нам нужно отслеживать неограниченное количество книг здесь. Для этого мы будем использовать нашу структуру bookshelf и структуру myBook ; мы также создадим новую структуру myBook2 и массив myBookArray . Сначала мы создадим myBook2 :

 

Теперь мы создаем одномерный массив для хранения наших книг.

 <cfset myBookArray = ArrayNew(1)> 

Далее мы добавим наши книги в массив:

 <cfset myBookArray[1] = myBook>  <cfset myBookArray[2] = myBook2> 

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

 <cfset a = StructInsert(bookshelf, "names", titles, 1)>  <cfset a = StructInsert(bookshelf, "values", myBookArray, 1)>   <cfset keyList = StructKeyList(bookshelf.names)>  <cfset keyList = ListSort(keyList, "TEXT")> 

Теперь мы отобразим каждую из наших книг, используя два цикла. Во-первых, нам нужно убедиться, что обе книги отображаются. Это означает, что мы будем перебирать массив, который мы сохранили в bookshelf.values . Затем мы перебираем список ключей и отображаем метку и значение для каждого ключа в текущем элементе массива:

 <cfloop from="1" to="#ArrayLen(bookshelf.values)#" index="i">  <cfloop list="#keyList#" index="key">    <cfoutput>      #bookshelf.names[key]#: #bookshelf.values[i][key]#<br />    </cfoutput>  </cfloop>  <hr>  </cfloop> 

Обратите внимание, что мы используем точечную запись для доступа к длине массива в нашем внешнем цикле. Внутри этого цикла мы перебираем список ключей в массиве. Интересная часть возникает, когда мы хотим отобразить значения для заголовка, автора и других полей. Мы получаем доступ к структуре книжной полки, затем ключу values структуры bookshelf (которая является массивом), затем индексу i ключа values (который является структурой), и, наконец, мы получаем значение ключа из этой структуры.

Вы сейчас полностью сбиты с толку? Первое время, когда мне пришлось долго использовать структуры, было достаточно опыта. Но если разбить задачу на простые шаги, вы обнаружите, что на самом деле очень просто использовать встроенные структуры данных ColdFusion для улучшения вашего приложения. Изучение этих элементов дизайна и программирования приложений ColdFusion очень быстро поставит вас на шаг впереди многих других разработчиков CF и даст вам инструменты, необходимые для выполнения любой поставленной перед вами задачи.

Встроенные структуры ColdFusion

На самом деле в ColdFusion встроены некоторые структуры, о которых вы, вероятно, даже не подозревали. Например, знаете ли вы, что области видимости переменных Form, URL и CGI являются структурами? Это верно. Вы можете легко узнать, какие переменные находятся в каждой из этих структур, просто зацикливаясь на соответствующей коллекции. (Я знаю, что все эти переменные появляются в отладочной информации ColdFusion, но иногда очень удобно знать, как получить эту информацию без помощи встроенной отладки CF.)

Давайте рассмотрим простой пример с переменными CGI, который предоставляет нам важную информацию о среде, в которой работает наше приложение. Вот код для этого:

 <cfloop collection="#CGI#" item="key">  <cfoutput>#key# = #CGI[key]#<br></cfoutput>  </cfloop> 

Это оно! Вы можете запустить этот же код, чтобы получить информацию о переменных Form, URL, CGI, Client, Application и Session. Это все структуры с точки зрения ColdFusion, и поэтому они легко доступны с помощью вышеуказанного метода.

Это завершает наше знакомство со структурами в ColdFusion. Как видите, CFML предоставляет очень мощные средства организации, отслеживания и доступа к данным. Вы можете обнаружить, что вы не используете эти методы очень часто, но они часто могут быть вашим спасением, когда вы находитесь в затруднительном положении для решения сложной проблемы. Я нашел структуры и массивы очень полезными, когда у вас есть сложные данные, которые нужно отображать нетрадиционными способами. Храните эти маленькие кусочки информации где-то в глубине своего мозга, добавьте эту статью в закладки в папке «ColdFusion Resources» (я знаю, у вас есть такая), и у вас есть еще один инструмент в вашем арсенале разработки.