domingo, 14 de junho de 2009

Padrões de Projeto: Observer + Aspectos

Apresentamos o Padrão de Projeto Observer em 2 versões. Implementando todas as classes do padrão ou implementando com o uso das classes da API. Nos dois casos existem problemas para o reuso do código.
Para implementar o Padrão de Projeto podemos definir uma interface ou uma classe abstrata para o Subject. A classe concreta nos 2 casos vai ter "código extra" que não faz parte do negócio. Com o uso da interface Subject a classe Concreta deve implementar os métodos do padrão de projeto. Se utilizar a classe abstrata Suject a classe Concreta deve estender dessa classe impedindo que se faça reuso da classe por meio de herança (Java não permite herança múltipla).



/**
* Estendendo de uma classe abstrata Subject.
* Em vermelho código adicionado em virtude do padrão.
*
*/
public class ConcreteSubject extends Subject {

private int estado = 0;

public int getEstado() {
return estado;
}

public void setEstado(int estado) {
this.estado = estado;
this.notifyObservers(estado);
}

}


Isso levanta uma discussão quanto ao uso desse padrão e a possibilidade de reuso das classes. Uma outra forma de implementar o padrão é utilizando aspectos, dessa maneira a classe a ser observada não ficaria com nenhum código estranho.



/**
* Utilizando Aspectos.
* O padrão é implementado sem interferir diretamente na classe ConcreteSubject.
*/
public class ConcreteSubject {
private int estado = 0;

public int getEstado() {
return estado;
}

public void setEstado(int estado) {
this.estado = estado;
}
}


Faça o download da versão utilizando Aspectos: PadraoObserverImpl_3.zip

No post anterior temos download de 2 formas de implementação do padrão e um exemplo de aplicação do padrão.

quinta-feira, 11 de junho de 2009

Padrões de Projeto: Observer

Os Padrões de Projeto são soluções genéricas para problemas recorrentes, “cada padrão descreve um problema no nosso ambiente e o cerne da solução, de tal forma que você possa usar essa solução mais de um milhão de vezes, sem nunca fazê-lo da mesma maneira”(Alexander, C. et al. apud Gamma, E. et al., 2000).

Ao utilizar um padrão de projeto na solução de um problema no desenvolvimento do software significa que optamos por uma solução de boa qualidade e já testada.

O padrão Observer é também conhecido como Publish-Subscribe, Event Generator ou Dependents (Salve, J.,2008). Esse padrão é endereçado a família de problemas que tem a intenção de “definir uma dependência um-para-muitos entre objetos, de maneira que quando um objeto muda de estado todos os seus dependentes são notificados e atualizados automaticamente” (Gamma, E. et al., 2000 ).

O padrão Observer que é aplicável quando a alteração no estado de um objeto implica em notificar ou alterar outros objetos. Além disso, os objetos que vão sofrer alteração ou ser notificados não são conhecidos pelo objeto que sofreu a mudança, conseguindo assim um fraco acoplamento.

No padrão Observer temos um objeto que será observado, chamado de Subject. Na API Java temos as classes java.util.Observable e java.swing.EventSource são implementações do Subject. Temos também o objeto que observa e é notificado chamado de Observer, em Java as classes que o implementam são java.util.Observer e o java.swing.Listener. Java usa o padrão na API de duas formas diferentes (Sauvé, J.,2006).



Download de uma implementação do Observer completa: PadraoObserverImpl_1.zip
Download de uma implementação do Observer com uso das classes da API java.util.Observable e java.util.Observer : PadraoObserverImpl_2.zip

Para exemplificar o uso do padrão de projeto Observer definimos uma aplicação que vamos chamar de “Bolsa de Valores”. Essa aplicação obtém o índice da bolsa de valores e exibe em formato texto ou em um gráfico. (Exemplo completo disponível no artigo download)

Download da implementação do Observer aplicado ao exemplo da Bolsa de Valores: PadroObserverBolsa.zip




