Padrões de Projeto

Ola galera!!..

Estou com duvidas em relação a padrões de projeto, estou estudando mas porem vejo que ainda tem muita coisa a aprender. Até comprei um livro sobre padrões de projeto para J2EE (Core) e sei que padrões de projeto não é um regra para o desenvolvimento do sistema, porem uma ajuda para deixar o software com “qualidade” necessaria (Caminhos da pedra)…rsrss

Entendo das divisões entre camadas e do atropelamento que não pode existir entre uma camada e outra, mas em relação as camadas de negocios tenho minhas duvidas: Vejo que padrões como Session Façade, Service Locator, Business Object e Transfer Object são para sistemas distribuidos e que usam EJB normalmente e é ai que começa minha duvida.

Estou desenvolvendo um softwarer pequeno, onde o meu banco fica juntamente com os aplicativo do sistema mas não estou vendo motivos para usar os padrões da camada de negocios pois o meu sistema não é distribuido então tenho a camada de visualização, servlets que fazem o controle do caminho a ser seguido e a camada de intregração que é onde esta os objetos DAO.

Na camada de visualização uso JSTL e não faço acesso a banco de dados eu apenas mostro os resultados que ficam armazenados nas minhas classes beans. Os servlets são responsaveis de receberem as solicitações e enviarem aos DAOs para o armazenamento permanente do dado ou entaum o envio da resposta para a visualização.

Agora vai a minha pergunta:

Com isso estou realmente usando padrões de projeto?

Sou obrigado a utilizar esses padrões de camada de negocios?

as minhas classes Beans são regra de negocios? onde elas se encaixam?

Posso utilizar os meus servlets recebendo requesições e chamando DAOs para o armazenamentos? Exemplo:


package br.pronto.atendimento.servlet;

import java.io.IOException;
import java.util.Collection;
import java.util.Date;
import java.text.SimpleDateFormat;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import br.pronto.atendimento.ConfUsua;
import br.pronto.atendimento.bean.Convenio;
import br.pronto.atendimento.dao.ConvenioDAO;
import br.pronto.atendimento.bean.Prestador;
import br.pronto.atendimento.dao.PrestadorDAO;
import br.pronto.atendimento.bean.Atendimento;
import br.pronto.atendimento.dao.AtendimentoDAO;
import br.pronto.atendimento.bean.Paciente;
import br.pronto.atendimento.bean.Usuario;

