Инструментарий управления слоями как средство реализации принципов аспектно ориентированного программирования

УДК 004.416.6

Ю. А. Маринченко ИНСТРУМЕНТАРИЙ УПРАВЛЕНИЯ СЛОЯМИ КАК СРЕДСТВО РЕАЛИЗАЦИИ ПРИНЦИПОВ АСПЕКТНО ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ

Аннотация. Введено новое понятие слоя, позволяющее структурно оформить сквозную функциональность. Слой является обобщением понятия модуля.

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

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

Abstract. In this article the new concept of the layer allowing structurally to issue cross-cutting functionality is entered. The layer is generalisation of concept of the module. At the heart of a way of allocation of layers principles of aspect-oriented programming lie. Existing principles aspect-oriented programming have been considerably expanded. The toolkit of allocation of layers is presented. The technique of allocation of layers which is applicable for difficult program projects for the purpose of simplification of support of such projects is presented. Simplification is reached by a concentration of the connected fragments of a code in one layer at editing of a program code.

Keywords: project information, intention, cross-cutting functionality, module, layer, layer fragment, weaved representation of a program code, decomposed representation of a program code.

Введение

Функциональность (намерение) - это относительно самостоятельная, содержательно целостная единица модификации программного проекта. Функциональность можно ассоциировать с пунктом технического задания на изменение программного проекта. Как правило, реализация функциональности рассредоточена по различным модулям программного проекта. Реализация функциональности должна носить транзакционный характер.

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

Задача распределения функциональности по модулям является очень сложной, так как в любом приложении присутствует функциональность, которая пронизывает практически все приложение. Например, в качестве распределенной по приложению функциональности может выступать журнализация действий пользователя приложения, авторизация и обеспечение безопасного доступа пользователей (рис. 1).

Рис. 1. Распределение сквозной функциональности в модулях

Функциональность, которая рассредоточена по различным модулям приложения, будем называть сквозной функциональностью приложения. Такую функциональность достаточно сложно поместить в один модуль.

Показателем того, что у разработчика есть проблемы в модуляризации сквозной функциональности, служит запутанный и рассредоточенный программный код [1]. Под запутанным кодом подразумевается программный код, в котором фрагменты реализации различных подзадач переплетаются в одном модуле. Рассредоточенным кодом является программный код, в котором фрагменты реализации подзадачи распределены по нескольким модулям приложения.

Модифицировать функциональность, которая рассредоточена по коду приложения и не может быть представлена как отдельный программный модуль, очень трудно. Все это затрудняет сопровождение приложения и препятствует повторному использованию программного кода [2].

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

1. Существующие способы оформления сквозной функциональности в модуль

Существует несколько методов, которые можно применить в качестве средства модуляризации сквозной функциональности: поведенческие шаблоны проектирования (Category Behavioral Patterns) [3], языковые расширения программирования в аспектно ориентированном стиле [1].

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

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

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

2. Инструментарий управления слоями как реализация принципов апектно-ориентированного программирования

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

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

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

Основы аспектно ориентированного программирования

Можно сосредоточить любую функциональность, в том числе и сквозную, в одном слое, используя концепцию аспектно ориентированного программирования (АОП) [1], поскольку структурной единицей программы является аспект. АСПЕКТ (от лат. а8рес1и - вид) - точка зрения, с которой рассматривается какое-либо явление, понятие, перспектива (Большой энциклопедический словарь).

Ввиду того, что сквозная функциональность рассредоточена по коду приложения, а после применения идей АОП сквозная функциональность размещается в одном аспектном модуле, существуют переплетенное и разделен-

ное представление программного кода приложения (рис. 2). Представление программного кода, в котором сквозная функциональность собрана в одном аспекте, называется разделенным представлением программного кода приложения. Переплетенное представление программного кода приложения - это представление программного кода, в котором сквозная функциональность встречается во многих модулях приложения, как бы «размазана» по программному коду приложения. Таким образом, представление с точки зрения аспектов - разделенное представление; представление с точки зрения модулей среды разработки - переплетенное представление. Также должно быть реализовано средство перехода из одного представления в другое, называемое переплетчиком.

обавле

е объекта

удаление объекта

зменение объе

кта

добавление объекта

удаление объекта

изменение объекта

журнализация

а) б)

Рис. 2. Переплетенное (а) и разделенное (б) представления программного кода

