Введение 4
1 Особенности процедурно-параметрической парадигмы программирования 8
2 Моделирование процедурно-параметрического стиля для простых ситуаций расширения программ 12
2.1 Расширение обобщения добавлением новой специализации 13
2.2 Добавление новой процедуры, обеспечивающей дополнительную функциональность 14
2.3 Добавление новых полей данных в существующие типы и изменение в соответствии с этим процедур 16
2.4 Добавление процедуры, предназначенной для обработки конкретных специализаций внутри обобщений 17
2.5 Добавление процедуры, осуществляющей выборочный вывод из контейнера 18
2.6 Добавление мультиметодов 19
2.7 Изменение мультиметодов при добавлении специализаций 20
3 Реализация паттернов с применением процедурно-параметрического стиля..21
3.1 Паттерн «Фасад» 21
3.2 Паттерн «Адаптер» 22
3.3 Паттерн «Декоратор» 23
3.4 Паттерн «Прокси» 23
3.5 Паттерн «Компоновщик» 24
3.6 Паттерн «Итератор» 26
3.7 Паттерн «Приспособленец» 27
3.8 Паттерн «Фабричный метод» 28
3.9 Паттерн «Прототип» 29
4 Библиотека макроопределений 30
5 Сравнение объема кода с применением макробиблиотеки и без нее 34
Заключение 36
Список использованных источников 37
Приложение
В настоящее время существуют различные подходы к написанию компьютерных программ, определяемые как парадигмы программирования. Каждый из них определяет свой понятийный аппарат, инструменты, стиль формирования конструкций, написания кода, правила выполнения задач, которые программист ставит во время создания программы. Безусловно, можно подойти к определению парадигм, как философии мышления в программировании, но более оправданным следует считать их одним из инструментов, грамотное использование которых может повысить скорость и эффективность разработки.
Важным чертой современных языков программирования является то, что почти все из них являются мультипарадигменными. В связи с этим сделать однозначный вывод об эффективности той или иной парадигмы на основе высокой популярности языка не представляется возможным. Помимо этого, особенность любой парадигмы в том, что каждая из них позволяет наиболее эффективно решать лишь часть возникающих перед программистом задач. Поэтому изучение различных подходов к программированию достойно внимания.
Одной из достаточно молодых, но перспективных является процедурно-параметрическая (ПП) парадигма [1,2]. В ее основе лежит параметрический полиморфизм, позволяющий процедурам принимать и обрабатывать вариантные типы данных, без алгоритмического выбора альтернатив внутри этих процедур. Алгоритмическая обработка вариантов осуществляется с применением условных операторов или переключателей. Данный подход является развитием методов процедурного программирования и служит альтернативой объектно-ориентированному программированию.
Первым реальным воплощением ПП парадигмы стал язык программирования O2M, являющийся непосредственным расширением языка Оберон-2 [3]. В нем сохраняется поддержка объектно-ориентированного стиля предшественника, но наряду с конструкциями данной парадигмы в нем реализованы дополнительные абстракции, поддерживающие процедурно-параметрическую парадигму.
Другой, более узкоспециализированной ветвью развития ПП парадигмы стала разработка экспериментального языка Alien [4] с синтаксисом, аналогичным синтаксису языка Оберон-2 и поддерживающим только процедурную парадигму. Поддержка ППП реализована путем добавления в процедурный язык конструкций, ориентированных на эволюционное [5] расширение типов данных и процедур.
В ходе работы с данными языками можно на практике ознакомиться с основными идеями ПП-парадигмы и развивать исследование параметрического подхода в различных направлениях. Помимо этого, предложены подходы написания ПП программ на традиционных языках программирования [1, 6]. Вместе с тем эффективность написания ПП программ с применением традиционных мультипарадигменных языков можно было бы повысить, если использовать дополнительную инструментальную поддержку с использованием метакомпиляторов или библиотек макроопределений и шаблонов.
Применение метакомпиляторов требует дополнительных усилий, сопоставимых с разработкой трансляторов средней сложности. Помимо этого, целесообразнее использовать их в связке с библиотеками макроопределений и шаблонов, ускоряющих генерацию нужных фрагментов кода (как в Qt [7]).
Наиболее быстрым для реализации и при этом достаточно эффективным подходом является использование библиотек макроопределений и шаблонов, формирующих для программистов дополнительную инструментальную прослойку. Ее применение позволяет повысить эффективность использования процедурно-параметрического стиля при написании кода на традиционных мультипарадигменных языках. Помимо этого, данную библиотеку можно использовать при построении генераторов кода как для метакомпиляторов, так и для экспериментальных компиляторов процедурно-параметрических языков программирования. В связи с этим задача создания макробиблиотеки, обеспечивающей поддержку процедурно-параметрического стиля, является актуальной.
Целью данной работы является разработка библиотеки макросов, благодаря которой можно будет разрабатывать многомодульные, эволюционно¬расширяемые программы на основе процедурно-параметрической парадигмы.
Для достижения поставленной цели в работе решались следующие задачи:
• провести изучение особенностей процедурно-параметрической парадигмы, рассмотрены особенности реализации ее основных конструкций на языке программирования C++;
• проанализировать подходы к построению процедурно-параметрических программ на языке программирования C++, рассмотрены возможности подхода при реализации различных элементарных вариантов расширения уже созданного кода;
• исследовать особенности использования процедурно-параметрического подхода при реализации традиционных паттернов ОО проектирования;
• на основе анализа кода, формируемого при реализации различных ситуаций, предложить макросы, включенные в состав библиотеки;
• провести перепроектирование примеров эволюционного расширения кода с применением разработанной библиотеки;
• сделать сравнительные оценки ранее написанного кода с кодом, использующим библиотеку макроопределений.
Результатом выполнения выпускной квалификационной работы является кроссплатформенная библиотека макроопределений, написанная на C++ и предназначенная для подключения к C++ проектам, проектирующимся в соответствии с процедурно-параметрической парадигмой.
В первом разделе рассматриваются основные особенности ППП. Анализируются способы реализации ПП конструкций на языке программирования C++.
Второй раздел посвящен описанию использования процедурно-параметрических конструкций библиотеки на Примерах элементарного эволюционного расширения в различных направлениях. Приводится сравнение с возможностями расширения при процедурном и ОО программировании.
В третьем разделе рассматриваются особенности использования ПП стиля для реализации классических паттернов проектирования. Показано, как применение данного подхода позволяет избавиться от ряда недостатков, существующих при использовании паттернов.
В четвертом разделе предлагаются библиотека макроопределений, несколько комментариев к ней, а также примеры использования.
В пятом разделе приводится сравнительный анализ программ, написанных в процедурно-параметрическом стиле, как с библиотекой, так и без нее.
В рамках выпускной квалификационной работы создана библиотека макросов, позволяющая повысить эффективно процедурно-параметрической парадигмы при разработке программ на С++.
В ходе решения поставленных задач были получены следующие результаты:
• Использование ПП стиля при программировании на мультипарадигменном языке показало возможность реализации ПП конструкций и повышение гибкости при эволюционном расширении программ по сравнению с процедурным и ОО подходами;
• При использовании ПП подхода для реализации ОО паттернов проектирования большинство ситуаций описывается добавлением или удалением процедурно-параметрических конструкций по достаточно простым типовым схемам, что позволяет больше внимания уделять технике программирования, а не изучению паттернов;
• Применение макроопределений позволяет повысить эффективность использования ПП стиля при программировании на современных мультипарадигменных языках;
1. Процедурно-параметрическая парадигма программирования. Возможна ли альтернатива объектно-ориентированному стилю? [Электронный ресурс] : описание процедурно-параметрической парадигмы. — Режим доступа: http://www.softcraft.ru/ppp/pppfirst/pppfirst.pdf
2. Легалов, А. И. Процедурно-параметрическое программирование. / А. И. Легалов // Проблемы информатизации региона. ПИР-99: Сб. научных трудов пятой Всероссийской научно-практической конференции. Красноярск. КГТУ. - 1999. - С. 13-27.
3. Язык программирования О2М [Электронный ресурс] : документация языка O2M. - Режим доступа: http://www.softcraft.ru/ppp/o2m/o2mref.pdf/
4. Особенности языка процедурно-параметрического программирования
[Электронный ресурс] : описание языка процедурно-параметрического программирования Alien. - Режим доступа:
http://www.softcraft.ru/ppp/pppspecific/pppspecific.pdf
5. Легалов, А. И. Расширение модульной структуры программы за счет подключаемых модулей / А. И. Легалов, А. Я. Бовкун, И. А. Легалов // Доклады Академии наук высшей школы России, № 1 (14). - 2010. - С. 114-125.
6. Процедурно-параметрическое программирование [Электронный
ресурс] : описание использования ПП-парадигмы на примере языка программирования C++. - Режим доступа:
http://www.softcraft.ru/paradigm/ppp/ppp01.shtml
7. Использование мета-объектного компилятора (Meta-Object Compiler, moc) [Электронный ресурс] : обзор мета-объектного компилятора Qt. - Режим доступа: http://www.doc.crossplatform.ru/qt/4.6.x/moc.html
8. Легалов, А.И. Технология программирования. Процедурная и объектно¬ориентированная парадигмы. Метод. указания по выполнению лабораторной работы № 1. / Красноярск: ИПЦ КГТУ, 2006. - 43 с.
9. Легалов, А.И. Эволюционное расширение программ при различных парадигмах программирования. / А. И. Легалов, И. А. Легалов, А. Ф. Солоха // Труды XVI Байкальской Всероссийской конференции «Информационные и математические технологии в науке и управлении». Часть III. - Иркутск: ИСЭМ СО РАН, 2011. ISBN 978-5-93908-094-1. - С. 42-49.
10. Легалов, А.И. Разнорукое программирование [Электронный ресурс] /
А.И. Легалов // 2001. - Режим доступа:
http://www.softcraft.ru/paradigm/dhp/index.shtml (дата обращения: 01.05.2016)
11. Гамма, Э. Приемы объектно-ориентированного пректирования. Пат¬терны проектирования: пер. с англ. / Э. Гамма, Р. Хелм, Р. Джонсон, Д. Влис- сидес; пер. А. Слинкин. Санкт-Петербург: Питер, 2001. - 368 с.
12. Фримен, Э. Паттерны проектирования: пер. с англ. / Э. Фримен, Э.
Фримен, К. Сьерра, Б. Бейтс. Санкт-Петербург.: Питер, 2012. - 656 с.