SoftCraft
разноликое программирование

Top.Mail.Ru

Процедурно-параметрическая парадигма и паттерны ОО проектирования

© 2025
Александр Легалов


Содержание


Общие рассуждения

Паттерны или образцы ОО проектирования нашли широкое применение благодаря использованию гибких композиций из классов и объектов. Их количество, начавшись первоначально набором из 23 образцов (см. рисунок), представленных "Бандой четырех" (Gang of Four, GoF) [gof-patternsГамма Э., Хелм Р., Джонсон Р., Влиссидес Дж. Паттерны объектно-ориентированного проектирования. - СПб.: Питер, 2020. - 448 с.], впоследствии разрослись до "неимоверных размеров".

ОО паттерны проектирования и отношения между ними по GoF

Рисунок 1 - ОО паттерны проектирования и отношения между ними по GoF

Движение паттернов, помимо ОО разработки, захватило различные и другие парадигмы. Они также появились и в областях, связанных с архитектурой ПО. Основной акцент в ОО паттернах проектирования был сделан на повторное использование композиций программных объектов, их надежность, эволюционную расширяемость.

Не обошлось при этом и без критики процедурного программирования, при котором прямые решения оказались менее гибкими и надежными. Также изменились взгляды и на ОО подход. Акцент с "естественного отображения реального мира" объектами [BaddБадд, Т. Объектно-ориентированное программирование в действии. Пер. с англ. - СПб.: Питер паблишинг, 1997. - 460 с.] сместился на достижение требуемых критериев качества за счет наследования интерфейсов.

Что такое интерфейс с точки зрения ООП? Это сгруппированный воедино набор объявлений методов, который в дальнейшем может тиражироваться и, тем самым, использоваться в качестве точек входа для различных реализаций этих методов в разных классах. Он является зафиксированным, а любые изменения ведут к появлению вместо него нового интерфейса. То есть, интерфейс желательно спроектировать единожды и впоследствии только использовать для реализаций. Реализация ОО интерфейса осуществляется для всех представленных в нем методов и жестко ограничена их номенклатурой. Достоинством ОО интерфейсов при этом является возможность формирования множества реализаций методов, что обеспечивает поддержку полиморфизма.

Интерфейсом в процедурном и процедурно-параметрическом программировании может служить совокупность прототипов любых функций, группируемых совершенно произвольно. Одни и те же прототипы могут образовывать различные группы в зависимости от того, каким клиентам нужна та или иная функциональность. Например, простейшие изолированные группы интерфейсов реализуются посредством заголовочных файлов в языке программирования C. Недостатком процедурного подхода является то, что обычная функция может иметь только одну реализацию, что, в отличие от ОО методов, не позволяет реализовать полиморфизм. При процедурно-параметрическом подходе обобщенные функции обеспечивают реализацию для множества обработчиков специализаций. Поэтому использование прототипов обобщенных функций позволяет строить интерфейсы более гибко и с использованием ПП полиморфизма. Это, в свою очередь обеспечивает более гибкие возможности при проектировании интерфейсов.

Подобная гибкость позволяет достаточно просто осуществить формирование нужного унифицированного интерфейса в языке PPC (Procedural-Parametric C) путем прямой сборки в необходимый заголовочный файл. При необходимости можно скрыть прототипы собираемых функций путем вызова их в функциях, формирующих внешнюю оболочку.

Расширение возможностей процедурного программирования за счет использования процедурно-параметрической парадигмы дает повод посмотреть не только на элементарные ситуации расширения программ, но и на то, каким образом предлагаемый подход отобразится на более сложные композиции программных объектов, включая и паттерны ОО проектирования. Ниже рассматриваются возможные варианты имитации ОО образцов с использованием процедурно-параметрических конструкций. Примеры кода приведены с применением PPC. Одной из задач имитации ставится демонстрация того, что в большинстве случаев разнообразные ОО паттерны проектирования трансформируются в унифицированные и достаточно однотипные решения при использовании процедурно-параметрического подхода.

Помимо этого есть стремление показать: если немного поработать напильником над процедурными, а возможно и функциональными, языками программирования, включив в них механизм поддержки процедурно-параметического полиморфизма, то многие вопросы по композиции программных объектов, являющиеся танцами с бубнами в ООП, отпадут сами собой.

Порядок рассмотрения отличается от описания в книге и связан как с субъективным восприятием сложности конструкций образцов, так и с тем, в какой мере в них используется динамический полиморфизм. Предполагается сформировать описание от более очевидных по структуре вариантов к более сложным схемам. При этом паттерны ОО проектирования (возможно, их упрощенные схемы) предполагается описывать на языке C++. Описание паттернов разбито на две группы. В первую включены те из них, которые используют динамический полиморфизм. К ним следует отнести:

  • Фабричный метод (Factory Method);
  • Абстрактная фабрика (Abstract Factory);
  • Строитель (Builder);
  • Прототип (Prototype);
  • Декоратор (Decorator);
  • Посетитель (Visitor);
  • ...

Во второй группе рассматриваются паттерны, при построении которых не используется динамический полиморфизм. В целом они не относятся к рассматриваемой тематики. Однако присутствуют для демонстрации того, что тоже могут быть реализованы с использованием как процедурно-параметрического, так и, возможно, процедурного подходов. К таким образцам можно отнести:

  • Одиночку (Singleton);
  • Фасад (Facade);
  • ...

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

Демонстрационный пример

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

Исходные тексты программ, рассматриваемых в описании размещаются в в данном архиве. Помимо этого они также расмещены на Гитхаб в каталоге: animals-patterns. В репозитории на Гитхаб также собираются различные другие примеры, при написании которых используется процедурно-параметрическая парадигма программирования на языке PPC, являющимся расширением языка программирования C. Описание расширений языка C, обеспечивающих поддержку 4П, можно посмотреть здесь. Компилятор языка размещен в открытом доступе в репозитории на gitverse. Также некоторые эволюционные "издевательства над животными", при котором не пострадал ни один ранее написанный код, за исключением тестового примера, представлены на видео.


Содержание