Разработка и реализация инструмента выделения аспектов

advertisement
УДК
Сиунов А. Э. (аспирант, каф. информатики, СПБГУ),
Сафонов В. О., д. т. н., проф.
К ВОПРОСУ О РАЗРАБОТКЕ И РЕАЛИЗАЦИИ ИНСТРУМЕНТА ВЫДЕЛЕНИЯ
АСПЕКТОВ ИЗ НЕ АСПЕКТНО-ОРИЕНТИРОВАННЫХ ПРОГРАММ
Аспектно-ориентированное программирование (АОП) – относительно новое, но,
несомненно, перспективное направление, в основе которого лежит разработка и
модификация сквозной функциональности в больших программных системах. АОП
предназначено для «модуляризации сквозной функциональности и ее автоматизированного,
безопасного и надежного добавления в целевую программу, а также поиска (локализации) и
модификации в целевой программе некоторой уже реализованной сквозной функциональности» [1].
Центральным понятием в АОП является аспект, понимаемый как «реализация какойлибо сквозной функциональности», как «модуль, применение которого осуществляется не
путем вызова, как для процедуры или метода, а путем систематизированного внедрения
фрагментов кода аспекта в рассредоточенные модули целевой программы» [2].
Основными задачами АОП являются не только реализация и внедрение новой
сквозной функциональности, но и, во-первых, выделение аспектов из не аспектноориентированных программ с целью их последующего многократного использования
(аспектизация) и, во-вторых, модификация сквозной функциональности, представленной
определением аспекта и всеми его внедрениями [1].
При
достаточно
динамичном
развитии
аспектно-ориентированного
программирования в целом, задача выделения аспектов является на настоящий момент
наименее реализованной – пока не существует общепризнанного специалистами и
пользователями инструмента аспектизации. В рамках нашего исследования предполагается
разработка и реализация аспектизатора - инструмента выделения аспектов из не аспектноориентированных программ.
Поскольку основной целью АОП является внедрение определенных аспектов в
целевую программу таким образом, чтобы при сохранении ее основной структуры можно
было использовать добавленные в различные заданные ее точки новые функции с
сохранением безопасной и надежной работой программы, для решения задачи аспектизации
необходимо сначала выявить, какие аспекты не аспектно-ориентированных программ были
востребованы и с помощью какого инструментария данные аспекты будут выделяться.
Выделение аспектов сталкивается с рядом проблем:
1) какие методы действительно могут помочь в автоматизированном выявлении
аспектов;
2) как определить, какая функциональность должна быть реализована с помощью
аспектов;
3) как оценить качество автоматической аспектизации [3].
Говоря об оценке качества аспектизации, можно разделить задачу на два вопроса:
насколько хорошо обнаруживаются аспекты и как много выявляется “неправильных”
аспектов, то есть таких, которые пользователь, выбирая из предложенных, считает
неподходящими.
Делая обзор подходов к выделению аспектов, исследователи [4] приходят к выводу о
том, что на данный момент, несмотря на непрекращающиеся попытки обнаружить
наилучшие методы аспектизации, однозначного подхода не выявлено. Существующие
методы недостаточно точны, у них много ложных обнаружений аспектов, все еще требуется
большое количество вовлечений пользователя, и эти методы не могут быть интегрированы с
инструментами рефакторинга.
В статье [3] описан следующий алгоритм аспектизации: вычислим количество
методов, в которых встречается вызов рассматриваемого метода. Чем это число больше, тем
вероятнее, что данный метод может быть частью аспекта [3]. При этом необходимо
исключить разнообразные часто встречающиеся по природе своей методы типа set и get,
toString и др.
На наш взгляд, аспектизатор может быть реализован двумя путями. Первый – это
поиск типичных аспектов, похожих на уже известные стандартные аспекты, например,
проверка прав доступа, протоколирование и обработка ошибок. Второй путь предполагает,
что аспектизатор сам делает попытки анализировать код. В частности, необходимо выделить
те места, где вероятнее всего есть аспект. Таких мест может быть достаточно много.
Например:
1) одинаковые имена переменных и вызовов методов с идентичными именами в
совершенно разных частях программы;
2) те методы, где в начале или в конце есть вызов методов суперкласса;
3) похожие конструкции try-catch в разных частях программы и др.
Сквозная функциональность предполагает, что в методе выполняются те действия,
которые логически не являются действием класса, не относятся к его задаче. Так, они могут
проверять некоторые входные параметры или вызывать внешние методы, которые не
изменяют при этом самих параметров. Такие действия можно выделить как действия
аспекта, выполняющегося до метода или вместо него. Сквозная функциональность,
выполняющаяся после действий метода, может предполагать дообработку выходных
данных, что также в ряде случаев может быть выделено как аспект.
В некотором отношении на действие аспекта похож шаблон проектирования IoC
(Inversion of Control). Поэтому управляющий класс этого шаблона можно представить как
действие аспекта. Также на наличие аспектов следует анализировать статические методы и
паттерн Singleton, поскольку в них часто может встречаться выполнение проверок и
обработка выходных данных, что тоже можно представить как действие аспекта.
Таковы в общих чертах пути разработки и реализации инструмента выделения
аспектов из не аспектно-ориентированных программ.
Литература
1.
Сафонов В.О. ASPECT.NET – инструмент аспектно-ориентированного
программирования для разработки надежных и безопасных программ // Компьютерные
инструменты в образовании. 2007. № 5. С. 3-13.
2.
Сафонов В.О. Практическое руководство по системе аспектноориентированного программирования
ASPECT.NET. Часть 1. // Компьютерные
инструменты в образовании. 2008. № 3. С. 20-33.
3.
Marin M., van Deursen A. and Moonen L. Identifying aspects using fan-in analysis.
In: Proceedings 11th Working Conference on Reverse Engineering (WCRE), pp. 132-141, IEEE
4.
Cojocar G. S. Aspect mining: past, present, future. STUDIA UNIV. BABEŞ
BOLYAI, INFORMATICA, Volume LVII, Number 4, 2012.
Download