Considerações:

O padrão atende as expectativas reduzindo bastante o acoplamento entre as abstrações. No entanto, em java, quando o ConcreteSubject precisa estender a classe Subject não pode estender de outra classe dificultando sua reutilização.

Na solução do padrão Observer apresentada existe apenas um método de atualização onde devemos passar o Subject ou o estado do Subject. Isso torna a missão de descobrir quem disparou a mudança no estado uma tarefa árdua (Sauvé, J., 2006).

A solução de proposta utilizando o Listner (equivalente ao Observer) é implementa pelo Java Swing. Permite a criação de vários eventos que são disparados executando os métodos associados. Ela também facilita a descoberta da fonte do evento. Conseguimos obter um código mais claro e os observares são registrados de forma mais específicada (Sauvé, J., 2006).

As duas implementações do padrão Observer citadas tem problemas pois tanto o ConcreteSubject quanto o ConcreteObserver não estão apenas com seus métodos de “negócio”. É necessário inserir código para tratar o problema da notificação dos observadores não sendo possível a reutilização direta desses objetos.

Espero ter contribuído para seus estudos sobre padrões de projeto.

1001 utilidades em Java


O nome da biblioteca é Alfred mais poderia se chamar "BomBril".
Alfred é uma biblioteca para Java que contém dezenas de classes utilitárias que faz de tudo para você. Desde uma simples formatação de CPF ao cálculo de envio de encomendas por Sedex.

Mais informações: http://code.google.com/p/alfredlibrary/

Eu já estou contribuindo para essa iniciativa e você também pode contribuir.

Parabéns ao meu grande amigo Marlon por essa iniciativa e valeu por ter me chamado para entrar nessa.

terça-feira, 9 de junho de 2009

Java é 10, Linux é 10 e o Java, Linux e Vatapá é 100!

Chegamos ao centésimo post e a família Java, Linux e Vatapá cresceu.

Parabéns a todos que vem contribuindo com post's, comentários, acessos e divulgação. Isso nos da mais vontade de postar. :)

Seus comentários e acessos é que direcionam as informações que são adicionadas.

Site Nerd (Geek)


Moda Geek, esse site já vende tudo que um Nerd precisa para viver, acessórios, roupas e diversas utilidades. Vale a pena conferir:
http://www.thinkgeek.com/

Os produtos vão de relógio que apresenta as horas em binário ate camisetas que mostram o nivel do sinal wireless do local.

JaLiVE Google Search Firefox Plugin

Nós, do blog JaLiVE, estamos sempre pensando em facilitar a sua vida, caro leitor. Sendo assim, criamos um Search Plugin para firefox, que permite você fazer as buscas no nosso blog sem a necessidade de acessá-lo primeiro.

Siga os passos:

faça o download do arquivo xml clicando aqui

Salve o arquivo na pasta:

LINUX:
/usr/lib/firefox-addons/searchplugins

WINDOWS: (Algum leitor utiliza mesmo isso?)
c:\arquivos de programas\mozila... sei lá não lembro não, é na pasta searchplugins do firefox. Blz?

Feito isso é só reiniciar o firefox e verificar se consta na lista o google-jalive


Abraços! :)

Receita de Vatapá Baiano em Java

Pegando um gancho na receita da Família de Obi-Allan Kenobi, tentei recriar esta em Java, como o mesmo havia dito, ficou um pouquinho grande, mas em relação ao entendimento acho que consegui manter o nível necessário para o propósito desse blog, tentei seguir as explicações originais da receita e construir a implementação desse delicioso prato típico, o Vatapá.

