1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Críticas e sugestões sobre a arquitetura e modelagem do meu software

Vou descrever a arquitetura usada em um software que eu sozinho fiz recentemente e gostaria que vocês me mostrassem alguns erros meus e locais em que posso melhorar. Peço para não se prenderem ao uso ou não de frameworks e sim a conceitos. Desde já, muito obrigado pela ajuda !

No meu software java desktop, eu tenho um pacote view que contem todas as telas do meu software e pertence a camada de apresentação. Digamos a tela Frm_cadastrar_venda (Tela usada para registrar uma venda). No botão "Vender" tenho o seguinte código:

Venda v=new Venda();
v.setProduto((Produto)cmb_produto.getSelectedItem());
v.setData(txt_data.getText());
v.setFormaPagamento((FormaPagamento)cmb_forma_pagamento.getSelectedItem());
v.setQuantidade(Integer.valueOf(txt_quantidade.getText()));
v.setValor(txt_preco_vendido.getText().replaceAll(",","."));
v.setVendedor((Vendedor)cmb_vendedor.getSelectedItem()):
v.adicionaVenda();

A classe Venda pertence a camada de Negócios (pacote model.business) e funciona de forma a tentar evitar o modelo anêmico, contudo não é imutável. É um javabeans (construtor default, getters, setters) mas que possui métodos que descrevem um comportamento de uma Venda, como o método adicionaVenda() que registra a venda na base de dados. Segue o código:

public class Venda //Alguns métodos e atributos foram ocultados para maior clareza do código
{
private final VendaDao dao;

    public Venda() 
    {
    this.dao=new VendaDao();
    }

    public void setData(String c)
    {
    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    sdf.setLenient(false);
      try 
      {
      Date d=sdf.parse(c);
      this.data=Calendar.getInstance();
      this.data.setTimeInMillis(d.getTime());
      }
      catch (ParseException ex) 
      {
      System.out.println("Erro dataErrada: "+ex.getMessage());
      }
    }

    public BigDecimal getValor() 
    {
    return this.valor;
    }

    public void setValor(BigDecimal valor) 
    {
    this.valor=valor;
    }

    public void setValor(String valor)
    {
    this.valor=new BigDecimal(valor);
    }

    public void adicionaVenda() 
    {
    this.dao.adicionaVenda(this);
    }

    public Produto getProduto() 
    {
    return this.produto;
    }

    public void setProduto(Produto produto) 
    {
    this.produto=produto;
    }

    public List<Venda> listaVendasPorProdutoEDiaDoMes(String mes, String ano) 
    {
    return this.dao.listaVendasPorProdutosEDiaDoMes(mes,ano);
    }

O atributo dao é um objeto da classe VendaDao. Ela pertence a camada de persistência (pacote model.dao) e tem o objetivo de armazenar métodos que manipulem o banco de dados, evitando chamar métodos de outros Daos. Segue o código:

public class VendaDao //Partes do código foram ocultadas para melhor clareza do mesmo.
{
private final Connection c;

    public VendaDao() 
    {
    this.c=ConnectionFactory.openConnection();
    }

    public void adicionaVenda(Venda v) 
    {
      try 
      {
      PreparedStatement stmt=this.c.prepareStatement("select cd_forma_pagamento "
      +"from forma_pagamento where lower(nm_forma_pagamento)=lower(?)");
      stmt.setString(1, v.getForma().getNomeForma());
      ResultSet rs=stmt.executeQuery();
        while(rs.next())
        {
        cdFormaPagamento=rs.getInt("cd_forma_pagamento");
        }
      //...
      stmt=this.c.prepareStatement("insert into venda...");
      stmt.setInt(1,cdFormaPagamento);
      //...
      stmt.executeUpdate();
      this.c.commit();
      stmt.close();
      rs.close();
      }
      catch (SQLException ex) 
      {
      System.out.println("Erro adicionaVenda: "+ex.getMessage());
        try 
        {
        this.c.rollback();
        }
        catch (SQLException e) 
        {
        }
      }
    }

Tenho também as classes Helper, por exemplo a classe DataHelper, que pertencem a camada de negócios (pacote model.business) que oferece métodos assim:

public static int converteNomeDoMesEmNumero(String mes)

Em quais pontos da estrutura do meu software eu posso melhorar ?

  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags java design-patterns arquitetura orientação-a-objetos otimização ou faça a sua própria pergunta.