Страницы

Поиск по вопросам

вторник, 26 ноября 2019 г.

Зачем нужен паттерн “итератор”?


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


Ответы

Ответ 1



Итератор это "не пользовательские коллекции", а инструмент обхода этой коллекци и не только коллекции, а вообще всего, что можно последовательно перебрать по какому то алгоритму. Обход коллекции всего лишь частный случай. Алгоритм перебора скрыт внутри итератора, что позволяет иметь отдельно сам объект данных и много итераторов с разными алгоритмами обхода (SRP) То есть итератор - класс инкапсулирующий в себе какой алгоритм обхода данных со стандартизированным интерфейсом "перечислитель"

Ответ 2



Итератор абстрагирует от вас не только саму коллекцию, но и состояние её обхода Например, для массива это текущий индекс, для структур, основанных на дереве, это текущи узел, и так далее. Без итераторов вам пришлось бы для каждой коллекции знать, как именно её обходить, и иметь доступ к её внутренним структурам (например, sorted set, основанный на дереве, обычно не выставляет свои узлы в публичный доступ). Зачем нужны пользовательские коллекции? Очень просто: стандартные не всегда умею то, что вам нужно. Например, если вы хотите смоделировать взаимно-однозначное соответствие (то есть типа Dictionary, но чтобы можно было также по значению быстро находить ключ), вам придётся писать свою коллекцию.

Комментариев нет:

Отправить комментарий