Concepts (концепция, когда использовать, плюсы и минусы)

  • [x] Frameworks (PostSharp,Aspect.NET, Castle Dynamic Proxy…)
  • [x] Contracts (Contract programming)
  • [ ] Attributes usage in AOP (Using attributes. DataAnnotation namespace. Using in ORMs, in WCF, in IoC)

Краткий смысл от меня

С помощью АОП можно выполнять дополнительные действия над существующим кодом, при этом не изменяя его. Логика: существующий класс или метод должен знать только то, что он выполняет.

Cмысл АОП заключается в том, что бизнес-логика приложения разбивается не на объекты, а на “отношения” (concerns). Функции, которые охватывают несколько точек приложения называются “cross-cutting concerns” или сквозной (комплексной) проблемой и они отделены от самой бизнес-логики приложения.

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

joinpoint- конкретное место использования аспекта.

Ключевой единицей в ООП является “объект”, а ключевой единицей в АОП – “аспект”. В качестве примера “аспекта” можно привестибезопасность, кэширование, логирование и т.д. Внедрений зависимостей (DI) позволяет нам отделять объекты приложения друг от друга. АОП, в свою очередь, позволяет нам отделять сквозные проблемы (cross-cuttings) от объектов, к которым они относятся.

Концепция

Аспектно-ориентированное программирование (АОП) - методика программирования в рамках классовой парадигмы, основанная на понятии аспекта - блока кода, инкапсулирующего сквозное поведение в составе классов и повторно используемых модулей.

Аспект - это класс, который мы добавили, а методы в нем называются советами или advices. Они делятся на 5 типов:

• Before (до выполнения метода)

• After (после выполнения)

• After returning (после возвращения результата)

• After throwing (после выбрасывания исключения)

• Around (объединение несколько советов в 1)

Решаемая проблема

AOP решает проблему сквозной функциональности. Например, протоколирование / верификация / протоколирование работы системы (logging).

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

Цель

Основная цельаспектно-ориентированного программирования— вынос «общей» (сквозной) функциональности «за скобки» (модуляризация сквозной функциональности), выделение её в аспекты.

Как парадигма программирования:

·Расщепление классов на несколько независимых частей

·Расщепление методов

·Изменение поведения в зависимости от контекста вызова («контекстный полиморфизм»)

Как методология:

·Единицей модульности является аспект, при этом способ выделения аспекта не фиксируется: вопрос «что первично, поведение или состояние?», решается для каждой отдельной задачи или подзадачи, а не всей парадигмы

·Классы, функции могут быть составными

Методологические проблемы:

Разделение ответственностей 2-го класса (cross-cutting concerns)

Первая «каноническая» реализация:

Язык AspectJ, автор Грегор Кичалес, Xerox PARC

Средства:

Средства для выделения сквозной функциональности:

  • Аспект (aspect) – модуль / класс, который реализует сквозную функциональность. Он изменяет поведение остального кода, применяя совет в точках соединения, определённых некоторым срезом. Может использоваться также для внедрения функциональности;
  • Совет (advice) – дополнительная логика — код, который должен быть вызван из точки соединения. Совет может быть выполнен до, после или вместо точки соединения;
  • Точка соединения (join point) — точка в выполняемой программе (например, вызов метода, создание объекта, обращение к переменной), где следует применить совет;
  • Срез (pointcut) — набор точек соединения. Определяет, подходит ли точка соединения к заданному совету;
  • Внедрение (introduction) — изменение структуры класса и/или изменение иерархии наследования для добавления функциональности аспекта в инородный код;
  • Цель (target) – объект, к которому будут применяться советы;
  • Переплетение (weaving) – связывание объектов с соответствующими аспектами (возможно на этапе компиляции, загрузки или выполнения программы).

Достоинства:

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

·Более эффективный процесс создания системы

·Более качественная реализация

·Повышенные возможности тестирования

·Улучшенная модульность системы

·Повышение читабельности

