Seria um JavaBean um "objeto" real?

6 respostas
hlegius

Tá legal. O título ficou super estranho, mas calma, eu explico !

Papo é o seguinte: olhei aqui no fórum um tópico que fala sobre o Javabeans e tem um um wiki na wikipedia falando sobre também.

Pelo que entendi, basicamente ele tem os getters e setters da entidade com um construtor vazio. Algo como:

public class Produto {
private String nome;
private int codigo;

public Produto() {
}

public void setNome(String nome) {
this.nome = nome;
}

public void setCodigo(int cod) {
this.codigo = cod;
}

public String getNome() {
return this.nome;
}...

Só que a minha dúvida é mais pro lado de OO do que outra coisa. Para esse Bean, eu tenho uma "classe" de ação, como por exemplo uma classe Inventario, logo, a Inventario.adiciona() aceitaria esse Bean Produto como parametro e por este motivo a Inventario.listar() retornaria uma coleção de Produto[*] (beans).

Até aqui tudo legal, só que pensem comigo: quando eu vou numa loja comprar um produto eu não "entrego" um "objeto" Produto para receber os produtos que casam com meus critérios, eu passo "especificações" e daí sim o Inventario me retorna objetos Produto[*], certo ?

Logo, penso que se Produto é um "objeto" real do produto que estou indicado, eu teria que ter uma classe ProdutoSpec para indicar nela os atributos que eu possa usar como referência para pesquisa como nome ou validade, e alguns outros como o "codigo" diretamente no Bean Produto.

Ou será que estou complicando algo que é simples ? :roll:

Se alguém puder me dar uma iluminada aí, ficaria grato !

Abraços!

6 Respostas

Paulo_Silveira

ola!

muita gente critica essa formula de java bean, quando aplicada sem pensar. de uma olhada:
http://blog.caelum.com.br/2006/09/14/nao-aprender-oo-getters-e-setters/
http://fragmental.com.br/wiki/index.php?title=Fantoches

Acho que é o que voce esta procurando

celso.martins

Cara, acho que a sua dúvida casa bem com os comentários desse post no blog do Shoes. Dá uma olhada, principalmente, nos comentários do Diego Carrion e na ultima resposta do Shoes a ele (a penultima dos comentários).

A OO te leva ao mapeamento mais próximo do mundo real. O que não significa exatamente.

Esse é um dos pontos onde tenho mais dúvidas, isto é, definir o que é responsabilidade de quem. Por exemplo: Um objeto é responsável por emitir um relatório de si mesmo? Eu creio que não. Assim eu crio uma classe ReportBuilder que vai manipular meus objetos de negocio e a minha lógica de criação de relatório. Não sei se está certo, mas tem funcionado na manutenção (flexibilidade).

Em compensação, um objeto é responsável por informar o seu estado à quem o esteja manipulando? Creio que sim. Então crio métodos que informem o estado aos cabras que queiram saber.

Para mim, ainda não é simples. Mas creio que o caminho seja esse.

Abraços

hlegius

Paulo e celso.martins,

Muito obrigado pelos links e comentários a respeito. Realmente abriu minha mente esses posts e wiki. Em vista disto, estou tentando adequar minhas idéias com o proposto (e correto). Gostaria aqui de colocar minha idéia rápida sobre duas classes: Produto e Pedido. Posso ? Vamos lá...

class Produto {
	private $id;
	private $nome;
	private $preco;
	private $quantidade;
	private $status;

	public function __construct($id = null, $nome = null, $preco = null, $qty = null) {
		$this->id = $id;
		$this->setNome($nome);
		$this->preco = (float)$preco;
		$this->quantidade = (int)$qty;
    }

	public function temEstoque() {
		$this->verificaQuantidade();
		if($this->status == ProdutoStatus::DISPONIVEL) {
			return true;
        }else{
			return false;
		}
    }
	
	private function verificaQuantidade() {
		if($this->quantidade > 0) {
			$this->status = ProdutoStatus::DISPONIVEL;
        }else{
			$this->status = ProdutoStatus::FALTA;
		}
    }

	public function setNome($n) {
		$this->nome = $n;
    }
	public function getNome() {
		return $this->nome;
    }
	public function getPreco() {
		return $this->preco;
    }
	public function getQuantidade() {
		return $this->quantidade;
    }

e a Pedido:

class Pedido {
	private $numero;
	private $status;
	private $produto;
	
	public function __construct($numero = null) {
		$this->numero = (is_null($numero)) ?  rand(1,100) : $numero;
		$this->status = PedidoStatus::ANDAMENTO;
    }
    
	public function adiciona(Produto $pdr) {
		if($pdr->temEstoque()) { // verifico se tem estoque primeiro :)
			$this->produto[] = $pdr;
		}
    }

	public function finalizar() {
		$this->status = PedidoStatus::FINALIZADO;
		// persiste as infos no database...
    }

	public function cancelar() {
		$this->status = PedidoStatus::CANCELADO;
		// se eu fosse salvar o motivo do cancelamento, outra Classe ? PedidoCancelado ?
    }

	public function buscar() {
		// resgata pedidos da base de dados (persistencia)

		return $this->produto; // retorna um array
    }
}

o teste:

$pdr = array();
$pdr[]	= new Produto(null, 'Produto XPTO', 13.90, 6);
$pdr[]	= new Produto(null, 'Outro Produto', 9.99, 10);
$pdr[]	= new Produto(null, 'Outro Produto', 9.99, 1);

$pedido = new Pedido();

foreach($pdr as $produto) {
	$pedido->adiciona($produto);
}

e a saída:

[img]http://helio.hlegius.pro.br/imagens/oop/saida_programateste.png[/img]

Peço desculpas por não construir em Java, é que implementei em PHP para verificar a idéia dos ProdutoStatus::DISPONIVEL para verificar se rolava no php também e daí acabei por não reescrevendo a mesma app em Java... mas acho que dá para entender o funcionamento, se for o caso, reescrevo em Java, sem crises... :lol:

O que vocês acham ? Seriam uma implementação válida ou ainda tá uma programação procedural dentro de classes ?

Obrigado a todos pela ajuda =)
Abraços!

blackfalcon

Pessoal, ja li varias vezes sobre esse JavaBeans mas nunca parei para ver o que é… isso ai é alguma IDE?

Abraços

B

JavaBeans são componentes reutilizáveis de software que podem se manipulados visualmente com a ajuda de uma ferramenta de desenvolvimento.

Também é um anti-pattern na programação orientada a objetos, quando tentamos usar os objetos somente como estruturas que guardam dados, sem que eles tenham qualquer comportamento. Ou seja, é tentar programar proceduralmente/imperativamente em linguagens orientadas a objetos.

hlegius

blackfalcon,

Dê uma lida na definição lá na wikipedia: http://pt.wikipedia.org/wiki/JavaBeans
Acho que ajuda a clarear tuas idéias.

Criado 3 de outubro de 2008
Ultima resposta 4 de out. de 2008
Respostas 6
Participantes 5