Итератор (Iterator)

Метафора

 

Все помнят школьное «на первый второй рассчитайся!»? Вот именно в этот момент шеренга вашего класса и являлась реализацией паттерна «итератор», хотя в программировании это конечно более функциональное понятие, но суть примерно та же. «Итератор» предоставляет правила доступа к списку каких-либо объектов независимо от того, что это за объекты. То есть не важно, какой именно класс построен и из каких учеников, должны быть общие правила подсчета и обращения как каждому ученику по списку, вроде «13-ый, выйти из строя». Ссылки, которые вы видите на многих сайтах для переходов по страницам, вроде «следующая», «предыдущая», «в начало» и т.п. по своей сути также являются доступом «итератору» который отвечает за страницы сайта.

 

Назначение

 

Паттерн предоставляет способ последовательного доступа ко всем элементам составного объекта, не раскрывая его внутреннего представления. Итератор предоставляет абстрактный интерфейс для доступа к содержимому составных объектов, не раскрывая клиентам их внутреннюю структуру.

Преимущества:

  • Поддерживает различные способы перебора агрегата, одновременно могут быть активны несколько переборов.

 

Диаграмма

 

Итератор

Итератор

 

Клиент работает с абстрактным интерфейсом итератора, реализацию которого, получает от конкретного составного объекта. Конкретный итератор следит за текущей позицией в конкретном агрегате.

 

Пример

 

В данном примере мы сделали простейший итератор по таблице из объекта lcl_aggregate. Последовательность доступа к таблице относительно текущей позиции в итераторе.

Итераторы широко используются в библиотеках работы с XML, например, в iXML для обхода DOM:

Еще один пример итератора из стандарта — cl_object_collection:

 

  • Михаил, я правильно понимаю, что в реальной жизни create_iterator() из первого примера должен принимать на вход какой-либо параметр, в зависимости от которого будет возвращаться экземпляр того или иного итератора? Просто в данном примере для краткости ты создаешь его один?
    И еще, не противоречит ли возвращение именно значения строки из итератора, а не ссылки на нее (это я про first(), next() и current()?
    А вообще по факту в ABAP, можно сказать, используется паттерн итератор в виде вторичных ключей внутренних таблиц…

    • Привет! Суть тут не столько во множестве разных реализаций итераторов, сколько в универсальном обходе некоторого составного объекта. В примере же, возвращается строка таблицы исключительно ради простоты восприятия. Обычно под составными объектом понимают объект, состоящий из множества других объектов (как в следующем примере с xml узлом).

      • Угу, понял. Почему-то думал, что основное направление именно работа со структурированными данными. Что-то вроде: создаешь несколько итераторов с разными критериями сортировки и затем пользуешься. Я просто больше на примерах списков различных для web его смотрел…
        Кстати, как же все таки лаконично смотрится код на 7.40 (: