domingo, 18 de março de 2012

Motivos para utilizar ou não programação orientada a aspectos.

Porque utilizar esse paradigma?

Uma das vantagens da Programação orientada a aspectos está na diminuição do tamanho do código dos componentes envolvidos, já que uma parte do código fica na definição dos aspectos, isso torna a complexidade menor tornando um sistema mais simples de implementar e compreender.
Pelo fato de ter sua implementação está centralizada em uma única unidade, as alterações torna-se muito mais simples, sendo assim, não é necessário reescrever várias classes. Dessa forma o código fica muito mais conciso facilitando sua manutenção e seu reuso.

Por que esse paradigma ainda é pouco utilizado?

Apesar de apresentar uma proposta inovadora no desenvolvimento de sistemas, a orientação as aspectos, apesar de está em constante evolução ainda apresenta algumas limitação em determinados aspectos, tais como:
Ainda não existe um padrão claro para se definir o que será ou não um aspecto no desenvolvimento de um software.
A falta de metodologias ainda é um fator limitado desse paradigma.

sexta-feira, 16 de março de 2012

Aspecto na pratica




Esse vídeo em inglês descreve de modo simples o funcionamento da programação orientada a aspecto. Como IDE, é utilizada apenas o eclipse. Uma classe “Hello” está criada, com orientação a objeto, e um aspecto “World”, com orientação a aspecto.
Podemos ver que a classe “Hello” possui um método ”sayHello”, que envia como saída uma frase. O aspecto “World” define um ponto de intervenção (pointcut), que foi chamado “greeting”. O comando execution descreve quando esse pointcut irá agir, que será na chamada da classe e metodo vistos anteriormente. O asterisco diz que não importa o tipo de retorno desse método, e os dois pontos que não importa os parâmetros que são pedidos pelo método(*Hello.sayHello(..))
Mas o que vai acontecer quando as diretrizes forem encontradas ? A linha after()returning() :greeting() nos diz que após o encontro dos argumentos, irá executar o que houver dentro do escopo, que é outra mensagem de saída ( “ World !”)
Ao final não importa qual método será chamado na main, pois nesse exemplo eles possuem a mesma assinatura, sendo o parametro pedido indiferente para a execução do pointcut. O aspecto irá ocorrer em ambos os casos.

Postado por: Douglas Viana, ADS – 6º periodo

Bridge (padrão de projeto de software)

Origem: Wikipédia, a enciclopédia livre.

Bridge é um padrão de projeto de software, ou design pattern em inglês, utilizado quando é desejável que uma interface (abstração) possa variar independentemente das suas implementações.

Imagine um sistema gráfico de janelas que deve ser portável para diversas plataformas. Neste sistema são encontrados diversos tipos de janelas, como ícones, diálogos, etc. Estas janelas formam uma hierarquia que contém uma abstração das janelas (classe base). Normalmente, a portabilidade seria obtida criando-se especializações dos tipos de janelas para cada uma das plataformas suportadas. O problema com essa solução reside na complexidade da hierarquia gerada e na dependência de plataforma que existirá nos clientes do sistema.

Através do padrão Bridge, a hierarquia que define os tipos de janelas é separada da hierarquia que contém a implementação. Desta forma todas as operações de Janela são abstratas e suas implementações são escondidas dos clientes.

 Exemplo
O diagrama mostra a solução para o problema citado. Temos duas hierarquias de classes relacionadas: a hierarquia de tipos de janelas (Janela, Icone e Dialogo) e a de implementação nas plataformas suportadas (JanelaImpl, XWindowImpl e MSWindowImpl). O relacionamento entre as interfaces, Janela e JanelaImpl, é a "ponte" que "desacopla" a interface da implementação. Para que um ícone seja desenhado, faz-se uma chamada ao método DesenhaBorda() que por sua vez realiza "n" chamadas ao método DesenhaLinha() da classe XWindowImpl ou MSWindowImpl, dependendo da plataforma desejada.

Exemplo de Diagrama em UML para o Padrão Bridge


Postado por: Hélio Marcus, ADS - 6º Periodo

quinta-feira, 15 de março de 2012

