Programação

Orientada a Aspecto

Ricardo Plansky

  • Análise e Desenvolvimento de Sistemas
  • +10 anos trabalhando com web
  • Desenvolvedor na Leroy Merlin

Agenda

  • Paradigmas de desenvolvimento

  • O que é Programação Orientada a Aspecto (POA)

  • Separação de responsabilidades

  • Pequeno glossário

  • Fluxo dos diferentes tipos de interrupções

  • Demo

  • Conclusão

Paradigmas

  • Programação estruturada

    • Todo o código se resume em sequência, decisão e repetição
  • Programação modular

    • Evolução da programação estruturada, mas com a possibilidade de divisão de sub-rotinas
  • Programação Orientada a Objetos

    • Agrupamento de sub-rotinas e propriedades que possibilitam a separação de responsabilidades em objetos

Aspectos

 

  • Separação de código através da sua relevância para o software

 

  • Separação de responsabilidades secundárias em comum entre dois ou mais objetos

Separation of Concerns

 

  • concern (interesse): é uma operação na qual o seu software precisa executar para atingir um objetivo.

  • crosscut-concerns (interesses ortogonais): é quando as mesmas operações estão espalhadas por diversos de seus objetos

namespace Payment;

class CreditCard
{
    /**
     * Pays using given credit card.
     * 
     * @param SaleOrder $order
     * @param Card $card 
     * 
     * @return bool
     */
    public function pay(SaleOrder $order, Card $card): bool
    {
        $sucess = $this->gateway->charge($order->total(), $card);

        if (false === $sucess) {
            $this->log->notice('Unable to charge given credit card');

            return false;
        }

        $order->paid();
        $this->log->info('Order paid');

        return true;
    }
    // Some another methods
}
<?php 
namespace Payment;

class CreditCard
{
    /**
     * Pays using given credit card.
     * 
     * @param SaleOrder $order
     * @param Card $card 
     * 
     * @return bool
     */
    public function pay(SaleOrder $order, Card $card): bool
    {
        return $this->gateway->charge($order->total(), $card);
    }

    // Some another methods
}

Exemplo de Aspecto

namespace Aspect\Payment;

use Payment\CreditCard;
use Go\Aop\Aspect;
use Go\Aop\Intercept\MethodInvocation;
use Go\Lang\Annotation\Before;

/**
 * Payment aspect
 */
class PaymentLogAspect implements Aspect
{

    // ...

    /**
     * Method that will be called before pay method
     *
     * @param MethodInvocation $invocation Invocation
     * @Before("execution(public CreditCard->pay(*))")
     */
    public function beforePay(MethodInvocation $invocation)
    {
        $this->log->debug(
            'Trying to pay order using given parameters', 
            $invocation->getArguments()
        );
    }
}

Glossário

  • joinpoint: é qualquer ponto no seu código onde o aspecto pode ser aplicado: cronstrutor, chamada de métodos, getters, setters, etc.

Glossário

  • pointcut: são as regras que definem quando uma chamada  será interceptada no momento de execução do sistema

Glossário

  • advice: é o trecho de código que será executado quando uma regra definida no pointcut for satisfeita.

Pointcuts

Before

After

Around

DEMO

Programação Orientada a Aspectos

By Ricardo Plansky Jr.

Programação Orientada a Aspectos

Programação Orientada a Aspectos é um tema relativamente novo no mundo da programação, ainda é muito pouco difundido, principalmente, em linguagens que não são compiladas. A ideia dessa talk é falar sobre esse paradigma, que não tem a intenção de substituir OOP, mas sim, complementar. Falar sobre a separação de responsabilidades e discutir um pouco sobre design de código.

  • 296