/**
 * Servlet implementation class for Servlet: Control_CadAte
 *
 */
 public class Control_CadAte extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
   static final long serialVersionUID = 1L;
   
    /* (non-Java-doc)
	 * @see javax.servlet.http.HttpServlet#HttpServlet()
	 */
	public Control_CadAte() {
		super();
	}   	
	
	/* (non-Java-doc)
	 * @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	}  	
	
	/* (non-Java-doc)
	 * @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession sessao = request.getSession(true);
		SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
		boolean save = false;
		
		Date date = new Date();
		Atendimento atendimento = new Atendimento();
		AtendimentoDAO atendimentoDAO = new AtendimentoDAO();
		Paciente paciente = new Paciente();
		Convenio convenio = new Convenio();
		Prestador prestador = new Prestador();
		Usuario usuario = (Usuario) sessao.getAttribute("usuario");
		paciente.setCd_paciente(Integer.parseInt(request.getParameter("cd_paciente")));
		atendimento.setPaciente(paciente);
		convenio.setCd_convenio(Integer.parseInt(request.getParameter("cd_convenio")));
		atendimento.setConvenio(convenio);
		atendimento.setDt_atendimento(format.format(date));
		prestador.setCd_prestador(Integer.parseInt(request.getParameter("cd_prestador")));
		atendimento.setPrestador(prestador);
		atendimento.setNr_guia(request.getParameter("nr_guia"));
		atendimento.setNr_carteira(request.getParameter("nr_carteira"));
		atendimento.setDt_validade(request.getParameter("dt_validade"));
		atendimento.setUsuario(usuario);
		
		save = atendimentoDAO.Save(atendimento);
		
		if(save == false)
		{
			RequestDispatcher dispatcher = request.getRequestDispatcher("salvo_atendimento.jsp");
			dispatcher.forward(request, response);
		}
		
		else
			response.sendRedirect("ErroUsuario.html");
		
		
	}
	
	public Collection<Convenio> ListaConvenio()
	{
		Collection<Convenio> listaConvenio;
		Convenio convenio = new Convenio();
		ConvenioDAO convenioDAO = new ConvenioDAO();
		listaConvenio = convenioDAO.SelectAll(convenio);
		
		return listaConvenio;
	}
	
	public Collection<Prestador> ListaPrestador()
	{
		Collection<Prestador> listaPrestador;
		Prestador prestador = new Prestador();
		PrestadorDAO prestadorDAO = new PrestadorDAO();
		listaPrestador = prestadorDAO.SelectAll(prestador);
		
		return listaPrestador;
	}
	
	public void Sessao(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		ConfUsua confUsua = new ConfUsua();
		confUsua.Sessao(request, response);
	}
}

Tenho muitas duvidas, mais vejo que isso é uma questão de orientação

Vejo a area de padrões de projeto como uma area muito legal e que te da o auxilio para desenvolver um software que tenha qualidade e também muita manutenibilidade.

Não se preocupe, está ótimo. Um sistema simples assim não precisa de design patterns JEE como os que você citou. Só precisa de divisão de camadas e bom senso. Eu vou até fazer uma confissão: a primeira vez em que eu construí um sisteminha desse, eu tinha acabado de ler o “Gang of Four”. Meu design ficou lindo, só que levou 3x o tempo que teria levado se eu tivesse feito como você: JSP, servlet, DAO, e beans. Se funciona e é fácil de manter, ótimo.

Elogios à parte, só vejo dois pontos de atenção:
[list]A navegação por enquanto é simples, então não foi necessário desacoplá-la da lógica de negócio. Conforme o número de páginas aumentar, você vai precisar usar um framework ou pelo menos um Mediator para despachar as requisições.[/list]
[list]Os métodos ListaConvenio() e ListaProvedor() parecem meio “soltos” ali no servlet. Pode ser melhor movê-los para uma classe helper que o JSP inicializa e chama.
[/list]

Agora, para responder sua pergunta: beans são estruturas de dados. Às vezes eles incluem métodos de validação, mas não chegam a ser regras de negócio.

[quote=rubinelli]
Agora, para responder sua pergunta: beans são estruturas de dados. Às vezes eles incluem métodos de validação, mas não chegam a ser regras de negócio.[/quote]

infelizmente…

Sim. Vc está usando, implicitamente, o padrão MVC para web

Não. Não é obrigado a usar padrões em nenhuma camada.
Mas tente fazer um sistema sem usar nenhum padrão…

Se os seus beans tem algum método além de get/set tlv sejam, caso contrario não.
Esse beans só com get/set são DTO (um padrão)

Sim. Tanto que pode que seu codigo funciona. ( Se funciona é porque pode)
Se deve ? isso é outra historia…

No seu codigo de exemplo não entendi poruqe vc faz tantos new.
Se o seu obtivo é criar o objeto a partir do ID chame o dao para obter o objeto do ID certo
Nenhum objeto deve set ID excepto o DAO. ID de persistência não é uma atributo da entidade.

[quote]Estou desenvolvendo um softwarer pequeno, onde o meu banco fica juntamente com os aplicativo do sistema mas não estou vendo motivos para usar os padrões da camada de negocios pois o meu sistema não é distribuido então tenho a camada de visualização, servlets que fazem o controle do caminho a ser seguido e a camada de intregração que é onde esta os objetos DAO.
[/quote]
Mas bem que vc poderia usar um Command(com o Mediator que o rubinelli falou).
Dá uma pesquisada sobre esses patterns aqui no GUJ, pq isso já foi bem explicado aqui. :wink: