Интерфейс java list collection с примерами

Введение

Коллекции являются очень важной частью VBA. Если вы пользовались VBA какое-то время, вы будете использовать Коллекции

Наиболее распространенными из них являются Workbooks, Worksheets, коллекции Range и Cells.

В следующем коде показаны некоторые примеры использования коллекции Workbooks VBA.

' Workbooks это коллекция всех открытых рабочих книг

    ' Count - это количество книг в коллекции.
    Debug.Print Workbooks.Count

    ' Напечатайте полное имя книги с именем Пример.xlsm
    Debug.Print Workbooks("Пример.xlsm").FullName

    ' Напечатайте полное название книги, которая была открыта второй
    Debug.Print Workbooks(2).FullName

Коллекции похожи на массивы, поэтому важно понимать, что они из себя представляют и чем они отличаются от массивов

Доступ к элементам коллекции

Для доступа к элементам коллекции вы просто используете индекс. Как мы увидели, индекс — это позиция элемента в коллекции на основе порядка, в котором они были добавлены.

Порядок также можно установить с помощью параметра «Before» или «After».

Sub dostup()

    Dim coll As New Collection

    coll.Add "Яблоко"
    coll.Add "Слива"

    ' Будет напечатано Яблоко
    Debug.Print coll(1)

    ' добавьте апельсин в начало
    coll.Add "Апельсин", Before:=1

    ' будет напечатан Апельсин
    Debug.Print coll(1)

    ' Будет печатать Яблоко, так как оно сейчас в положении 2
    Debug.Print coll(2)

End Sub

Вы также можете использовать свойство элемента для доступа к элементу в коллекции. Это метод по умолчанию для коллекции, поэтому следующие строки кода эквивалентны.

  Debug.Print coll(1)
  Debug.Print coll.Item(1)

Элементы в коллекции доступны только для чтения?

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

Если вы попытаетесь обновить элемент коллекции, вы получите сообщение об ошибке. Следующий код выдает ошибку «Требуется объект».

Sub NapisatZnachenie()

    Dim coll As New Collection

    coll.Add "Яблоко"

    ' Эта строка вызывает ОШИБКУ
    coll(1) = "Слива"

End Sub

Вы можете изменить объект, который хранится в коллекции

Sub IzmenitObekt()

    Dim coll As New Collection
    Dim o As New Class1
    
    ' Добавить объект в коллекцию
    o.fruit = "Яблоко"
    coll.Add o
    
    ' Изменить фруктовую часть Class1
    coll(1).fruit = "Слива"
    
    ' Печатает Слива
    Debug.Print coll(1).fruit

End Sub

Это может показаться противоречивым поведением, но тому есть веская причина. Любой элемент, добавленный в коллекцию, доступен только для чтения. Однако при добавлении объекта в коллекцию объект не добавляется как элемент. Переменная с адресом памяти объекта добавляется в качестве элемента.

Это происходит незаметно, чтобы вы этого не заметили. Переменная item на самом деле доступна только для чтения, но объект, на который она указывает, — нет.

Все, что вам нужно помнить, это то, что базовые типы данных в коллекции доступны только для чтения. Объекты в коллекции могут быть изменены.

Вы можете прочитать больше об объектах в памяти здесь.

Параметризация запросов

Параметризация — одна из самых полезных особенностей Postman.

Часто необходимо выполнить один и тот же запрос на разных наборах данных. С помощью параметризации, можно использовать переменные при выполнении запросов.

В Postman, параметры создаются с помощью двойных скобок: `test`.

Например, наш base URL — https://testengineer.ru и мы сохраняем это значение в переменной с именем base_url. В этом случае, мы можем обратиться к этой переменной из запроса, написав `base_url`. Для того, чтобы отправить запрос на этот URL, мы подставим эту переменную в запрос. Выглядеть это будет так: `base_url`/get?customers=new. Запрос будет отправлен на https://testengineer.ru/get?customers=new

Шаг 1: Меняем тип HTTP-запроса на GET и вводим URL:

Шаг 2: Меняем URL на параметр `url`. После этого URL запроса должен быть таким: `url`/users

Шаг 3: Теперь нам нужно создать переменную окружения, чтобы использовать ее в качестве параметра. Для этого нажимаем на кнопку с глазом и кликаем на Edit (редактировать), чтобы создать глобальную переменную и затем использовать ее в коллекциях.

Шаг 4: В окне создания переменной задаем имя (именем будет url) и значение (значением будет https://jsonplaceholder.typicode.com). После этого нажимаем Save (Сохранить)

Шаг 5: Возвращаемся к GET-запросу и нажимаем Send (отправить)

Если все сделано правильно, значение переменной, которую мы создали, будет подставлено вместо ее имени и запрос выполнится успешно.

5.3 Многопоточные коллекции

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

В Java есть коллекции, которые предназначены для использования в многопоточной среде. Они реализуют разные механизмы синхронизации данных. До выхода Java 1.5 в наличии были следующие многопоточные коллекции: Stack, Vector, HashTable. Все методы этих классов являются synchronized. Это означает, что при вызове любого метода этих классов другой поток будет заблокирован, даже если вызванный метод — метод чтения. Эти коллекции появились еще с версией Java 1 и в современной разработке их не стоит использовать. C выходом Java 1.2 появился утилитный класс Collections, который предоставляет статические методы для оборачивания стандартных коллекций в их синхронизированные представления. Это сделано для совместимости с Java версией 1.

После релиза Java 1.5, 1.6 и 1.7 появилась возможность использовать следующие классы коллекций, которые предназначены и оптимизированы для работы в многопоточной среде:

  • CopyOnWriteArrayList <E>
  • CopyOnWriteArraySet <E>
  • ConcurrentSkipListSet <E>
  • ConcurrentHashMap <K, V>
  • ConcurrentSkipListMap <K, V>
  • ConcurrentLinkedQueue <E>
  • ConcurrentLinkedDeque <E>
  • ArrayBlockingQueue <E>
  • DelayQueue <E extends Delayed>
  • LinkedBlockingQueue <E>
  • PriorityBlockingQueue <E>
  • SynchronousQueue <E>
  • LinkedBlockingDeque <E>
  • LinkedTransferQueue <E>

Первые две коллекции — copy on write структуры. Третья коллекция — skip list структура. Следующие две коллекции — классы Map, предназначенные для использования в многопоточных программах. Использование классов этих коллекций позволяет увеличить производительность программы по сравнению с использованием устаревших классов из Java 1. Рассмотрим статические методы утилитарного класса Collections.

Вместительность коллекций

Одна из ключевых особенностей коллекций это изменяемый размер. Когда создается экземпляр коллекции она внутри себя инициализирует какую-то структуру данных, зачастую это массив. По умолчанию этот массив имеет определённую вместительность, которую можно просмотреть с помощью свойства Capacity.

После активного наполнения коллекции наступает момент, когда внутренний массив заполнен и мы не можем добавить новый элемент. В таком случае коллекция создаёт новый массив с большей вместительностью (обычно в два раза больше) и копирует туда данные со старого массива.

Поэтому коллекции, которые основаны на массивах имеют сложность вставки:

  • O(1) — когда вместительности достаточно.
  • O(n) — когда вместительности недостаточно и нужно копировать данные в массив побольше.

Чтобы избежать уменьшения производительности нужно при создании коллекции указать необходимую нам вместительности. Это позволит уменьшить количество копирований.

Использование Java API

Сама Java предоставляет несколько способов поиска элемента в списке:

  • То содержит метод
  • То indexOf метод
  • Специальный цикл for
  • То Течение ИНТЕРФЕЙС ПРИКЛАДНОГО ПРОГРАММИРОВАНИЯ

3.1. содержит()

List предоставляет метод с именем содержит :

boolean contains(Object element)

Как следует из названия, этот метод возвращает true , если список содержит указанный элемент, и возвращает false в противном случае.

Поэтому, когда нам нужно проверить, существует ли конкретный элемент в нашем списке, мы можем:

Customer james = new Customer(2, "James");
if (customers.contains(james)) {
    // ...
}

3.2. Индекс()

indexOf – еще один полезный метод поиска элементов:

int indexOf(Object element)

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

Таким образом, логически, если этот метод возвращает что-либо, кроме -1, мы знаем, что список содержит элемент:

if(customers.indexOf(james) != -1) {
    // ...
}

Главное преимущество использования этого метода заключается в том, что он может сообщить нам положение указанного элемента в данном списке.

3.3. Основные циклы

А что, если мы хотим выполнить поиск элемента на основе полей? Например, скажем, мы объявляем лотерею, и нам нужно объявить Клиента с определенным именем победителем.

Для таких полевых поисков мы можем обратиться к итерации.

Традиционный способ итерации по списку-использовать одну из циклических конструкций Java. На каждой итерации мы сравниваем текущий элемент в списке с элементом, который мы ищем, чтобы увидеть, соответствует ли он:

public Customer findUsingEnhancedForLoop(
  String name, List customers) {

    for (Customer customer : customers) {
        if (customer.getName().equals(name)) {
            return customer;
        }
    }
    return null;
}

Здесь имя относится к имени, которое мы ищем в данном списке клиентов . Этот метод возвращает первый Customer объект в списке с соответствующим именем или null , если такого Customer не существует.

3.4. Цикл С итератором

Итератор – это еще один способ обхода списка элементов.

Мы можем просто взять наш предыдущий пример и немного подправить его:

public Customer findUsingIterator(
  String name, List customers) {
    Iterator iterator = customers.iterator();
    while (iterator.hasNext()) {
        Customer customer = iterator.next();
        if (customer.getName().equals(name)) {
            return customer;
        }
    }
    return null;
}

Следовательно, поведение остается таким же, как и раньше.

3.5. Java 8 Stream API

Начиная с Java 8, мы также можем использовать Stream API для поиска элемента в списке .

Чтобы найти элемент, соответствующий определенным критериям в данном списке, мы:

  • вызовите stream() в списке
  • вызовите метод f ilter() с соответствующим предикатом
  • вызовите конструкцию find Any () , которая возвращает первый элемент, соответствующий предикату filter , завернутому в Optional , если такой элемент существует
Customer james = customers.stream()
  .filter(customer -> "James".equals(customer.getName()))
  .findAny()
  .orElse(null);

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

Шаг 7. Выбрать роялти

Последнее поле — «Royalties». От него напрямую будет зависеть ваш заработок. Дело в том, что Rarible будет удерживать 2,5% от каждой успешной продажи. Автор произведения тоже может получать процент с последующих продаж своего произведения. Эту комиссию также называют роялти.

В данном случае, вы первый раз получу полную цену с продажи своего NFT — 1 ETH. Дальше каждый новый владелец тоже может продать этот NFT за любую цену, например 2 ETH. Но это уже вторичные продажи, поэтому 90% с них уходят продавцу, а 10% возвращаются вам — автору. Их вы будете получать за каждую перепродажу.

Совет от Maff

Можно выбрать любой процент роялти при перепродажах — от 0 до 100. Сама платформа рекомендует ставить не более 30%.

Будни автоматизации или «мне нужна программка для 3D упаковки» Промо

Автоматизация отечественных предприятий, которой приходиться заниматься, это нужная и высокооплачиваемая, но довольно нервная работа. Выручает юмор. Например, при общении с требовательным клиентом можно вспомнить анекдот: «Держась руками за стену, на ногах еле стоит мужик. К нему пристает ребенок: «Ну, папа, пожалуйста, сделай мне кораблик!», папа отвечает: «Ага! — Сейчас все брошу и пойду делать тебе кораблик!». Про один такой сделанный для клиента «кораблик» и хочется рассказать. Надеюсь, совместное погружение в теплое ламповое (то есть клиентоориентированное) программирование доставит Вам положительные эмоции, да и задача попалась интересная. Поплыли?

Типы, объекты и фабрики

Пространства имен

На свете существует огромное количество программистов, которые создают те или иные XML-документы. При этом, очень часто они оперируют одинаковыми понятиями, например “Дата”, “Цена” и “Сотрудник”. Если вдруг две системы имен (созданных разными программистами) встретятся в рамках одной информационной системы, то произойдет конфликт имен.

Например, Вася создал тип данных “Сотрудник” со свойством “ФИО” и Петя создал объект «Сотрудник» со свойствами “Фамилия”, “Имя”, “Отчество” и “ИНН”. Объекты разные, а имя типа одно, возникает путаница. Чтобы этого избежать, используются пространства имен. Все имена должны быть уникальны в рамках одного пространства имен. Имена в разных пространствах запросто могут повторять друг друга.

По традиции (и по многим другим соображениям), пространства именуются в виде URL-подобных строк. Например, “http://vasya.org/xml/sotrudniki”. Причем, это не ссылка в сети, это просто строка-идентификатор. Документы пестрят этими “ссылками” и ,сталкиваясь с ними, начинающий специалист впадает в ступор — “что это за адреса, что по ним расположено, а что, если нет интернета…” Так вот, это не адреса, это уникальные идентификаторы пространств имен. Строка может быть любой.

Теперь, все типы, которые изобретет Вася, он поместит в свое пространство имен и творчество Пети ему не страшно. Всегда можно отличить одного “Сотрудника” от другого.

Типы данных

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

Модель данных и Фабрика XDTO

При построении системы типов XDTO используется понятие Модели данных. Модель представляет собой совокупность всех типов, которые можно записать в один XML документ. С понятием модели неразрывно связано понятие Фабрики XDTO. Фабрика, это объект платформы 1С:Предприятие, который позволяет создавать те самые объекты “Сотрудник”, к которым можно обращаться “через точку”. Именно фабрика создает объект встроенного языка и наделяет его свойствами “ФИО” и “ИНН”, позволяя виртуальной машине обращаться к этим свойствам. Перечень возможных типов и их свойств фабрика берет из модели данных, которая в конечном итоге представляет собой просто набор схем XML.

Что в итоге?

Представьте, что у нас есть большая система взаимосвязанных типов. Каждый тип входит в определенный логический блок типов, а блоки для удобства разнесены по разным схемам XML. Например, у нас есть блок “Коллекции”, представляющий абстрактные списки объектов и есть блок “Сотрудники”, представляющий типы объектов, описывающие сотрудников, их зарплату, должности и т.п.

Нам нужно выгрузить и передать куда-то XML документ со списком сотрудников.

Для этого, нам удобно взять тип “Список” из схемы списков и наполнить его “Сотрудниками” из схемы “Сотрудники”. В результате, наша модель типов включает в себя 2 схемы (2 пакета) типов — “Списки” и “Сотрудники”. На основании данной модели типов мы можем создать Фабрику, которая будет “строить” объекты, к которым мы сможем обращаться из встроенного языка.

Что со всем этим делать?

Давайте еще раз подведем краткий итог и воспользуемся полученной информацией. Итак, у нас есть 2 пакета типов (2 схемы XML). Первая — разные коллекции, списки, соответствия и т.п. Вторая — сотрудники. Нам нужно сформировать список сотрудников.

1. Предположим, что пакет коллекций имеет пространство имен “http://super-puper/collections”, а пакет сотрудников — “http://super-puper/employees”.

2. В конфигураторе раскрываем ветку ПакетыXDTO и в контекстном меню выбираем “Импорт схемы XML”. Указываем файлы со схемами.

3. В ветке пакетов появятся наши пакеты. Зададим им осмысленные имена (любые)

4. Теперь конфигурация “знает” о наших типах данных и они включены в модель типов конфигурации

Применение в коде

Как уже говорилось, для создания объектов XDTO применяется ФабрикаXDTO. Чтобы создать объект, фабрика должна знать его тип. Делается это следующим образом:

// Создается объект языка 1С с типом “ТипОбъектаXDTO” // Первый параметр пространство имен, второй — имя типа в пространстве имен.ТипОбъектаСписок = ФабрикаXDTO.Тип(“http//super-puper/collections”, “Список”); // Создаем объект спискаОбъектСписок = ФабрикаXDTO.Создать(ТипОбъектаСписок);// обход сотрудников для выгрузкиПока Выборка.Следующий() ЦиклТипОбъектаСотрудник = ФабрикаXDTO.Тип(“http//super-puper/employees”, “Сотрудник”);Сотрудник = ФабрикаXDTO.Создать(ТипОбъектаСотрудник);// Свойство “ФИО” объявлено в схемеСотрудник.ФИО = Выборка.Наименование;// Добавление “Сотрудников” в “Список”ОбъектСписок.Добавить(Сотрудник); КонецЦикла;// А теперь, запись в поток XMLЗапись = Новый ЗаписьXML;Запись.УстановитьСтроку(); // запись в строкуФабрикаXDTO.Записать(Запись, ОбъектСписок);ДанныеXML = Запись.Закрыть(); // документ готов!

Резюме

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

Далее мы рассмотрим программное создание модели типов, собственных фабрик, а также нюансы работы с объектами XDTO.

Добавление разных типов

Вы также можете добавлять различные типы предметов в коллекцию.

 collFruit.Add "Яблоко"
 collFruit.Add 45
 collFruit.Add #12/12/2019#

Это редко нужно. В VBA коллекции Sheets содержат листы типа Worksheet и типа Chart. (Чтобы создать лист с диаграммой, просто щелкните правой кнопкой мыши любую диаграмму, выберите «Переместить» и установите переключатель «Новый лист»).

Следующий код отображает тип и имя всех листов в текущей книге

Обратите внимание, что для доступа к другому типу необходимо, чтобы переменная For Each была вариантом, иначе вы получите ошибку

Sub listi()

    Dim sh As Variant
    For Each sh In ThisWorkbook.Sheets
        ' Тип отображения и название листа
        Debug.Print TypeName(sh), sh.Name
    Next

End Sub

При доступе к различным элементам переменная For Each должна быть вариантом. Если это не так, вы получите ошибку при доступе к другому типу, который вы объявили. Если мы объявим sh в качестве рабочего листа в приведенном выше примере, это приведет к ошибке при попытке доступа к листу типа Chart.

Редко вам понадобится коллекция разных типов, но, как видите, иногда это может быть полезно.

Как сохранить все элементы из одного списка в другом

Интерфейс Java List имеет метод retainAll(), который способен сохранять все элементы из одного списка, которые также присутствуют в другом списке. Другими словами, метод retain() удаляет все элементы из целевого списка, которые не найдены в другом списке. Полученный список является пересечением двух списков. Вот Java-пример вызова метода List retainAll():

List list      = new ArrayList();
List otherList = new ArrayList();

String element1 = "element 1";
String element2 = "element 2";
String element3 = "element 3";
String element4 = "element 4";

list.add(element1);
list.add(element2);
list.add(element3);

otherList.add(element1);
otherList.add(element3);
otherList.add(element4);

list.retainAll(otherList);
  • Первые два списка созданы.
  • 3 элемента добавляются в list, а 3 элемента в otherList.
  • Метод retainAll() вызывается, передавая otherList в качестве параметра. После того, как list.retainAll(otherList) завершит выполнение, список будет содержать только те элементы, которые присутствовали как в list, так и otherList до вызова retainAll(). Более конкретно, это element1 и element3.

Что такое XDTO

Для начала, давайте определимся — что же это за зверь такой — XDTO?

Как я уже говорил, это сокращение от XML Data Transfer Objects, что по-русски означает “XML-объекты переноса данных”.

Оказывается, это не какой-то всемирно принятый стандарт, поддерживаемый платформой 1С. Наоборот, аббревиатура XDTO родилась в недрах фирмы 1С и представляет собой ее собственный креатив. Нигде, кроме как в сфере 1С, вы не встретите данного сочетания букв.

Зачем оно надо?

Мне не ведомы истинные мотивы создания целой подсистемы, но кажется, что основная цель — это создание простой объектной модели доступа к XML документам. Причем, под объектной моделью должно пониматься не абстрактное дерево узлов XML, а именно прикладные классы данных, полезные с точки зрения бизнес-логики..

И вот эти объекты должны участвовать в таких механизмах взаимодействия, где нужно передать с машины на машину удобный для использования объект. Как пример — объекты XDTO используются для обмена с веб-сервисами.

Что в итоге?

XDTO — это механизм, разработанный фирмой “1С” для обмена данными с другими программными системами посредством XML, позволяющий на уровне языка 1С оперировать не узлами XML, а прикладными понятиями “Сотрудник”, “Счет” и привычными встроенными типами (“ТаблицаЗначений”, “СправочникСсылка” и т.п.).

Краткое руководство по коллекциям

Задача Пример
Объявить Dim coll As Collection
Создать во время выполнения Set coll = New Collection
Объявить и создать Dim coll As New Collection
Добавить элемент coll.Add «Яблоко»
Доступ к элементу coll(1) or coll(2)
Элемент доступа добавлен в первый раз coll(1)
Доступ к элементу добавлен в последний раз coll(coll.Count)
Получить количество предметов coll.Count
Доступ ко всем предметам Dim i As LongFor i = 1 To coll.Count   Debug.Print coll(i) Next i
Доступ ко всем предметам (For Each) Dim fruit As VariantFor Each fruit In coll   Debug.Print fruit Next fruit
Удалить элемент coll.Remove(1)
Удалить все элементы Set coll = New Collection

Иммутабельные коллекции

Иммутабельные коллекции не входят в стандартную библиотеку классов (BCL). Для их использования нужно установить System.Collections.Immutable NuGet пакет.

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

Сами же коллекции можно поделить на несколько видов:

  • Mutable — обычные коллекции которые поддерживают изменения.
  • Immutable — коллекции, которые полностью запрещают изменения. Хотя на самом деле любое изменение иммутабельной коллекции приводит к созданию новой.
  • ReadOnly — обертки над стандартными коллекциями, которые не дают поменять данные. Из-за того что это всего лишь обертка мы можем поменять данные в оригинальной коллекции и ead only коллекция подтянет изменения.

Детальнее можно ознакомиться в статье: Read only, frozen, and immutable collections.

Начнем знакомство

Для начала, давайте обратимся к концепции XML документа, как такового. Как правило, документ содержит некоторую структурированную информацию, которую можно условно представить в виде набора объектов. Например, документ “СписокСотрудников.xml” содержит узел “Сотрудники”, внутри которого имеются элементы с типом “Сотрудник”.

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

Схема однозначно указывает, какие узлы и в каком порядке должны располагаться в документе. Кроме того, она представляет наборы узлов в виде функциональных типов данных, таких, как “Сотрудник”. Что еще более приятно — типы могут наследоваться и составлять иерархии типов.

А теперь, вспомним, зачем нужен XDTO — представление XML в виде объектов бизнес-логики. Если у нас будет набор бизнес-объектов, которые нужно передать по сети в виде XML, то мы можем создать XML-документ с помощью стандартного средства записи — объекта ЗаписьXML и поэлементно создать структуру, постаравшись ничего не напутать в структуре документа. Либо, мы можем создать XML-документ c помощью XDTO, используя более простой код:

Сотрудник.ФИО = “Иванов Иван Иванович”;Сотрудники.Добавить(Сотрудник);

Низкоуровневые вопросы формирования XML и размещения его в документе возьмет на себя платформа.

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

Вернемся к приведенному примеру кода. Видно, что есть некий объект сотрудник со свойством “ФИО”, которому присваивается строка. Далее этот сотрудник помещается в коллекцию. После записи коллекции, мы получим готовый XML документ, что явно проще, чем ручное создание элементов и атрибутов с помощью ЗаписьXML.

Закономерный вопрос — как платформа узнает о том, какие свойства есть у сотрудника и как его записывать в XML-файл? Ответ только один — из схемы XML документа. Платформа знает какие свойства могут быть у объекта, потому, что этот объект описан в схеме будущего документа. Закономерный вывод — XDTO без схемы документа работать не может. Система типов обязательно должна быть известна, только тогда мы сможем создавать объекты этих типов, присваивать им свойства, записывать и читать их из XML потока.

Теперь все вместе: Платформа позволяет оперировать фрагментами XML-документов, как обыкновенными объектами, к которым можно, например, обращаться “через точку”. При этом, сами объекты описываются в XML-схеме, и именно из нее платформа узнает — как выглядит тот или иной объект. То, как выглядит объект, называется типом. То есть, чтобы получить объект мы должны знать его тип.

Шаг 2. Выбрать тип NFT

После входа можно сразу приступить к созданию NFT. Нажмите «Create»:

  • Если вы хотите, чтобы токен был в единственном экземпляре, выбирайте «Single». Вы создадите токен стандарта ERC-721.
  • Чтобы у токена было несколько одинаковых копий, нужно нажать «Multiple». Вы создадите токен стандарта ERC-1155.


Два типа NFT: «Single» и «Multiple»

Оба процесса почти ничем не отличаются. В режиме «Multiple» будет всего на одну настройку больше.

Рекомендуем материал

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

Дети: childNodes, firstChild, lastChild

Здесь и далее мы будем использовать два принципиально разных термина:

  • Дочерние узлы (или дети) – элементы, которые являются непосредственными детьми узла. Другими словами, элементы, которые лежат непосредственно внутри данного. Например, и являются детьми элемента .
  • Потомки – все элементы, которые лежат внутри данного, включая детей, их детей и т.д.

В примере ниже детьми тега являются теги и (и несколько пустых текстовых узлов):

…А потомки – это и прямые дети , и вложенные в них: (потомок ) и (потомок ) – в общем, все элементы поддерева.

Коллекция содержит список всех детей, включая текстовые узлы.

Пример ниже последовательно выведет детей :

Обратим внимание на маленькую деталь. Если запустить пример выше, то последним будет выведен элемент

На самом деле, в документе есть ещё «какой-то HTML-код», но на момент выполнения скрипта браузер ещё до него не дошёл, поэтому скрипт не видит его.

Свойства и обеспечивают быстрый доступ к первому и последнему дочернему элементу.

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

Для проверки наличия дочерних узлов существует также специальная функция .

Как мы уже видели, похож на массив. На самом деле это не массив, а коллекция – особый перебираемый объект-псевдомассив.

И есть два важных следствия из этого:

  1. Для перебора коллекции мы можем использовать :

Это работает, потому что коллекция является перебираемым объектом (есть требуемый для этого метод ).

  1. Методы массивов не будут работать, потому что коллекция – это не массив:

Первый пункт – это хорошо для нас. Второй – бывает неудобен, но можно пережить. Если нам хочется использовать именно методы массива, то мы можем создать настоящий массив из коллекции, используя :

DOM-коллекции – только для чтения

DOM-коллекции, и даже более – все навигационные свойства, перечисленные в этой главе, доступны только для чтения.

Мы не можем заменить один дочерний узел на другой, просто написав .

Для изменения DOM требуются другие методы. Мы увидим их в следующей главе.

DOM-коллекции живые

Почти все DOM-коллекции, за небольшим исключением, живые. Другими словами, они отражают текущее состояние DOM.

Если мы сохраним ссылку на и добавим/удалим узлы в DOM, то они появятся в сохранённой коллекции автоматически.

Не используйте цикл для перебора коллекций

Коллекции перебираются циклом . Некоторые начинающие разработчики пытаются использовать для этого цикл .

Не делайте так. Цикл перебирает все перечисляемые свойства. А у коллекций есть некоторые «лишние», редко используемые свойства, которые обычно нам не нужны:

Определение

Пространство имен:
System.Collections.Generic
Сборка:
System.Collections.dll
Сборки:
mscorlib.dll, System.Collections.dll
Сборка:
mscorlib.dll
Сборка:
netstandard.dll

Важно!

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

Выполняет перечисление элементов коллекции List<T>.

Параметры типа

T
Наследование

Object
ValueType
List<T>.Enumerator

Атрибуты
Реализации

IEnumerator<T>

IEnumerator

IDisposable

Шаг 2. Создать коллекцию на OpenSea

Коллекции — это что-то вроде витрины, где мы группируем наши работы по темам. Пока здесь пусто. Чтобы создать коллекцию, нужно нажать «Create».

Страница «My Collection» пока пуста, потому что ни создано ни одной коллекции

При первом создании коллекции появится окно с просьбой прочитать и принять условия использования. Ставим галочку и снова подписываем операцию в открывшемся окошке кошелька

Далее OpenSea предложит выбрать логотип, название и описание для коллекции. Логотип и название — обязательные поля. Позже можно будет зайти в расширенные настройки и изменить эту информацию. Когда введем нужную информацию, нажимаем «Create».

Поля, которые нужно заполнить для создания коллекции

После того, как мы создадим коллекцию, сервис сразу предложит добавить предметы в нее предметы. То есть создать наш первый NFT. Именно это нам и нужно, поэтому нажимаем «Add Items». 

Тестирование POST-запросов

POST-запросы используются для отправки новых данных на сервер. Давайте попробуем с помощью POST-запроса добавить нового пользователя. Для этого мы отправим информацию о новом пользователе в теле POST-запроса.

  1. Задаем тип запроса — POST
  2. Задаем request URL — https://jsonplaceholder.typicode.com/users
  3. Нажимаем на вкладку Body, выбираем «Raw» — JSON. Вставляем данные о пользователе из сниппета ниже:
{
    "id": 11,
    "name": "Rajkumar SM",
    "username": "stm",
    "email": "[email protected]",
    "address": {
      "street": "Gagarina",
      "suite": "31",
      "city": "Moscow",
      "zipcode": "600007",
      "geo": {
        "lat": "10.0000",
        "lng": "80.0000"
      }
    },
    "phone": "1-2345-6-7890",
    "website": "testengineer.ru",
    "company": {
      "name": "testengineer.ru",
      "catchPhrase": "website for QA engineers",
      "bs": "real-time tutorials"
    }
}

После этого наживаем кнопку SEND и отправляем POST-запрос.

Примечание: для проверки корректности вашего json можно использовать Jsonformatter

  1. Вы увидите 201 Created message (как на скриншоте ниже), если запрос выполнился успешно.
  2. Данные, отправленные с помощью POST-запроса будут показаны во вкладке Body

Точно так же, как и POST, отправляются PUT, PATCH и DELETE запросы.

Примечание: во время тестирования, для каждого запроса проверяйте возвращаемый результат, код ответа сервера и время ответа сервера. И не забывайте про негативные тесты!

Запуск коллекций с помощью Newman

Для того, чтобы запустить коллекции с помощью Newman, делаем следующее:

Шаг 2: Открываем командную строку и выполняем команду

Шаг 3: После установки newman заходим в Postman. В списке коллекции находим нашу коллекцию, нажимаем на три точки и выбираем Export (Экспортировать)

Шаг 4: В появившемся окне выбираем «Export Collection as Collection 2.1 (Recommended)» и нажимаем Export.

Шаг 5: Выбираем папку, в которую экспортировать коллекцию и нажимаем Save. Рекомендуем создать отдельную папку для Postman-тестов. После нажатия на Save, коллекция будет экспортирована в выбранную папку.

Шаг 6: Для корректного запуска нам понадобится экспортировать и окружение. Для этого нажимаем на кнопку с глазом и выбираем опцию Download as JSON. Выбираем папку, в которую экспортировать окружение и нажимаем Save. Рекомендуем экспортировать окружение в ту же папку, в которую была экспортирована коллекция.

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

Например:

Шаг 8: Запускаем коллекцию с помощью команды:

После выполнения коллекции, появятся результаты выполнения тестов.

Заключение

Коллекции — очень полезная часть VBA. Их гораздо проще использовать, чем массивы, и они очень полезны, когда вы много добавляете и удаляете элементы. У них есть только четыре свойства: Add, Remove, Count и Item . Поэтому они очень просты в освоении.

 Основные пункты этой статьи:

  1. Коллекции — это способ хранения группы элементов вместе.
  2. VBA имеет свои собственные коллекции, такие как Workbooks, Worksheets и Cells .
  3. Элементы не обязательно должны быть одного типа, но обычно одного. Коллекция VBA Sheets может содержать как листы, так и листы диаграмм.
  4. Коллекция позволяет легко выполнять одну и ту же задачу для нескольких элементов, например, распечатать все значения.
  5. Коллекции похожи на массивы, поскольку в них хранятся группы похожих элементов.
  6. Коллекции лучше при добавлении и удалении большого количества элементов.
  7. Коллекции проще в использовании, чем массивы.
  8. Массивы более полезны, когда количество элементов фиксировано.
  9. Массивы более эффективны при .
  10. Базовые типы данных (т.е. не-объекты) в коллекции доступны только для чтения, а массивы — для чтения / записи.
  11. Вы можете создать коллекцию, используя только Dim или Dim с помощью Set.
  12. Вы можете удалить всю коллекцию, установив для нее значение Nothing. Но зависит от того, как она была создана.
  13. Вы можете добавлять элементы в определенную позицию в коллекции, используя аргументы «Before» и «After» с помощью функции Add.
  14. Вы можете использовать ключи с коллекцией для прямого доступа к элементу. Коллекции не имеют хорошей поддержки ключей, поэтому обычно лучше использовать коллекцию Dictionary, когда вам нужно использовать ключи.
  15. Вы можете использовать циклы For и For Each для доступа ко всем элементам в коллекции. Цикл For Each более эффективен, но позволяет просматривать коллекцию только в одном порядке.
  16. Вы можете легко передать коллекцию в качестве аргумента в функцию или подпрограмму.
  17. Вы можете легко вернуть коллекцию из функции.
Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: