Seria um JavaBean um "objeto" real?

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:

[code]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;
}…[/code]

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!

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

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

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á…

[code]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;
}[/code]

e a Pedido:

[code]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
}

}[/code]

o teste:

[code]$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);
}
[/code]

e a saída:

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!

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

Abraços

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.

blackfalcon,

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