An Aspect-Oriented Infrastructure for Design by Contract in Java Sérgio Agostinho    sagostinho@viatecla.pt www.viatecla.com 13Jan08    ViaTecla Software Ou mais uma Tese de Mestrado
Agenda Conceitos teóricos Problema Tese Desenho por Contrato Programação Orientada a Aspectos Protótipo Aplicações práticas O mundo académico vs indústria Plataforma Java -> .NET Discussão ...
Como garantir a  fiabilidade  do software? Desenho por Contrato: estabelecer responsabilidades na comunicação entre módulos Como melhorar a  separação de assuntos ? Programação Orientada a Aspectos: modularizar assuntos transversais Problema
A programação orientada por aspectos pode ser usada para implementar a verificação de desenho por contrato numa linguagem sem suporte nativo para o mesmo (Java). Tese
Procura-se Formação superior em Engenharia Informática Sólidos conhecimentos de programação em .NET e Java Capacidade de comunicação e interacção em equipa Oferece-se Integração em equipa jovem e dinâmica Contacto com as mais recentes tecnologias Participação em projectos aliciantes Renumeração de acordo com a experiência demonstrada Observações Lisboa Full-time Desenho por Contrato Pré-condições Pós-condições Invariantes
Classe Stack: Invariante: count() >= 0 Método pop(): Pré-condição: count() > 0 Pós-condição: new.count() = old.count() - 1 Método push(): Pós-condição: new.count() = old.count() + 1 Desenho por Contrato
Aspecto Novo módulo que encapsula o código transversal Pointcut A expressão que define os pontos do código que devem ser interceptados Advice O comportamento adicional a ser injectado Programação Orientada a Aspectos
/** * Pointcut que captura as execuções de métodos não privados nem estáticos. */ pointcut  nonStaticMethodExecution(Object object): target (object) &&  execution (!private !static * *.*(..)); /** * Pointcut que captura a execução de métodos dentro de packages J2SE. */ pointcut  systemPackageExecution(): execution (java.* *(..)) ||  execution (javax.* *(..)); /** * Pointcut que captura as chamadas de simpleGet* em packages ViaTecla. */ pointcut  simpleGetInsideViaTeclaCode(Object object): target (object) &&  withincode (com.viatecla.*) &&  call (public String *.simpleGet*(..)); Programação Orientada a Aspectos
before (Object object) : nonStaticMethodExecution(object) && ! systemPackageExecution() { Class objectClass =  thisJoinPoint .getTarget().getClass(); // “loggar” a utilização de memória… } String  around (Object object): simpleGetInsideViaTeclaCode(object) { // verificar se o pedido está em cache… // se não fazer a chamada original: String result =  proceed (object); // adicionar o resultado à cache... // devolver o resultado ao código original: return result; } Programação Orientada a Aspectos
Asserções (pré/pós-condições e invariantes) Métodos booleanos através de uma convenção de nomes Keywords Parâmetros dos métodos ou chamadas a API Quebras de contrato Excepções com nível de verificação configurável Distribuição Biblioteca (JAR) em AspectJ + reflexão Java Protótipo
class Stack<T> { boolean invariant() { return count() >= 0; } boolean prePush() { remember(); return true; } void push(T item) { ... } boolean postPush(T item) { Stack old = (Stack) old(); return this.count() == old.count() + 1; } boolean prePop() { remember(); return count() > 0; } T pop() { ... } boolean postPop() { Stack old = (Stack) old(); return this.count() == old.count() - 1; } int count() { ... } } Protótipo
O mundo académico Rigor Muito material Casos de estudo “toy” Requisitos muito estáveis O mundo perfeito (?) O mundo académico vs indústria Indústria Requisitos com evolução rápida Gestão de recursos limitados Sistemas de legado Engenharia (!) O mundo imperfeito... mas real   No meio: the Gap! Research and Development
Desenho por Contrato É uma boa prática Os contratos já lá estão! (Javadocs,  MSDN , na nossa cabeça...) Não há suporte  out of the box Programação Orientada a Aspectos A intercepção de chamadas tem alguns usos interessantes para bibliotecas Os assuntos transversais nem sempre seguem uma estrutura linear no código Os assuntos transversais ocorrem em sistemas heterogéneos O mundo académico vs indústria
Não são mundos muito distantes 23 Extensões AOP Java -> 15 extensões AOP .NET Linguagem Java -> C# Eclipse -> Visual Studio JUnit -> NUnit Log4J -> Log4Net ... Plataforma Java -> .NET
Tese de Mestrado http://aosd.di.fct.unl.pt/sergioag Spec# (extensão de C# com Desenho por Contrato) http://research.microsoft.com/SpecSharp/ PostSharp (extensão de C# com Aspectos) http://www.postsharp.org/ Mais informações
www.viatecla.pt | (+351) 212 723 500 Obrigado pela vossa atenção!

An Aspect-Oriented Infrastructure for Design by Contract in Java

  • 1.
    An Aspect-Oriented Infrastructurefor Design by Contract in Java Sérgio Agostinho  sagostinho@viatecla.pt www.viatecla.com 13Jan08  ViaTecla Software Ou mais uma Tese de Mestrado
  • 2.
    Agenda Conceitos teóricosProblema Tese Desenho por Contrato Programação Orientada a Aspectos Protótipo Aplicações práticas O mundo académico vs indústria Plataforma Java -> .NET Discussão ...
  • 3.
    Como garantir a fiabilidade do software? Desenho por Contrato: estabelecer responsabilidades na comunicação entre módulos Como melhorar a separação de assuntos ? Programação Orientada a Aspectos: modularizar assuntos transversais Problema
  • 4.
    A programação orientadapor aspectos pode ser usada para implementar a verificação de desenho por contrato numa linguagem sem suporte nativo para o mesmo (Java). Tese
  • 5.
    Procura-se Formação superiorem Engenharia Informática Sólidos conhecimentos de programação em .NET e Java Capacidade de comunicação e interacção em equipa Oferece-se Integração em equipa jovem e dinâmica Contacto com as mais recentes tecnologias Participação em projectos aliciantes Renumeração de acordo com a experiência demonstrada Observações Lisboa Full-time Desenho por Contrato Pré-condições Pós-condições Invariantes
  • 6.
    Classe Stack: Invariante:count() >= 0 Método pop(): Pré-condição: count() > 0 Pós-condição: new.count() = old.count() - 1 Método push(): Pós-condição: new.count() = old.count() + 1 Desenho por Contrato
  • 7.
    Aspecto Novo móduloque encapsula o código transversal Pointcut A expressão que define os pontos do código que devem ser interceptados Advice O comportamento adicional a ser injectado Programação Orientada a Aspectos
  • 8.
    /** * Pointcutque captura as execuções de métodos não privados nem estáticos. */ pointcut nonStaticMethodExecution(Object object): target (object) && execution (!private !static * *.*(..)); /** * Pointcut que captura a execução de métodos dentro de packages J2SE. */ pointcut systemPackageExecution(): execution (java.* *(..)) || execution (javax.* *(..)); /** * Pointcut que captura as chamadas de simpleGet* em packages ViaTecla. */ pointcut simpleGetInsideViaTeclaCode(Object object): target (object) && withincode (com.viatecla.*) && call (public String *.simpleGet*(..)); Programação Orientada a Aspectos
  • 9.
    before (Object object): nonStaticMethodExecution(object) && ! systemPackageExecution() { Class objectClass = thisJoinPoint .getTarget().getClass(); // “loggar” a utilização de memória… } String around (Object object): simpleGetInsideViaTeclaCode(object) { // verificar se o pedido está em cache… // se não fazer a chamada original: String result = proceed (object); // adicionar o resultado à cache... // devolver o resultado ao código original: return result; } Programação Orientada a Aspectos
  • 10.
    Asserções (pré/pós-condições einvariantes) Métodos booleanos através de uma convenção de nomes Keywords Parâmetros dos métodos ou chamadas a API Quebras de contrato Excepções com nível de verificação configurável Distribuição Biblioteca (JAR) em AspectJ + reflexão Java Protótipo
  • 11.
    class Stack<T> {boolean invariant() { return count() >= 0; } boolean prePush() { remember(); return true; } void push(T item) { ... } boolean postPush(T item) { Stack old = (Stack) old(); return this.count() == old.count() + 1; } boolean prePop() { remember(); return count() > 0; } T pop() { ... } boolean postPop() { Stack old = (Stack) old(); return this.count() == old.count() - 1; } int count() { ... } } Protótipo
  • 12.
    O mundo académicoRigor Muito material Casos de estudo “toy” Requisitos muito estáveis O mundo perfeito (?) O mundo académico vs indústria Indústria Requisitos com evolução rápida Gestão de recursos limitados Sistemas de legado Engenharia (!) O mundo imperfeito... mas real  No meio: the Gap! Research and Development
  • 13.
    Desenho por ContratoÉ uma boa prática Os contratos já lá estão! (Javadocs, MSDN , na nossa cabeça...) Não há suporte out of the box Programação Orientada a Aspectos A intercepção de chamadas tem alguns usos interessantes para bibliotecas Os assuntos transversais nem sempre seguem uma estrutura linear no código Os assuntos transversais ocorrem em sistemas heterogéneos O mundo académico vs indústria
  • 14.
    Não são mundosmuito distantes 23 Extensões AOP Java -> 15 extensões AOP .NET Linguagem Java -> C# Eclipse -> Visual Studio JUnit -> NUnit Log4J -> Log4Net ... Plataforma Java -> .NET
  • 15.
    Tese de Mestradohttp://aosd.di.fct.unl.pt/sergioag Spec# (extensão de C# com Desenho por Contrato) http://research.microsoft.com/SpecSharp/ PostSharp (extensão de C# com Aspectos) http://www.postsharp.org/ Mais informações
  • 16.
    www.viatecla.pt | (+351)212 723 500 Obrigado pela vossa atenção!