public class Pao {
private Double quantidade;
private Double dureza;

public Pao(Double quantidade, Double dureza) {
this.quantidade = quantidade;
this.dureza = dureza;
System.out.println(this.quantidade + " pães");
}

public Double getDureza() {
return dureza;
}

public void setDureza(Double dureza) {
this.dureza = dureza;
}

public Double getQuantidade() {
return quantidade;
}

public void setQuantidade(Double quantidade) {
this.quantidade = quantidade;
}

public Pao getPapaDePaoMole(){
System.out.println("amolecendo o pão com leite de côco");
LeiteCoco leiteCoco = new LeiteCoco(this.quantidade);
leiteCoco.amolecerPao(this);
return this;
}
}

public class LeiteCoco {
private Double quantidade;

public LeiteCoco(Double quantidadePao) {
this.quantidade = quantidadePao/5;
System.out.println(this.quantidade + " litro(s) de leite de côco");
}

public Double getQuantidade() {
return quantidade;
}

public void setQuantidade(Double quantidade) {
this.quantidade = quantidade;
}

public void amolecerPao(Pao pao){
Double dureza = pao.getDureza();
System.out.println("o pão já está quase amolecido...");
while(dureza > 0.2){
dureza -= 0.25;
pao.setDureza(dureza);
}
System.out.println("o pão já está pronto, mais mole que isso vai virar sopa hehehe");
}
}

public class Cebola {
private Double quantidade;
private Double partes;

public Cebola(Double quantidadePao) {
this.quantidade = (quantidadePao*2)/5;
this.partes = quantidade;
System.out.println(this.quantidade + " Cebolas");
}

public Double getQuantidade() {
return quantidade;
}

public void setQuantidade(Double quantidade) {
this.quantidade = quantidade;
}

private void cortarCebola(){
System.out.println("Cortando as Cebolas");
while((this.partes/this.quantidade) < 25){
this.partes *= 2;
}
System.out.println("Cebolas prontas e bem cortadas");
}

public Cebola getCebolaCortada(){
cortarCebola();
return this;
}
}

public class Alho {
private Double quantidade;
private Double partes;

public Alho(Double quantidadePao) {
this.quantidade = (quantidadePao*6)/5;
this.partes = quantidade;
System.out.println(this.quantidade + " Alhos");
}

public Double getQuantidade() {
return quantidade;
}

public void setQuantidade(Double quantidade) {
this.quantidade = quantidade;
}

private void cortarAlho(){
System.out.println("Cortando os Alhos");
while((this.partes/this.quantidade) < 4){
this.partes *= 2;
}
System.out.println("Alhos prontos e bem cortados");
}

public Alho getAlhoCortado(){
cortarAlho();
return this;
}
}

public class CamaraoSeco {
private Double quantidade;
private Boolean descascado = false;

public CamaraoSeco(Double quantidadePao) {
this.quantidade = (quantidadePao*250)/5;
System.out.println(this.quantidade + " Gramas de Camarão seco");
}

public Double getQuantidade() {
return quantidade;
}

public void ajustarQuantidadeProporcional() {
this.quantidade = (this.quantidade*100)/250;
System.out.println("dessa segunda porção precisaremos apernas de " +this.quantidade + " Gramas para ser adicionados depois");
}

public void setQuantidade(Double quantidade) {
this.quantidade = quantidade;
}

public Boolean getDescascado() {
return descascado;
}

public void setDescascado(Boolean descascado) {
this.descascado = descascado;
}

public void descascarCamaraoSeco(){
System.out.println("Descascando o Camarão seco");
this.descascado = true;
System.out.println("Camarão seco descascado e pronto para usar");
}
}

public class Amendoim {
private Double quantidade;
private Boolean torrado = false;

public Amendoim(Double quantidadePao) {
this.quantidade = (quantidadePao*250)/5;
System.out.println(this.quantidade + " Gramas de Amendoim");
}

public Double getQuantidade() {
return quantidade;
}

public void setQuantidade(Double quantidade) {
this.quantidade = quantidade;
}

public Boolean getTorrado() {
return torrado;
}

public void setTorrado(Boolean torrado) {
this.torrado = torrado;
}

public void torrarAmendoim(){
System.out.println("Torrando o Amendoim");
this.torrado = true;
System.out.println("Amendoim torrado e pronto para usar");
}
}