Очевидно, что переплетенное и разделенное представления не могут быть равноправными с точки зрения хранения программного кода, так как одно из них должно быть основным для хранения, а другое - производным, т.е. должно формироваться по основному в определенный момент времени, а именно, на этапе проектирования (designtime), на этапе компиляции (сотрйейте) и т.д. Выбор приоритетного для хранения представления программного кода и момента перехода из одного представления в другое определяется в зависимости от конкретной реализации инструментария АОП.

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

Особенности реализации инструментария управления слоями

Предлагаемый инструментарий поддержки АОП позволяет абстрагироваться от способа разбиения на модули-файлы среды программирования и работать со сквозной функциональностью, представимой в виде модулей-

аспектов. Данный инструментарий использует текстовый редактор Notepad++, который поддерживает настраиваемую динамическую подсветку текста, а также настраиваемый режим древовидного представления текста (foldering). Notepad++ также обладает такими свойствами, как высокая производительность при работе с текстом, что обусловлено составным компонентом Scintilla проекта. Еще одним преимуществом Notepad++ является поддержка PlugIn-модулей, что позволяет адаптировать эту среду для различного рода задач, в частности для программирования в аспектно ориентированном стиле.

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

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

Понятие проекта в среде программирования подразумевает набор ссылок на файлы, структурированный по типам файлов. Файл проекта в рамках разработанного инструментария представляет собой XML-файл, который содержит настройки проекта, ссылки на файлы программного кода и ссылки на аспекты. Здесь в файле проекта кроме структуризации по файлам, содержится структуризация по слоям (по намерениям или функциональностям). Файл проекта представляет собой своего рода оглавление проекта, путеводитель, позволяющий быстро ориентироваться в структуре и расположении модулей и аспектов проекта. Список слоев обновляется автоматически при любом изменении в переплетенном или разделенном представлении программного кода. При заполнении файла проекта разрешено использовать символ «*», который аналогичен произвольной строке.

Инструментарий управления слоями применим только для файлов проектной информации, которые могут быть представимы в текстовом виде, для остальных файлов инструментарий бесполезен, поскольку основан на процедурах и функциях работы с текстовой информацией.

Для определения фрагментов слоя используется комментарий языка программирования, имя слоя, номер фрагмента в слое, т.е. полное имя фрагмента соответствует следующему шаблону: начало фрагмента - «// *( _слой номер», окончание фрагмента - «"// *) _слой номер», где «//» - комментарий языка программирования. Например, «// *( _log 1» - начало первого фрагмента слоя log;

«// *) _log 1» - окончание первого фрагмента слоя log. В комплекте с плагинами разработанного инструментария поставляется XML-файл настроек, в котором указаны соответствия типов файлов и комментариев для этих типов.

В случае использования инструментария управления слоями программный код хранится в переплетенном представлении и выполняется в переплетенном представлении. Редактором программного кода являет текстовый редактор Notepad++, который манипулирует аспектом как единицей структурирования программы, т.е. программный код с точки зрения аспектов - некоторый срез, сечение программного кода по аспектам. Этот срез формируется временно на момент редактирования программного кода. Синхронизация разделенного и переплетенного представлений ведется только в двух направлениях. В начале работы с разделенным представлением производится поиск фрагментов слоя по переплетенному представлению программного кода, затем формируется актуальный слой, который существует только во время редактирования этого слоя. После окончания редактирования слоя осуществляется обновление (обмен) всех фрагментов слоя переплетенного представления на фрагменты слоя разделенного представления. Такой механизм синхронизации разделенного и переплетенного представления практически исключает возможность возникновения конфликтов редактирования и потерю изменений программного кода, несмотря на то, что редактировать код можно как в переплетенном, так и в разделенном представлении.

В Notepad++ проект можно рассматривать как с точки зрения файлов проекта, так и с точки зрения аспектов, поэтому в разработанном инструментарии представлен спектр операций разного уровня: уровня слоя, которые охватывают все фрагменты слоя в разных файлах; уровня файла, которые охватывают фрагменты файла независимо от слоя; уровня файла-слоя, которые управляют фрагментами определенного файла и определенного слоя (рис. 3).

файлы

Я

а

й

_о

Is

—

<а

а

О

Я

а

и

&

Сц

журнализация контроль транзакции фрагмент слоя «контроль транзакций», расположенный в файле КешОрегаИоар^

слои

Рис. 3. Двумерное представление отношения «Файлы - Слои»

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

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

