Итераторы на Летних Играх

Ed "Scripting Guy" Wilson был столь любезен, что попросил меня быть приглашенным комментатором на Летних Играх по Скриптингу этого года, которые только что завершились.

Я работал над серией постов для этого блога про некоторые необычные случаи в дизайне «блока итератора» в C# 2.0; этот фрагмент из моих комментариев непосредственно к этой серии относится. Сериал про итераторы продлится, вероятно, весь июль.

Задачей для десятого дня игр по скриптингу было написание скрипта, который меняет приоритет каждого нового процесса с определённым именем.

************

Есть странная штука, которую узнаешь, работает над инструментами для разработчиков: люди, которые проектируют и строят инструменты зачастую не являются экспертами по применению этих инструментов в реальном мире. Я могу рассказать вам всё, что угодно, про парсер VBScript, или генератор кода, или библиотеку времени выполнения, но я не эксперт в написании настоящих скриптов для решения реальных задач. Вот почему я был сразу и заинтригован, и немного обеспокоен, когда Scripting Guys добрались до меня и спросили, не хочу ли я быть приглашенным комментатором на Летних Играх по Скриптингу 2009.

Я написал этот скрипт тем же способом, каким большинство программистов решают техническую задачу, решение которой им заранее неизвестно - я поискал в интернете ключевые слова из предметной области, чтобы посмотреть, что можно найти. Конечно, я уже знал про нашу документацию на MSDN, у меня было (весьма) поверхностное понимание WMI, и я знал, что у Scripting Guys есть массовый репозиторий полезных скриптов.

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

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

Коллекция обычно использует «пассивную» модель – потребитель по мере необходимости запрашивает элементы из коллекции по одному, и вызов завершается, когда элемент доступен. События обычно работают в «активной» модели – потребитель регистрирует метод, который вызывается всякий раз, как срабатывает событие. Но необязательно; провайдер WMI реализует события в «пассивной» модели. Событие реализуется как коллекция «объектов-событий». Его можно опрашивать, как и любую коллекцию. Запрос следующего события, подходящего под условие, просто блокируется, пока событие не произойдёт.

Аналогично, итераторы коллекций могут быть реализованы в «активной» модели. Они могут вызывать метод для каждого, доступного в коллекции элемента. Следующая версия CLR, вероятно, будет включать стандартные интерфейсы, представляющие «наблюдаемые коллекции», то, есть, коллекции, которые «запихивают» вам данные так же, как это делают события. Возможность трактовать события как коллекции и коллекции как события может приводить к некоторым интересным и мощным приёмам программирования.

************

Остаток решения и анализа – здесь.

Приятных выходных!

оригинал статьи