public class CastanhaCaju {
private Double quantidade;
private Boolean torrado = false;

public CastanhaCaju(Double quantidadePao) {
this.quantidade = (quantidadePao*250)/5;
System.out.println(this.quantidade + " Gramas de Castanha de Caju");
}

public Double getQuantidade() {
return quantidade;
}

public void setQuantidade(Double quantidade) {
this.quantidade = quantidade;
}

public Boolean getTorrado() {
return torrado;
}

public void setTorrado(Boolean torrado) {
this.torrado = torrado;
}

public void torrarCastanhaCaju(){
System.out.println("Torrando a Castanha do Caju");
this.torrado = true;
System.out.println("Castanha do Caju torrada e pronta para usar");
}
}

public class AzeiteDende {
private Double quantidade;
public Double temperatura = 16.0;
public Boolean muitoQuente = false;

public AzeiteDende(Double quantidadePao) {
this.quantidade = (quantidadePao*1.5)/5;
System.out.println(this.quantidade + " litro(s) de Azeite de Dendê");
}

public Double getQuantidade() {
return quantidade;
}

public void setQuantidade(Double quantidade) {
this.quantidade = quantidade;
}
}

public class Gengibre {
private Double quantidade;
private Boolean ralado = false;

public Gengibre(Double quantidade) {
this.quantidade = quantidade;
System.out.println(this.quantidade + " Gramas de Gengibre (esta medida é a gosto)");
}

public Double getQuantidade() {
return quantidade;
}

public void setQuantidade(Double quantidade) {
this.quantidade = quantidade;
}

public void ralarGengibre(){
System.out.println("Ralando o Gengibre");
this.ralado = true;
System.out.println("Gengibre ralado e pronto para usar");
}
}

public class Sal {
private Double quantidade;

public Sal(Double quantidade) {
this.quantidade = quantidade;
System.out.println(this.quantidade + " Gramas de Sal (esta medida é a gosto)");
}

public Double getQuantidade() {
return quantidade;
}

public void setQuantidade(Double quantidade) {
this.quantidade = quantidade;
}
}

public class Liquidificador {

public Liquidificador() {
System.out.println("Ligando o Liquidificador...");
}

public Massa baterMassa(Pao pao, Cebola cebola, Alho alho, CamaraoSeco camaraoSeco, Amendoim amendoim, CastanhaCaju caju, Gengibre gengibre, Sal sal){
System.out.println("batendo a massa...");
return new Massa(pao, cebola, alho, camaraoSeco, amendoim, caju, gengibre, sal);
}
}

public class Massa {
String situacaoDaMassa = "";
Double ponto = 2.0;

public Massa(Pao pao, Cebola cebola, Alho alho, CamaraoSeco camaraoSeco, Amendoim amendoim, CastanhaCaju caju, Gengibre gengibre, Sal sal) {
this.situacaoDaMassa = "Massa em fase de preparação!!!";
}

public String getSituacaoDaMassa() {
return situacaoDaMassa;
}

public void setSituacaoDaMassa(String situacaoDaMassa) {
this.situacaoDaMassa = situacaoDaMassa;
}

public Double getPonto() {
return ponto;
}

public void setPonto(Double ponto) {
this.ponto = ponto;
}
}

