[Возврат на основную страницу раздела]
© 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]. Помимо того, что универсальное размещение процедурно-параметрических конструкций в произвольных модулях затрудняет их идентификацию и ведет к дроблению программы на слишком мелкие модули, снижается надежность программирования за счет неконтролируемого использования ссылок на обобщающий тип. Стремление повысить надежность эволюционной разработки при использовании модульного программирования ведет к необходимости поиска более гибких решений.
Основные разделы
-
Введение
-
Подключаемые модули
-
Особенности использования подключаемых модулей
-
Реализация подключаемых модулей
-
Связывание модулей в единый проект
-
Заключение
Список литературы
-
Бадд Т. Объектно-ориентированное программирование в действии. / Т. Бадд – СПб.: Питер. – 1997. – 464 с.
-
Вирт Н. Алгоритмы и структуры данных. Новая версия для Оберона. Пер. с англ. / Н. Вирт – М.: ДМК-Пресс, 2010. – 272 с.
-
Легалов И. А. Применение обобщенных записей в процедурно-параметрическом языке программирования. / И.А. Легалов // Научный вестник НГТУ. – 2007. – № 3 (28). – С. 25-38.
-
Гамма Э. Приемы объектно-ориентированного проектирования. Паттерны проектирования. Пер. с англ. / Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес – СПб: Питер, 2007. – 366 с.
-
Модуль (программирование). Материал из Википедии – свободной энциклопедии [Электронный ресурс] – Режим доступа:
http://ru.wikipedia.org/wiki/Модуль_(программирование). – Загл. с экрана.
-
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.
-
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. – Загл. с экрана.
-
BlackBox. [Электронный ресурс] – Режим доступа:
http://www.oberon.ch/blackbox.html. – Загл. с экрана.
-
Саммерфильд М. Программирование на Python 3. Подробное руководство. Пер. с англ. / М. Саммерфильд – Спб.: Символ-Плюс. – 2009. 608 с.
-
Страуструп Б. Язык программирования C++. Третье издание. Пер. с англ. / Б. Страуструп – СПб.; М.: "Невский диалект" – "Издательство БИНОМ", 1999. – 991 с.
-
Троелсен Э. С. C# и платформа .NET. Библиотека программиста. Пер. с англ. / Э.С. Троелсен – СПб.: Питер, 2003. – 800 с.
-
Нортон П. Программирование на Java. Руководство П.Нортона (в 2-х томах). Пер. с англ. / П. Нортон – "СК-Пресс", 1998 – 900 с.
-
Radensky A. Module embedding. [Электронный ресурс] / A. Radensky – Режим доступа: http://www1.chapman.edu/~radenski/research/papers/module.pdf. – Загл. с экрана.
-
Легалов А. И. Процедурный язык с поддержкой эволюционного проектирования. / А.И. Легалов, Д.А. Швец // Научный вестник НГТУ. – 2003. – № 2 (15). – С. 25-38.
-
Легалов А.И. Процедурно-параметрическая парадигма программирования. Возможна ли альтернатива объектно-ориентированному стилю? / А.И. Легалов – Красноярск: 2000. Деп. рук. № 622-В00 Деп. в ВИНИТИ 13.03.2000. – 43 с.
-
Павлов В. Аспектно-ориентированное программирование [Электронный ресурс] // В. Павлов – Режим доступа: http://www.javable.com/columns/aop/workshop/01/. – Загл. с экрана.
[Возврат на основную страницу раздела]
|