Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Contingent: Динамическая система сборки

Оригинал: Contingent: A Fully Dynamic Build System
Авторы: Brandon Rhodes, Daniel Rocco
Дата публикации: July 12, 2016
Перевод: Н.Ромоданов
Дата перевода: январь 2017 г.

Заключение

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

Но когда система Contingent используется при программировании на языке Python, мы пропускаем десятки возможных классов, таких как TaskArgument (аргумент задачи), CachedResult (результат кэширования) или ConsequenceList (список последовательности вызовов задач). Вместо этого мы опираемся на устойчивые традиции в языке Python решать общие проблемы при помощи обобщенных структур данных, в результате этого в коде, который используется многократно, применяется небольшой набор конструкций — кортеж, список, множество и словарь.

Но разве из-за этого не возникает проблем?

Обобщенные структуры данных также являются, по своей природе, анонимными. Наш кэш project._cache представляет собой множество. А каждый набор данных, который уже обработан или должен быть обработан, находится в графе Graph. А не опасно ли увидеть сообщение об ошибке, выдаваемое обобщенной конструкцией set, и не знать, где в проекте или в графе реализации эта ошибка возникла?

На самом деле, никакой опасности нет!

Благодаря тщательной дисциплине инкапсуляции - в коде Graph реализованы только те множества, которые касаются графа зависимостей, а коде Project только, что касается проекта - никогда не возникнет неоднозначности в случае, операция со множеством возвратит ошибку на следующем этапе проекта. Имя самого внутреннего исполняемого метода в момент ошибки обязательно нам точно укажет класс и множество, на котором возникла ошибка. До тех пор, пока мы следуем строгим правилам использовать символ подчеркивания перед атрибутами структур данных, а затем стараемся не использовать их в коде вне класса, нам не потребуется для каждого возможного применения типа данных создавать подкласс класса set.

В системе Contingent продемонстрировано, насколько важен шаблон Facade (Фасад), описанный в эпохальной книге Design Patterns, для хорошо спроектированной программы на языке Python. В программе на языке Python не каждой структуры или фрагмента данных создается свой собственный класс. Вместо этого классы используются экономно в виде связующих кода, а концептуальная идея, например, граф зависимостей, может быть реализована в виде фасада, скрывающая детали работы с простыми обобщенными структурами данных.

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

Перейти к началу статьи.