public class PanelaGrande {

public PanelaGrande() {
System.out.println("Colaca a panela no fogo");
}

public void esquentarAzeiteDende(AzeiteDende azeiteDende){
System.out.println("Esquentando o Azeite de Dendê");
while(!azeiteDende.muitoQuente){
if(azeiteDende.temperatura > 90){// heheh
azeiteDende.muitoQuente = true;
System.out.println("Azeite de Dendê ja está no ponto, agora joga a massa p dentro da panela hhehe... aos poucos é claro");
}
azeiteDende.temperatura += 2.5;
}
}

public void colocarMassaAosPoucos(Massa massa){
System.out.println("colocando a massa, aos poucos, e mexendo a gororoba que formou hehehehe");
}

public void colocarCamaraoDescascado(CamaraoSeco camaraoSeco){
System.out.println("agora adicionado mais "+camaraoSeco.getQuantidade()+" de camarao seco descascado... deve tar um cheiro só kkkkkkkkkkkkkkkkkkk");
}

public void etapasFinais(Massa massa){
System.out.println("Continue mexendo até que a mistura solte, sem dificuldades, da panela.");
Double ponto = massa.getPonto();
while(ponto < 10){
ponto += 1;
massa.setPonto(ponto);
if(ponto == 8){
System.out.println("Já está quase no ponto, mexa só mais um pouquinho.");
}
}
massa.setSituacaoDaMassa("vatapa Pronto");
System.out.println(massa.getSituacaoDaMassa());
}
}

public class Vatapa {
public static void main(String[] args) {
System.out.println("\n\n iniciando o preparo do vatapá\n\n");
Pao pao = new Pao(5.0,2.3);
pao = pao.getPapaDePaoMole();
Cebola cebola = new Cebola(pao.getQuantidade());
Alho alho = new Alho(pao.getQuantidade());
CamaraoSeco camaraoSeco = new CamaraoSeco(pao.getQuantidade());
CamaraoSeco camaraoSecoDescascado = new CamaraoSeco(pao.getQuantidade());
camaraoSecoDescascado.ajustarQuantidadeProporcional();
camaraoSecoDescascado.descascarCamaraoSeco();
Amendoim amendoim = new Amendoim(pao.getQuantidade());
amendoim.torrarAmendoim();
CastanhaCaju castanhaCaju = new CastanhaCaju(pao.getQuantidade());
castanhaCaju.torrarCastanhaCaju();
AzeiteDende azeiteDende = new AzeiteDende(pao.getQuantidade());
Gengibre gengibre = new Gengibre(5.0);
gengibre.ralarGengibre();
Sal sal = new Sal(5.0);

Liquidificador liquidificador = new Liquidificador();
Massa massa = liquidificador.baterMassa(pao, cebola, alho, camaraoSeco, amendoim, castanhaCaju, gengibre, sal);

PanelaGrande panelaGrande = new PanelaGrande();
panelaGrande.esquentarAzeiteDende(azeiteDende);

panelaGrande.colocarMassaAosPoucos(massa);
panelaGrande.colocarCamaraoDescascado(camaraoSecoDescascado);

panelaGrande.etapasFinais(massa);

}
}

Allan, espero ter mantido a mesma qualidade da receita de sua familia e aproveitando o embalo, só falta agora vc convidar a galera pra esperimentar este prato, pois não tenho dúvida que todos ficamos com agua na boca so em ler esta receita hehehe...

"editado"
...quem enxergar alguma melhoria para o código acho interessante a postagem da mesma, o blog agradece.

download do código fonte

Esse Aqui Eu Recomendo: VLC

Mais um software para a nossa lista: VLC. Para quem não conhece o VLC é um tocador multimídia opensource (MPEG-1, MPEG-2, MPEG-4, DivX, mp3, ogg, ...), CD, DVD e alguns protocolos de streaming.
Eu, particularmente, utilizo o VLC para assistir DVDs, já que ele trabalha com ISOS e legendas super bem. Além de opensource o VLC é multi-plataforma, permitindo que você o utilize em diversos sitemas operacionais. Para fazer o download do VLC utilize esse link.
neste link você pode conferir a lista completa de funcionalidades do VLC, comparadas por cada sistema operacional que ele roda.
É possível utilizar o VLC também como um servidor de stream, eu não testei essa funcionalidade ainda, segundo esse link aqui.
Para saber mais sobre como usar o VLC Media Player acesse os links abaixo: