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

Отправная точка
Программирование
Windows API
Автоматы
Нейроинформатика
Парадигмы
Параллелизм
Проектирование
Теория
Техника кодирования
Трансляторы
Прочие вопросы

Разное

Беллетристика
Брюзжалки
Цели и задачи
Об авторе


Расширение модульной структуры программы за счет подключаемых модулей


[Возврат на основную страницу раздела]


© 2010 г.
Легалов Александр Иванович
Бовкун Александр Яковлевич
Легалов Игорь Александрович

Статья первоначально опубликована в журнале "Доклады Академии наук высшей школы Российской федерации" и имеет следующие выходные данные:
Легалов А.И., Бовкун А.Я., Легалов И.А. Расширение модульной структуры программы за счет подключаемых модулей. / Доклады АН ВШ РФ, № 1 (14). – 2010. – С. 114-125.

Полностью материал доступен в формате pdf (~313 кб)

Аннотация

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

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

Преамбула

Эволюционная разработка больших программных систем приобретает все большую популярность. Это обусловлено различными факторами, связанными с развитием информационных технологий:

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

Существуют различные методы организации кода, обеспечивающие поддержку эволюционного расширения и базирующиеся на использовании таких абстракций данных как классы [1], расширяемые типы данных [2], обобщенные записи [3]. Их применение в совокупности с динамическим связыванием, использующим наследование и полиморфизм, позволяет создавать сложные, эволюционно расширяемые структуры [4]. Вместе с тем, поддержка эволюционной разработки также обеспечивается и модульной структурой, широко применяемой при создании больших программных систем.

Модуль представляет собой функционально законченный фрагмент программы, оформленный в виде отдельного файла с исходным кодом или поименованной непрерывной его части [5], предназначенной для использования в других программах. Существуют разные подходы к организации модульной структуры программы. В ряде случаев используется жесткая концепция модульного программирования [6], нашедшая отражение в таких языках как Оберон-2 [7], Component Pascal [8], Python [9]. Во многих языках программирования модульная структура выстраивается произвольно, что объясняется видением соответствующих конструкций в качестве ограничителей пространств имен и единиц компиляции, а не средств для объединения программных объектов в функционально законченные компоненты. К таким языкам относятся C++ [10], C# [11]. В ряде языков логические модули отдельно не выделяются. Их роль выполняют физические единицы компиляции, как в языке C, или языковые конструкции, например, классы в Java [12].

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

Вместе с тем, модульное программирование, опирающееся на концепцию логического модуля, ограниченного физической единицей компиляции, не теряет своей популярности. Оно широко используется при программировании не только на компилируемых, но и интерпретируемых языках, например, Python [9]. Популярность обуславливается простотой формирования программы из законченных логических единиц, для объединения которых не требуется дополнительных компоновщиков. Это позволяет легко реализовать как статическую, так и динамическую сборку программы, а также повторно использовать модули при создании новых программ.

Однако у такого подхода имеются и недостатки, связанные с невозможностью безболезненного наращивания. При расширении функциональности зачастую приходится изменять уже написанные модули. Существует ряд методов, направленных на решение этой проблемы. В частности, в работе [13] предложено использовать механизм встраивания. Он обеспечивает создание новых модулей на основе наследования с переопределением имеющихся процедур и типов. Встраивание полезно, когда модули и классы используются в комбинации и необходимо их совместное расширение, или когда модули являются более подходящей средой, чем классы. Подход обеспечивает модификацию процедур и данных встраиваемого модуля, что позволяет эволюционно наращивать и изменять код. Однако данный прием требует указания встраиваемого модуля в клиентской части программы, что ведет к модификации последней и не способствует полной поддержке эволюционного расширения.

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

Основные разделы

  1. Введение
  2. Подключаемые модули
  3. Особенности использования подключаемых модулей
  4. Реализация подключаемых модулей
  5. Связывание модулей в единый проект
  6. Заключение

Список литературы

  1. Бадд Т. Объектно-ориентированное программирование в действии. / Т. Бадд – СПб.: Питер. – 1997. – 464 с.
  2. Вирт Н. Алгоритмы и структуры данных. Новая версия для Оберона. Пер. с англ. / Н. Вирт – М.: ДМК-Пресс, 2010. – 272 с.
  3. Легалов И. А. Применение обобщенных записей в процедурно-параметрическом языке программирования. / И.А. Легалов // Научный вестник НГТУ. – 2007. – № 3 (28). – С. 25-38.
  4. Гамма Э. Приемы объектно-ориентированного проектирования. Паттерны проектирования. Пер. с англ. / Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес – СПб: Питер, 2007. – 366 с.
  5. Модуль (программирование). Материал из Википедии – свободной энциклопедии [Электронный ресурс] – Режим доступа: http://ru.wikipedia.org/wiki/Модуль_(программирование). – Загл. с экрана.
  6. Grogono P. Why One Source File Is Better Than Two. / P. Grogono // SEA 2000 – Software Engineering and Applications (Las Vegas, Nevada, USA, November 2000), (Proceedings of the LASTED International Conference). – ACTA Press. – 2000. – pp. 243 – 249.
  7. Moessenboeck H. The Programming Language Oberon-2. [Электронный ресурс] / H. Moessenboeck, N. Wirth // Institut fur Computersysteme, ETH Zurich July. – 1996. – Режим доступа: http://www-vs.informatik.uni-ulm.de:81/projekte/Oberon-2.Report/Oberon2-Report.ps. – Загл. с экрана.
  8. BlackBox. [Электронный ресурс] – Режим доступа: http://www.oberon.ch/blackbox.html. – Загл. с экрана.
  9. Саммерфильд М. Программирование на Python 3. Подробное руководство. Пер. с англ. / М. Саммерфильд – Спб.: Символ-Плюс. – 2009. 608 с.
  10. Страуструп Б. Язык программирования C++. Третье издание. Пер. с англ. / Б. Страуструп – СПб.; М.: "Невский диалект" – "Издательство БИНОМ", 1999. – 991 с.
  11. Троелсен Э. С. C# и платформа .NET. Библиотека программиста. Пер. с англ. / Э.С. Троелсен – СПб.: Питер, 2003. – 800 с.
  12. Нортон П. Программирование на Java. Руководство П.Нортона (в 2-х томах). Пер. с англ. / П. Нортон – "СК-Пресс", 1998 – 900 с.
  13. Radensky A. Module embedding. [Электронный ресурс] / A. Radensky – Режим доступа: http://www1.chapman.edu/~radenski/research/papers/module.pdf. – Загл. с экрана.
  14. Легалов А. И. Процедурный язык с поддержкой эволюционного проектирования. / А.И. Легалов, Д.А. Швец // Научный вестник НГТУ. – 2003. – № 2 (15). – С. 25-38.
  15. Легалов А.И. Процедурно-параметрическая парадигма программирования. Возможна ли альтернатива объектно-ориентированному стилю? / А.И. Легалов – Красноярск: 2000. Деп. рук. № 622-В00 Деп. в ВИНИТИ 13.03.2000. – 43 с.
  16. Павлов В. Аспектно-ориентированное программирование [Электронный ресурс] // В. Павлов – Режим доступа: http://www.javable.com/columns/aop/workshop/01/. – Загл. с экрана.


[Возврат на основную страницу раздела]