dev010 programação orientada a aspectos...

12
26-03-2007 1 DEV010 Programação Orientada a Aspectos em .NET Tiago Dias [email protected] Software Architect, BRISA Patrocinadores Agenda I - Introdução à Programação Orientada a Aspectos (AOP) II - Ferramentas AOP para .NET III - AOP multi-dimensional: MDSoC

Upload: buibao

Post on 09-Dec-2018

219 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: DEV010 Programação Orientada a Aspectos emdownload.microsoft.com/download/0/b/e/0be6834f-4fd5-40db-94b6-e56d... · 26-03-2007 1 DEV010 Programação Orientada a Aspectos em .NET

26-03-2007

1

DEV010

Programação Orientada a Aspectos em .NET

Tiago [email protected] Architect, BRISA

Patrocinadores Agenda

I - Introdução à Programação Orientada a Aspectos (AOP)

II - Ferramentas AOP para .NET

III - AOP multi-dimensional: MDSoC

Page 2: DEV010 Programação Orientada a Aspectos emdownload.microsoft.com/download/0/b/e/0be6834f-4fd5-40db-94b6-e56d... · 26-03-2007 1 DEV010 Programação Orientada a Aspectos em .NET

26-03-2007

2

O software está a ficar confundido…

Porquê a confusão?

“Bolas, nós faríamos melhor...”

Sim, mas se o software não misturasse tantos requisitos

Software com muitos requisitos

Use cases simples deixam de ter os resultados esperados

Novas funcionalidades que deviam ser transparentes afectam funcionalidades existentes

As funcionalidades, os assuntos, não estão a ser separados no código!!

Separation of Concerns (SoC)

Concerns – assuntos, correspondem a:

Requisitos – Funcionais e Não Funcionais (NFR)

É o objectivo de:

Programação orientada aos objectos (OOP)

Modularização

Encapsulamento

Arquitectura orientadas aos Serviços (SOA)

Vários design patterns

Mas não são suficientes...

A programação orientada a aspectos (AOP) vair pegar onde estas abordagens ficaram

Cross-cutting concerns

AOP – Exemplo

Requisitos funcionais:

Alimentação

Descanso

Procriar

Ser fêmea ou macho

Requisitos não funcionais

Logging

Segurança

Audit

Tigre

Animal

Mamífero

Foca

OOP

Código emaranhado

Código espalhado

Page 3: DEV010 Programação Orientada a Aspectos emdownload.microsoft.com/download/0/b/e/0be6834f-4fd5-40db-94b6-e56d... · 26-03-2007 1 DEV010 Programação Orientada a Aspectos em .NET

26-03-2007

3

AOP – Exemplo (2)

Factorização em aspectos:

Alimentação

Descanso

Procriar

Ser fêmea ou macho

Logging

Segurança

Audit

Tigre

Animal

Mamífero

Foca

OOP

Anatomia de um aspecto

Tigre

PointcutsAdvice

Joint-points

public class Tigre : Mamifero{

public void Rosnar(){

base.EmiteSom("Roaarrr");}

public void Estender(){

foreach(ParteDoCorpo pcin this.partesDoCorpo)

pc.Estender();}

}

Joint-points

Logging

Prociarpublic class Logging{

[AroundBody("Tigre::*()]")]public static object Log(MethodJoinPoint jp){

Debug.WriteLine("...");object result = jp.Proceed();Debug.WriteLine("...");return result;

}}

Exemplo utilizando o

public class Procriar{

[Insert("Tigre")]public void Cortejar(Tigre femea){

if(this.Femea || !femea.Femea)throw Exception("...");

...}

}

PointcutsAdvice

Advice

Pointcut

Como são aplicados os aspectos?

Weaving:

Quando e como é feito é o principal diferenciador entre as ferramentas AOP

TigreTigre

Código OO + Aspectos => Código em execução

AOP - Finalidades/Cenários

