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
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
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
...
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
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
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
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
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)
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)
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
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/
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.
Top Related