Programação Orientada a Aspectos – Visão Geral do AspectJ

      O elemento principal do AspectJ é o aspecto. Um aspecto se assemelha a uma classe Java e com isso pode ter tudo que uma classe Java possui: atributos, métodos, restrições de acesso. Porém os aspectos podem conter algumas características particulares, existem dois importantes AspectJ são pointcuts ("pontos de corte") e advice("conselhos").

      Os pontos de corte são definições de instantes durante a execução de um programa. Eles denotam onde e quando os aspectos terão efeito no programa como um todo.
Um advice é um comportamento. Ele especifica não só o que será feito, na forma de uma sequência de operações Java, mas também o momento em que serão feitas as operações.

public aspect Cabecalho {
// Ponto de corte
pointcut cabecalho() : call (* Receita.print());
// Advice
before() : cabecalho() {
System.out.println("-------RECEITA DA COZINHA INTELIGENTE-------");
}
}

fonte: http://www.aspectos.org/courses/aulasaop/aula08.html

Postado por: Murilo Almeida, ADS - 6º Periodo

segunda-feira, 12 de março de 2012

Paradigmas e Aspecto

  O que são os tais paradigmas ?

Já foi comentado neste blog sobre o paradigma da programação orientada a aspecto. Mas o que é um paradigma ?
De acordo com o site dicionário Priberam:
"paradigma (grego parádeigma, -atos) s. m.
1. Algo que serve de exemplo geral ou de modelo. = PADRÃO"

O paradigma é uma linha firme de pensamento, uma teoria para resolução de adversidades,um conjunto de conhecimentos que podem ser organizados a uma unica finalidade, um modelo de resolução de problemas
Esclarecido o que significa essa palavra de cunho "culto", vamos a programação

 Paradigmas de programação
Os quatro paradigmas de programação principais são:
·Procedural: Sequencia de comandos que é lida linha por linha, linearmente até seu fim, como na linguagem C
·Declarativo:Descreve-se o problema primeiramente, o algoritmo posterior ira se encaixar como solução. Como exemplo, Prolog
·Funcional:Divide o problema em varios blocos. Estes processam os dados e ao final se combinam, formando o resultado. Como exemplo, Haskell
·Orientado a objetos: Conjunto de classes, os objetos, possuem atributos (variaveis) e metodos(funções). Comunicam-se entre si para chegar ao resultado. Como exemplo, Java
E o discutido nesse blog:
Orientado a aspecto:Usado em conjunto com outro paradigma de programação. É descrito sendo um encapsulador de responsabilidades que aumenta a organização e facilidade na criação e manuntenção do codigo.
Essas capsulas são inseridas no codigo base em pontos bem definidos (join points), Os Join Points podem ser chamados sempre que uma função com uma nomeclatura especifica for processado. Alem disso, os aspectos (agem como classes) podem ser inseridos, alterados ou removidos em tempo de compilação, o que é uma possibilidade interessante.
É considerada uma meta-programação, pois ela deve ser compilada uma primeira vez para gerar um codigo modificado, e com a segunda compilação é que o resultado final surge.
Para ser utilizada são necessarias basicamente: programa dos componentes, programa de aspectos, e um combinador de ambos, chamado "aspect weaver". Este é o primeiro compilador já citado

                                                                                                                                                                                                    



Basicamente, a orientação aspecto funciona como um simbionte. Não vive sem o seu hospedeiro, mas quando estão juntos, ambos obtem diversas vantagens. Para finalizar, dois exemplos de codigo.

Exemplo AspectJ:
public aspect HelloFromAspectJ {
            pointcut mainMethod() : execution(public static void main(String[]));
            after() returning : mainMethod() {
                  System.out.println("Hello World");
            }
      }

Exemplo Delphi prism:
method MyObject.DivideBy(aValue: Integer);
require
 aValue <> 0;
begin
 MyValue := MyValue/aValue;
end;

Postado por: Douglas Viana, ADS - 6º periodo


Referencias:

Façade

Façade
Origem: Wikipédia, a enciclopédia livre.




Em padrões de projeto de software, um façade (fachada em francês) é um objeto que disponibiliza uma interface simplificada para uma das funcionalidades de uma API, por exemplo. Um façade pode:
tornar uma biblioteca de software mais fácil de entender e usar;
tornar o código que utiliza esta biblioteca mais fácil de entender;
reduzir as dependências em relação às características internas de uma biblioteca, trazendo flexibilidade no desenvolvimento do sistema;
envolver uma interface mal desenhada, com uma interface melhor definida.