Separation of Concerns (SoC)

Alterações dinâmicas sem parar softwarede produção

Permitir testar componentes onde é díficil utilizar Mocks

...

Page 4: DEV010 Programação Orientada a Aspectos emdownload.microsoft.com/download/0/b/e/0be6834f-4fd5-40db-94b6-e56d... · 26-03-2007 1 DEV010 Programação Orientada a Aspectos em .NET

26-03-2007

4

II - Ferramentas AOP para .NET

Mapa Mundo AOP

Tipificação das ferramentas

DEMO: AspectDNG

As soluções AOP e a Microsoft

AspectJ™

PROSE

Hyper/J

JAsCo

EAOP

JMangler

AspectC++

CeaserJ

AspectC

Steamloom

AspectS

FeatureC++

DynAOP

Apostle

AspectR

Spring

(J2EE)

DemeterJ

Concern

Manipulation

Environment

Eclipse

IBM

WebSphere

HyperProbes

JBoss

(J2EE)

BEA

JRockit

JVM

AspectScheme

Aspects

AOPHP

Composition

Filters

Jakarta

HivemindJAML

XWeaver

PEAKPythiusPHPaspect

AspectL

AspectCocoa

Loom.NET

Weave.NET Meta.NET

Rapier.NETAspect#

Aspect.NET

AspectDNG

SetPointCLAW

PostSharpEos

Compose*

Encase

AOP-Engine

SourceWeave.NETAopDotN

etAddin

Phx.Morph

Other

Java

C++

.NET

Products

Itálico = patrocínio Microsoft (mas não são produtos)

AOP.NET

Wool

AspectCOOL

JAC

Nanning

JAsCo.NET

SiteVision

Axon

Arachne

Jiazzi

Poly

TinyC2 Wicca

Mapa AOP

Slide adaptado de apresentação sobre o Wicca

Hyper/Net

Tipificação das ferramentas AOP

Modelo de compilação e execução .NET:

Ad-hoc compiler:

É a abordagem do AspectJ (Java)

NKalorehttp://aspectsharpcomp.sourceforge.net/

Alteração do Mono C# Compiler

CódigoFonte Compilador

Compilação

Aspectos

MSILAspectualizado

CódigoFonte MSIL

CódigoNativoCompilador Compilador JIT

Compilação Execução

Ferramentas AOP (2)Ad-hoc Virtual Machine

Agora viabilizada através do MS Phoenix

Poderá ser a melhor de todas as abordagens:

Dinâmica

Performant

Transparente

Implementação mais próxima (funciona apenas em modo Debug):

MSILCódigoNativo

AspectualizadoCompilador JIT

Execução

Aspectos

Page 5: DEV010 Programação Orientada a Aspectos emdownload.microsoft.com/download/0/b/e/0be6834f-4fd5-40db-94b6-e56d... · 26-03-2007 1 DEV010 Programação Orientada a Aspectos em .NET

26-03-2007

5

Ferramentas AOP (3)Ad-hoc Virtual Machine

Utiliza o Microsoft Phoenix

E tem como objectivotestar AOP num projectode grande escala: MS Phoenix

Actua no compilador JIT por intermédio do:

Microsoft Debugger Edit&Continue (.NET 2.0)

Também permite outras abordagens (ex. IL Instrumentation)

Suporta weaving baseado em atributos

http://www1.cs.columbia.edu/~eaddy/wicca

Ferramentas AOP (4)Source-to-source

O weaving ocorre na Pré-compilação

A única abordagem em que é possível ver o código weaved

Paradigma AOP alargado: Multi-dimensional Separation of Concers - MDSoC

Utiliza o NRefactory, um parser de C# e VB.Net do SharpDevelop 2.0

CódigoFonte Weaver

Compilação

Aspectos

Código fonteAspectualizado

Ferramentas AOP (5)IL Instrumentation

Suportam qualquer linguagem compilável em MSIL