·Упрощение поддержки

·Упрощает архитектуру системы

·Избавляется от дублирования кода

Недостатки:

·Недостаточно проработан механизм привязки аспектов к компонентам (тесная связь между аспектом и компонентом, к которому он применяется, поскольку в текущих реализациях точки связывания описываются в терминах программных конструкций - классов / методов / полей)

·Недостаточно качественная реализация расширений языков (каждая реализация аоп-расширения для языков по-своему определяет виды точек связывания, в которых можно применить аспект и описывает их, это затрудняет понимание общих принципов АОП)

·Не полностью проработана методология АОП - разработки программ (законченный и оттестированный компилятор имеется сейчас только для некоторых языков)

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

·Не применим во внутренней системе (используется контрактное программирование)

Frameworks

PostSharp

Реализация аспектно-ориентированного подхода для .NET. PostSharp.

Отличие: работает как пост-компилятор, то есть вносит изменения в MSIL (Microsoft Intermediate Language).
PostSharp позволяет легко создавать атрибуты, которые меняют поведение методов, полей и типов. Для этого нужно унаследовать класс атрибута от одного из предоставляемых библиотекой базовых классов, реализовать его виртуальные методы и применить этот атрибут.

PostSharp — это удобный инструмент для внедрения АОП в программы, написанные с использованием среды .NET.

Aspect.NET

Проект Aspect.NET основан профессором В. О. Сафоновым в 2002 г.
Создавая АОП инструментарий для перспективнейшей на тот момент платформы Microsoft.NET, аспекты в Aspect.NET определяются при помощи описания классов со специальными аннотациями на метаязыке Aspect.NET ML, независимого от выбранного языка .NET платформы.
Одна из компонент инфраструктуры Aspect.NET ответственна за конвертирование Aspect.NET ML аннотаций в пользовательские атрибуты, предназначенные для использования другими компонентами Aspect.NET. Таким образом, информация об аспектах, включающая правила внедрения, хранится в виде пользовательских атрибутов в метаданных сборки. Благодаря такому подходу, поддержка возможности создания аспектов на любом из существующих и будущих .NET языков занимает минимальное время.

Castle Dynamic Proxy

Castle DynamicProxy is a library for generating lightweight .NET proxies on the fly at runtime. Proxy objects allow calls to members of an object to be intercepted without modifying the code of the class. Both classes and interfaces can be proxied, however only virtual members can be intercepted.

DynamicProxy differs from the proxy implementation built into the CLR which requires the proxied class to extend MarshalByRefObject. Extending MashalByRefObject to proxy an object can be too intrusive because it does not allow the class to extend another class and it does not allow transparent proxying of classes.

You can use DynamicProxy to generate lightweight proxies on the fly for one or more interfaces or even concrete classes (but only virtual methods will be intercepted).

Spring

Модуль AOP в Spring обеспечивает нас такими сущностями, как “перехватчики” (interceptors) для перехвата приложения в определённые моменты. Например, когда выполняется определённый метод, мы можем добавить какую-то функциональность (к примеру, сделать запись в лог-файл приложения) как до, так и после выполнения метода.

Contract Programming

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

Преимущества:

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

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

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

Пример

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

Attributes in AOP (Using attributes. DataAnnotation namespace. Using in ORMs, in WCF, in IoC)

Использование .NET атрибутов:

На входе мы имеем программу, написанную на с#, с множеством точек кода. AOP, используя собственные средства определяет pointcut, куда могут быть добавлены advices.

Вставка советов в атрибуты

DataAnnotation namespace

From MSDN: Предоставляет классы атрибутов, используемых для определения метаданных для классов сущностей.

Пространство имен System.ComponentModel.DataAnnotations предоставляет классы атрибутов, используемые для определения метаданных для ASP.NET MVC и элементов управления динамических данных.

Using in ORMs (как справляются с этой задачей)

in WCF (windows communication foundation)

in IoC

results matching ""

    No results matching ""