Um façade é um padrão de projeto (design pattern) do tipo estrutural. Os façades são muito comuns em projeto orientados a objeto. Por exemplo, a biblioteca padrão da linguagem Java contém dúzias de classes para processamento do arquivo fonte de um caractere, geração do seu desenho geométrico e dos pixels que formam este caractere. Entretanto, a maioria dos programadores Java não se preocupam com esses detalhes, pois a biblioteca contém as classes do tipo façade (Font e Graphics) que oferecem métodos simples para as operações relacionadas com fontes.
[editar]Estrutura



Client1, Client2

Usuários da API

Façade

Define uma interface para os packages 1, 2 e 3, isolando-os do resto da aplicação.

O wikilivro Computer Science Design Patterns tem uma página sobreImplementação de façade em diversas linguagens

Esse é um exemplo abstrato de como um cliente ("você") interage com um façade (o "computador") para um sistema complexo (as partes internas do computador como o processador e o disco rígido).

/* Complex parts */
 
class CPU {
    public void freeze() { ... }
    public void jump(long position) { ... }
    public void execute() { ... }
}
 
class Memory {
    public void load(long position, byte[] data) { ... }
}
 
class HardDrive {
    public byte[] read(long lba, int size) { ... }
}
 
/* Facade */
 
class Computer {
    private CPU cpu;
    private Memory memory;
    private HardDrive hardDrive;
 
    public Computer() {
        this.cpu = new CPU();
        this.memory = new Memory();
        this.hardDrive = new HardDrive();
    }
 
    public void startComputer() {
        cpu.freeze();
        memory.load(BOOT_ADDRESS, hardDrive.read(BOOT_SECTOR, SECTOR_SIZE));
        cpu.jump(BOOT_ADDRESS);
        cpu.execute();
    }
}
 
/* Client */
 
class You {
    public static void main(String[] args) {
        Computer facade = new Computer();
 facade.startComputer();
    }
}







Tudo que tivermos no projeto irá ser passado pela fachada que também tem o singleton.
Na fachada chamamos os controladores.

Postado por: Argemiro Júnior, ADS - 6º Período.

segunda-feira, 5 de março de 2012

Singleton

Origem: Wikipédia, a enciclopédia livre.

Diagrama UML de uma classe singleton.
Singleton, é um padrão de projeto de software (do inglês Design Pattern). Este padrão garante a existência de apenas uma instância de uma classe, mantendo um ponto global de acesso ao seu objeto.

Nota linguística: O termo vem do significado em inglês quando se resta apenas uma carta nas mãos, num jogo de baralho.

Muitos projetos necessitam que algumas classes tenham apenas uma instância. Por exemplo, em uma aplicação que precisa de uma infraestrutura de log de dados, pode-se implementar uma classe no padrão singleton. Desta forma existe apenas um objeto responsável pelo log em toda a aplicação que é acessível unicamente através da classe singleton.





Índice
  [esconder]  1 Onde Usar
 2 Exemplos 2.1 Em Java
 2.2 Em C++
 2.3 Em Delphi
 2.4 Em PHP
 2.5 Em Ruby
 2.6 Em VB.NET
 2.7 Em ActionScript 3
 2.8 Em c# (utilizando Generics)

3 Benefícios
 4 Referências


[editar] Onde Usar

Quando você necessita de somente uma instância da classe, por exemplo, a conexão com banco de dados, vamos supor que você terá que chamar diversas vezes a conexão com o banco de dados em um código na mesma execução, se você instanciar toda vez a classe de banco, haverá grande perda de desempenho, assim usando o padrão singleton, é garantida que nesta execução será instânciada a classe somente uma vez. Lembrando que este pattern é considerado por muitos desenvolvedores um anti-pattern, então, cuidado onde for utilizá-lo. [1]

[editar] Exemplos

[editar] Em Java

Segue um exemplo em Java de uma classe Singleton.


 public final class MySingleton {
     // Instancia estática privada que será acessada
     private static final MySingleton INSTANCE = new MySingleton();

     // Construtor privado. Suprime o construtor público padrao.
     private MySingleton() {
          // Operações de inicialização da classe
     }

     // Método público estático de acesso único ao objeto!
     public static MySingleton getInstance(){
           return INSTANCE;
     }
 }