Permitem a aspectualização de software sem o código fonte

MSIL Weaver

Aspectos

MSILAspectualizado

Ferramentas AOP (6)IL Instrumentation

Compose*

http://composestar.sourceforge.net

Paradigma AOP:

Filtros de composição

http://setpoint.codehaus.org/

Pointcuts semânticos

Suporte parcial da MS Research

http://aspectdng.sourceforge.net

Os pointcuts podem usar XPath

http://www.postsharp.org/

LAOS – Lightweight A. O. System

Aspect.NET

http://www.academicresourcecenter.net/curriculum/pfv.aspx?ID=6595

Suporte parcial da MS Research

Integração no Visual Studio

DEMO

Page 6: DEV010 Programação Orientada a Aspectos emdownload.microsoft.com/download/0/b/e/0be6834f-4fd5-40db-94b6-e56d... · 26-03-2007 1 DEV010 Programação Orientada a Aspectos em .NET

26-03-2007

6

Ferramentas AOP (7)IL Instrumentation

http://dotspect.tigris.org/

Utiliza o RAIL para processar MSIL

http://www.dsg.cs.tcd.ie/dynamic/?category_id=-26

DotNetAOPhttp://www.gotdotnet.com/workspaces/workspace.a

spx?id=1b78f7c1-895f-49a7-8fa6-1565db16d41b

NAop / AOP.NEThttp://sourceforge.net/projects/aopnet/

Gripper-LOOM.NEThttp://www.dcl.hpi.uni-

potsdam.de/research/loom/gripper_loom.htm

Ferramentas AOP (8)Factory Based Proxying

Necessário utilizar proxies (não transparente)

Tipicamente limitadas a uma só linguagem

Compilador

CompilaçãoCódigo fonte

Aspectualizado

http://www.castleproject.org/aspectsharp

http://www.springframework.net http://s2container.net.seasar.org/en/index.html

NAspecthttp://www.puzzleframework.com

Frameworks

Rapier-LOOM.NEThttp://www.typemock.com

Os objectos são estendidos com funcionalidades necessárias para a testabilidade através de proxies.

http://www.dcl.hpi.uni-potsdam.de/research/loom/rapier_loom.htm

AspectDNG

Adicionar logging a todos os métodos de uma aplicação

As soluções AOP e a Microsoft

Enterprise Library e AOP

A EntLib

Uma solução AOP sobre a EntLib

MS Research Phoenix

O que é o Phoenix?

Soluções AOP suportadas sobre o Phoenix

Page 7: DEV010 Programação Orientada a Aspectos emdownload.microsoft.com/download/0/b/e/0be6834f-4fd5-40db-94b6-e56d... · 26-03-2007 1 DEV010 Programação Orientada a Aspectos em .NET

26-03-2007

7

Enterprise Library

Framework de requisitos não funcionais(NFR framework)

Cada tipo de requisito não funcional existe sob a forma de um Application Block:

Configuração, Segurança, Tratamento de Excepções, Caching, Acesso a Dados e Validação

Utiliza intensivamente design patterns:

Factory

Provider

Strategy

Façade

Enterprise Library: Application Blocks = Aspectos?

Será possível considerar os Application Blocks como aspectos pré-criadospreparados para weaving?

NÃO

Oferecem a sua funcionalidade através de Factories e outros Design Patterns que não são tão transparentescomo os Aspectos

É sempre necessário alterar o funcionamento do código onde se aplicam

Contudo

Têm objectivos comuns aos da AOP (tal como os design patterns)

// Get the CacheManager

CacheManager myCacheManager = CacheFactory.GetCacheManager();

// Save the settings to the Cache

myCacheManager.Add("SiteSettings", mySettings);

// Retrieve settings from the cache

SiteSettings cachedSettings = (SiteSettings)myCacheManager.GetData("SiteSettings");

if (cachedSettings != null)

{

Console.WriteLine("Name = {0}", cachedSettings.Name);

Console.WriteLine("Url = {0}", cachedSettings.Url);

Console.WriteLine("Email Address = {0}", cachedSettings.EmailAddress);

Console.ReadLine();

}

Enterprise Library: Caching

Factory Pattern

Código operacional

Código não operacional

Enterprise Library: Validationpublic class Customer

{

[NotNullValidator]

[StringLengthValidator(1, 100)]

public string Name

{

get { return name; }

set { name = value; }

}

[NotNullValidator]

public string Email

{

get { return email; }

set { email = value; }

}

public string ValidateCustomer()

{

ValidationResults results = Validation.Validate(this);

string message = string.Empty;

if (!results.IsValid) ...

}

}

Façade Pattern

Attribute based

Page 8: DEV010 Programação Orientada a Aspectos emdownload.microsoft.com/download/0/b/e/0be6834f-4fd5-40db-94b6-e56d... · 26-03-2007 1 DEV010 Programação Orientada a Aspectos em .NET

26-03-2007

8

Enterprise Library: Exception Handlingtry

{

int i = 5;

int j = 0;

int z = i / j;

}

catch(Exception ex)

{

bool rethrow =

ExceptionPolicy.HandleException(ex, "Business Layer Policy");

if (rethrow)

{

throw;

}

}

Similar to Aspect Advice declaration

Uma solução AOP sobre a EntLib

Solução de Olaf Conijn proposta no seu blog:http://bloggingabout.net/blogs/olaf/

Baseada num CTP da EntLib 2.0

Não é compatível com a versão final da framework .NET 2.0 (erros runtime)

Utiliza estratégia de Factory Based-Proxying

AOP com a EntLib: Exemplo

Criar um espremedor de sumo (juicer)

Espremer 10 unidades

O espremedor e o fruto a espremer são definidos em configuração

static void Main(string[] args

{

string containerName = "MyContainer";

IServiceContainer container =

ContainerFactory.CreateServiceContainer(containerName);

IJuicer juicer =

(IJuicer)container.GetServiceInstance(typeof(IJuicer));

juicer.Juice(10);

Console.WriteLine(juicer.CollectedJuice);

}

Fabrica um juicer

Obtém um container (config)

AOP com a EntLib: Exemplo (2)

Page 9: DEV010 Programação Orientada a Aspectos emdownload.microsoft.com/download/0/b/e/0be6834f-4fd5-40db-94b6-e56d... · 26-03-2007 1 DEV010 Programação Orientada a Aspectos em .NET

26-03-2007

9

AOP com a EntLib: Exemplo (3)

public class GenericMethodTracerAdvice: IAdvice

{

public object Invoke(IMethodInvocation invocation)

{

string traceMessage = string.Format(

"type: {0} method: {1}; parameters: {2}",

invocation.MethodCall.MethodBase.DeclaringType.Name,

invocation.MethodCall.MethodName,

invocation.MethodCall.MethodSignature);

Debug.WriteLine(string.Format("BEFORE[{0}]", traceMessage));

object result = invocation.ProceedInvocation();

Debug.WriteLine(string.Format("AFTER[{0}]", traceMessage));

return result;

}

}

Invoca o método original. Pode ser omitido, criando um Advice do tipo Instead of

Microsoft Phoenix

O Microsoft Phoenix será o backend de uma futura geração de compiladores e ferramentas de linguagens da Microsoft

Em desenvolvimento (Microsoft Research)

1.8M linhas de código – 318K à mão

Permite a manipulação de programas ao nível de uma representação intermédia (IR), ex. IL

Oferece APIs para criação de plug-ins e ferramentas para diversas fases da compilação e runtime - extensão e criação:

De compiladores e compiladores JIT

De ferramentas que manipulam a AST (ex. Intellisense) ou a IL

Microsoft Phoenix (2)

Viabiliza conjunto alargado de soluções AOP

Ad-hoc compiler

Plug-ins para o compilador que utilizam a AST para aplicar advice ou criar joint points dinâmicos (hooks)

IL instrumentation

Semelhante ao anterior mas através de uma ferramenta de pós-processamento (carrega DLLs)

Ad-hoc VM

Através da extensão do Compilador JIT

O compilador JIT passa a aplicar advice dinamicamente

Os pointcuts são avaliados em runtime

É possível alterar pointcuts e advice

A fase de weaving deixa de ser necessária

O Phoenix está já a ser utilizado (num release RDK):

Aspect Mining – detecção de código clonado

Mais info: http://www.cis.uab.edu/tairasr/phoenix/

Para a manipulação do código intermédio (MSIL):

Aspect.NET

SetPoint AOP

Meta.NET

Wicca

Microsoft Phoenix (3)

Page 10: DEV010 Programação Orientada a Aspectos emdownload.microsoft.com/download/0/b/e/0be6834f-4fd5-40db-94b6-e56d... · 26-03-2007 1 DEV010 Programação Orientada a Aspectos em .NET

26-03-2007

10

III - AOP multi-dimensional MDSoC

MDSoC – Multi-dimensional separation of concerns

DEMO – MDSoC com Partial Types

DEMO – Hyper/Net

MDSoC – Multi-Dimensional Separation of Concerns

Transformação num hiper-espaço:

Tigre

Animal

Mamífero

Foca

OOP

Alimentação

Descanso

Procriar Ser fêmea ou macho

Logging

Segurança

Audit

Ontologia

MDSoC – Multi-dimensional separation of concerns (2)

Desenvolvida desde 1999 por Peri Tarr e Harold Ossher

Implementação Java: Hyper/J

Pós-compilador - funciona de modo análogo à abordagem IL Instrumentation em .NET

Algumas ferramentas de aspectos .NET têm liberdade sintáctica para suportar MDSoC (ex. AspectDNG)

Nós pensamos em MDSoC :

“The thoughts perfectly slot themselves into the rows, columns, layers, hyper-rows, hyper-columns, and hyper-layers of a vast matrix.” Steven Pinker

MDSoC c/ Partial Types

Page 11: DEV010 Programação Orientada a Aspectos emdownload.microsoft.com/download/0/b/e/0be6834f-4fd5-40db-94b6-e56d... · 26-03-2007 1 DEV010 Programação Orientada a Aspectos em .NET

26-03-2007

11

Ferramentas MDSoC

Hyper/J – Java

Hyper VB.Net

??

Hyper C#

Limitado a trabalhar com uma só classe numa GUI específica

Hyper/Net

(Beyond Partial Types)

Sumário

AOP

Tem várias vantagens práticas

Existem implementações aceitáveis para testes e projectos não críticos (esses existem?)

É uma área em maturação

MDSoC

Todos devíamos usar através dos partial types do .NET

Existe poucas ferramentas para ir além dos partial types

É uma área cujo potencial completo está muito pouco explorado

Recursos AOP e MDSoC

Aspect Oriented Software Development

http://AOSD.net (Wiki)

A minha página pessoalArtigo Hyper/Net

http://ptsoft.net/tdd/

[email protected]

Page 12: DEV010 Programação Orientada a Aspectos emdownload.microsoft.com/download/0/b/e/0be6834f-4fd5-40db-94b6-e56d... · 26-03-2007 1 DEV010 Programação Orientada a Aspectos em .NET

26-03-2007

12

Pergunte aos EspecialistasObtenha Respostas às Suas Questões

Depois da apresentação:

Área de Desenvolvimento

Questionário de AvaliaçãoPassatempo!

Complete o questionário de avaliação e devolva-o no balcão da recepção.

Habilite-se a ganhar uma Xbox 360 por dia!

DEV010

Programação Orientada a Aspectos em .NET

© 2007 Microsoft Corporation. All rights reserved.This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.