Обновление переплетенного представления осуществляет редактирование, вставку, удаление фрагментов программного кода по разделенному представлению. Фрагменты обновляются из вкладки модуля слоя Notepad++.

Разработанный инструментарий предоставляет операции комментирования, раскомментирования фрагментов слоя, которые добавляют или удаляют комментарий соответственно на все фрагменты выделенного слоя или только на фрагменты текущего файла в зависимости от уровня операции. Добавляемый символ комментария снабжается также строкой «(АР)» после символа комментария, чтобы отличать пользовательские комментарии от служебных. Отключение фрагментов слоя удаляет фрагменты уровня слоя или файла-слоя программного кода. Данную операцию можно отменить сочетанием клавиш «СТКЬ+2».

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

3. Результаты применения инструментария управления слоями

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

Для того чтобы воспользоваться всеми преимуществами разработанного инструментария, необходимо реализовать следующую последовательность действий:

1. Определяем список функциональностей, слоев для структуризации.

2. По переплетенному представлению проектной информации помечаем принадлежность фрагментов определенному слою, используя специальную разметку.

3. Определяем взаимосвязи между слоями.

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

Подчеркнем, что данная методика применима только для текстовых файлов проектной информации. Под текстовыми файлами понимаются не только файлы с расширением txt, а все файлы, которые можно просмотреть текстовым редактором.

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

Удобства использования разделенного представления программного кода в сравнении с переплетенным представлением программного кода очевидны. Во-первых, значительно сократился объем обозреваемого кода, нет необходимости метаться по файлам программного проекта и искать фрагменты кода, соответствующие интересующей программиста функциональности. Во-вторых, неоспоримым удобством является то, что инструментарий используется для любых текстовых данных, а следовательно, для программного кода, разработанного на любом языке программирования. Следует помнить, что инструментарий управления слоями применим к любому языку программирования, который размещается в файлах, доступных для корректного просмотра текстовым редактором. Для сравнения уточним, что невозможно реализовать подобный слой альтернативными способами, поскольку существует AspectXML и Aspect# и не существует поддержки аспектно ориентированного программирования для языка SQL. В любом случае для каждого аспектного дополнения языка программирования пришлось бы использовать свой синтаксис и создавать отдельный слой, а это крайне неудобно.

В случае AspectJ программный код хранится в разделенном представлении и при компиляции происходит переход к переплетенному представлению, которое поступает на выполнение. Применение методики работы с инструментарием управления слоями позволяет работать как с разделенным, так и с переплетенным представлением программного кода. Нововведение в принципы АОП заключается в том, что не существует доминирующего представления программного кода приложения, изменять программный код можно в любом представлении. Программирование в двух представлениях программного кода приложения предоставляет возможность постепенного применения программирования в аспектно ориентированном стиле к уже существующему программному проекту независимо от среды разработки данного проекта. Редактирование программного кода может вестись в любом из представлений программного кода, но хранение осуществляется в переплетенном представлении программного кода.

Заключение

В данной работе введено новое понятие слоя для реализации сквозной (рассредоточенной) функциональности. Наиболее близким понятием является аспект в рамках АОП. Слои представляют собой способ реализации АОП.

Инструментарий управления слоями предоставляет возможность рассматривать всю проектную информацию в определенном разрезе. Данный

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

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

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

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

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

1. Kiczales, G. Aspect-oriented programming, Proceedings of ECOOP'97, volume 1241 of Lecture Notes in Computer Science / G. Kiczales, J. Lamping, A. Mendhekar. -Finland. : Springer-Verlag, 1997. - P. 220-242.

2. Горбунов-Посадов, М. М. Расширяемые программы / М. М. Горбунов-Посадов. - М. : Полиптих, 1999. - 336 с.

3. Гамма, Э. Приемы объектно-ориентированного проектирования / Э. Гамма, Р. Хелм, Р. Джонсон, Д. Влиссидес. - СПб. : Питер, 2000. - 368 с.

Маринченко Юлия Александровна аспирант, Южный федеральный университет

E-mail: marinchenko@aaanet.ru

Marinchenko Yuliya Alexandrovna Postgraduate student,

South Federal University

УДК 004.416.6 Маринченко, Ю. А.

Инструментарий управления слоями как средство реализации принципов аспектно ориентированного программирования / Ю. А. Маринченко // Известия высших учебных заведений. Поволжский регион. Технические науки. - 2010. - № 2 (14). - С. 21-29.