[editar] Em C++

Segue um exemplo em C++ da implementação de uma classe Singleton:


 class MyClass
 {
    private:
       // atributo estático da "instância única"
       static MyClass *instance = 0;
       //construtor privado, não pode ser utilizado fora da classe
       MyClass() {}

    public:
       // Função-membro que retorna sempre a mesma instância do objeto
       static MyClass& getInstance()
       {
          if (!instance) instance = new MyClass();
          return *instance;
       }
 };




[editar] Em Delphi

Abaixo segue um exemplo de como implementar uma classe Singleton:

Por exemplo, numa classe Fachada, onde se encontra todos os métodos disponíveis para a interface da aplicação, pode ser criado um método dinâmico para que todos os que visualizam essa classe, não criarem mais instâncias da mesma.


 class function TFachada.ObterInstancia: TFachada;
 begin
   If FInstance = nil Then
     FInstance := Cliente.Fachada.TFachada.Create();//objeto instanciado através do Finstance 
   Result := FInstance;//retorna o objeto
 end;




[editar] Em PHP


<?php
class Singleton
{
        private static $_instance;

        // Evita que a classe seja instanciada publicamente
        private function __construct() { }

        // Evita que a classe seja clonada
        private function __clone() { }

        public static function getInstance()
        {
                if (!isset(self::$_instance)) { // Testa se há instância definifa na propriedade, caso sim, a classe não será instanciada novamente.
                        self::$_instance = new self; // o new self cria uma instância da própria classe à própria classe.
                }
                return self::$_instance;
        }
}

[editar] Em Ruby


class Classe
    include Singleton
end

[editar] Em VB.NET


 Public Class MyClass
    Private Shared _instancia As MyClass
    Private Shared objetoSincronia As New Object

    Private Sub New()
    End Sub

    Public Shared Function getInstancia() As MyClass
        If _instancia Is Nothing Then
            SyncLock objetoSincronia
                If _instancia Is Nothing Then _instancia = New MyClass
            End SyncLock
        End If
        Return _instancia
    End Function
 End Class




[editar] Em ActionScript 3


package{
        public class ExemploSingleton {
                private static var instance:ExemploSingleton;

                public function ExemploSingleton(enforcer:SingletonEnforcer) : void {
                        if (enforcer == null)
                                throw new Error("Só pode haver uma instância de ExemploSingleton");
                }

                public static function getInstance() : ExemploSingleton {
                        if (instance == null)
                                instance = new ExemploSingleton( new SingletonEnforcer );
                        return instance;
                }
        }
}
//Para bloquear o acesso ao constructor.
class SingletonEnforcer {

}




[editar] Em c# (utilizando Generics)


public sealed class GenericSingleton<T> where T : class, new()
{
    private static T _instance;

    public static T GetInstance()
    {
        lock (typeof(T))
        {
            if (_instance == null)
                _instance = new T();

            return _instance;
        }
    }
}

// Teste do padrão Singleton
public class Car { public int Color { get; set; } }
public class Person { public string Name { get; set; } }

class Program
{
    static void Main(string[] args)
    {
        Car car = GenericSingleton<Car>.GetInstance();
        car.Color = 1;
        Person per = GenericSingleton<Person>.GetInstance();
        per.Name = "John";

        Car car2 = GenericSingleton<Car>.GetInstance();
        car.Color = 2;
    }
}

Obs: Esta solução não impede a criação de múltiplas instâncias das classes Car e Person. Como a classe genérica GenericSingleton obriga que as classes passadas no parâmetro T tenham um construtor público, é possível criar instâncias em qualquer trecho de código através de construções do tipo: Car car3 = new Car();.

[editar] Benefícios
 Permite o controle sobre como e quando os clientes acessam a instância.
 Várias classes singleton podem obedecer uma mesma interface, permitindo assim que um singleton em particular seja escolhido para trabalhar com uma determinada aplicação em tempo de execução.
 Com apenas uma implementação interna do singleton pode-se fazer com que o singleton crie um número controlado de instâncias.
 É mais flexível que métodos estáticos por permitir o polimorfismo.

Postado por: Hélio Marcus, ADS - 6º Período.