Шаблон проектирования Iterator

Итератор — паттерн поведения объектов.

Предоставляет способ последовательного доступа ко всем элементам составного объекта, не раскрывая его внутреннего представления. Известен также под именем Cursor (курсор).

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

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

 

Пример итератора для Perl

Perl имеет отличные встроенные возможности для работы со списками, массивами, хешами и соответствующими объектами.

Большинство программистов даже не замечают, что используют итераторы постоянно. Например, используя foreach для поэлементной обработки массива. При этом, всегда можно перейти к обработке следующего элемента (next), остановить итеративный цикл (last), повторно обработать текущий элемент (redo).

Доступны операторы for, foreach, ++, регулярные выражения, <> для последовательного чтения строк в файле, map, и пр. — все они так или иначе реализуют идею итератора.

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

Например, специальные итераторы активно используются при работе с DBI:

С помощью метода fetchrow_hashref происходит извлечение следующей строки из выполненной выборки в таблицах БД. Процесс извлечения записей можно прервать в любой момент, инициировав выход из цикла while.

 

Простой пример реализации итератора

Итератор возвращает следующий элемент массива. Когда элементов больше не остается, возвращает undef.

Реализация итератора:

Использование итератора:

 

Полезные ссылки

The Iterator Design Pattern (pdf)

perldesignpatterns.com: Iterator Interface

perl.com: Perl Design Patterns

houseabsolute.com: Patterns in Perl. Iterator

Шаблон проектирования Iterator: 1 комментарий

  1. Natalie Автор записи

    Нашла в интернете интересный пример очень простого представления итератора в Perl. Shift в качестве итератора:

Комментарии запрещены.