Trabalhando com varias classes

6 respostas
J

Pelo fato de programar muito tempo com linguagens estruturadas as vezes tenho uma dificuldade enorme em dividir a minha aplicação em classes. Eu quero 3 classes

UMA PRINCIPAL que faz a interface gráfica
UMA CONECTA que faz a conexão com o banco de dados
UMA BANCO que pretendo fazer a inclusão alteração e consulta através desta. (no momento eu estou conectando e incluido na mesma classe mas vejo que não tem muito reuso).

a minha dúvida fica em como passar os parâmetros de uma classe para outra ou chamar os métodos de uma classe para outra. :roll:

A classe principal vai chamar a classe CONECTA esta deve devolver a CONEXÃO (connection)

após a conexão estabelecida tenho que chamar a classe BANCO para incluir no Banco de Dados
Passando como parâmetros os textField.getText();

Alguem pode me passar um exemplo somente como eu chamo essas classes e a assinatura de cada método das classes.

É isto mesmo ? certo ou errado ? aceito sugestões…

6 Respostas

B

Olá criança superpoderosa .:smiley:
Jo, aconselho vc a dar uma boa estudada em OO,. Vc precisa entender mais o uso de classes e objetos. Se vc ainda nao consegue dividir isso, quer dizer q vc ainda nao ta pensando em objeto, isso requer mais estudo em OO.

De qualquer forma, pra trabalhar com banco de dados existem varias frameworks, entre elas o Hibernate, que o pessoal tanto fala aqui. Esses frameworks tiram de vc todo o trabalho de criaçao do SQL, e vc trabalha somente com objetos. Dá uma procuraada no forum sobre isso. Alem do que, o Hibernate permite que sua aplicaçao seja portavel em banco de dados: uma vez feito pra acces vai funcionar em oracle, sql… apenas trocando a url de conexao.

Segue ai um exemplo de uma das mil formas que pode ser feita a divisao de conexao.

// minha tela, meu front end
public class Tela{
    
    private MinhaConexao conexao = null;
    
    private criaConexao(){
        if( conexao == null ){
            conexao = new MinhaConexao();
            conexao.conectar(usuario,senha);
        }
    }
    
    private void inlcuirUsuario(){
        
        MeuObjeto usuario = new MeuObjeto();
        usuario.setNome("Usuario1");
        usuario.setSenha("senha1");
        usario.insert(getDefaultConexao());
        
    }
    private MinhaConexao getDefaultConexao(){return conexao;}
}
// Meu controle de conexoes com o banco de dados
public class MinhaConexao{
    
    private Connection conexao = null;
    
    public MinhaConexao(){
        super();
    }
    public void conectar(String usuario, String senha){
        // Conexao com o banco aqui
        Connection conexao = getConnection(... // bla bla bla
    }
    public Connection getConexao(){
        return conexao;
    }
}
// Meu objeto pra trabalhar com os dados. Normalmente isso é o 
// representante da tabela , so que em objeto, onde cada field é uma 
// coluna com seu get e set.
public class MeuObjeto{
    
    private String nome = null;
    private String senha = null;
    
    public MeuObjeto(){
        super();
    }
    
    public void getNome(){return nome;}
    public void getSenha(){return senha;}
    public String setNome(String newNome){nome = newNome;}
    public String setSenha(String newSenha){senha = newSenha}
    
    public boolean insert(Connection conexao){
        return conexao.execute("INSERT INTO USUARIO_TABLE VALUES('"+getNome()+"', '"+getSenha()+"')");
    }
    
}
C

“joseneuza”:
UMA PRINCIPAL que faz a interface gráfica
UMA CONECTA que faz a conexão com o banco de dados
UMA BANCO que pretendo fazer a inclusão alteração e consulta através desta. (no momento eu estou conectando e incluido na mesma classe mas vejo que não tem muito reuso).

Vamos começar do começo: dê nomes aos bois. Mas nomes tem que ser nomes próprios, ou quando muito substantivos. Entao, renomeando as suas 3 classes:

  • InterfaceGrafica
  • Conexao
  • Banco

Ja melhorou um pouco. Mas, qual eh o relacionamento entre elas?

  • InterfaceGrafica utiliza uma Conexao para manipular dados
  • Conexao utiliza um Banco para… para o que?!

Epa. Pegamos um problema aqui. Qual a relacao entre Conexao e Banco? O que tem de tao especial em uma conexao ao banco de dados, quando o que eu quero eh manipular os dados?

De novo:

  • InterfaceGrafica utiliza um Banco para manipular dados
  • Banco utiliza a JDBC para manipular um recurso externo (o banco de dados, de fato)

Hmm, melhorou… mas vc nao acha esquisito uma InterfaceGrafica (que, como o nome diz, lida com o usuário) fazendo manipulacao de banco de dados? E se a gente separasse um pouco a apresentação e a manipulação dos dados? :smiley:

  • InterfaceGrafica utiliza uma Ação sempre que o usuário solicitar algo a ser feito.
  • Ação fala com o Banco, manipula dados, devolve resultados à InterfaceGrafica
  • Banco continua usando o bom e velho JDBC pra acessar o banco

…e assim vai. Quanto mais vc pensa e refina essa interação, mais claro fica saber quem, quando e onde fazer o que. Um jeito bom de chegar nesse resultado facinho é imaginar um diálogo entre os seus objetos.

<Usuario> InterfaceGrafica, me adicione um cliente!
<InterfaceGrafica> Vou criar uma nova Ação AdicionarCliente! Ação, execute!
<Ação> Alguém me dá um Banco pra eu trabalhar?
<ConnectionPool> Toma!
<Ação> Banco, insira esses dados aqui na tabela CLIENTES!
<Banco> Ok!
<Ação> InterfaceGráfica, toma o que vc pediu, gracinha! :wink:
<InterfaceGrafica> Obrigada! Ei Usuario, aqui está!
<Usuario> Brigadim! :smiley:

PS: fazer vozes esquisitas pra cada um dos personagens é estritamente opcional, mas fica bem engraçado, especialmente em reuniões onde tem gente engravatada :wink:

J

Bruno valeu as dicas. Realmente preciso estudar mais os conceitos OO, vou agora começar a dividir o meu programa que parece um Pascalzão em várias classes. Tenho trabalho para o dia todo

CV achei muito bom seu Post, muito divertido, e bem didático também. vc já pensou em ministrou cursos ?

Valeu as dicas a todos vcs do forum. :lol: :lol: :lol:

J

Lembra aquele problema eu tentei fazer o que esta com dividir em várias classes. Estou tentando fazer isto mas…
java.lang.NullPointerException
Algum objeto que eu estou usando e não foi instanciado, o problema é que não identifico qual… :?:

[color=“brown”]

MINHA INTERFACE GRÁFICA O BOTÃO SALVAR

private JButton getJButtonSalvar() {

if(jButtonSalvar == null) {

jButtonSalvar = new javax.swing.JButton(Salvar);

jButtonSalvar.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

Banco banco = new Banco();

banco.incluir(jTextFieldDialogEndFTPSara.getText(),jJTextFieldDialogUsuarioFTPSara.getText(),jTextFieldDialogServidorFTPSara.getText(),jTextFieldDialogPastaFTPSara.getText(),jTextFieldDialogEndFTPACF.getText(),jTextFieldDialogUsuarioFTPACF.getText(),jTextFieldDialogServidorFTPACF.getText(),jTextFieldDialogPastaFTPACF.getText());

}
});[/color]

MINHA CLASSE BANCO

[color=red]public class Banco {

 private MinhaConexao conexao = null;   public Banco() {

}
public void incluir(String endSara, String usuSara, String serSara, String pasSara, String endACF, String usuACF, String serACF, String pasACF) {

try {

Connection conexao = MinhaConexao.getConexao();  String insertString = " INSERT INTO parametros " +

" VALUES (?,?,?,?,?,?,?,?)";

PreparedStatement pstmt = conexao.prepareStatement(insertString);

pstmt.setString(1,endSara);

pstmt.setString(2,usuSara);

pstmt.setString(3,serSara);

pstmt.setString(4,pasSara);

pstmt.setString(5,endACF);

pstmt.setString(6,usuACF);

pstmt.setString(7,serACF);

pstmt.setString(8,pasACF);

pstmt.executeUpdate();

pstmt.close();

MinhaConexao.freeConexao(conexao);

}

catch ( Exception sqlex ) {

sqlex.printStackTrace();

}

}

}

[/color]

[color=“blue”]public class MinhaConexao{

//metodo conectar

public static Connection getConexao(){

Connection connection = null;

String url = jdbc:odbc:BancoDadosSRO;

String username = “”;

String password = “”;

try {

Class.forName( sun.jdbc.odbc.JdbcOdbcDriver );

connection = DriverManager.getConnection(url, username, password );			

}

catch ( ClassNotFoundException cnfex) {

System.err.println(Falhou a abertura do driver JDBC/ODBC. );

cnfex.printStackTrace();

System.exit( 1 );

}

catch ( SQLException sqlex ) {

System.err.println( Unable to connect );

sqlex.printStackTrace();

}

return connection;

}
public static void freeConexao(Connection connection)

throws SQLException {

connection.close();

}

}[/color]
B

Jo,
Passa o Exception COMPLETO… pq ai por ele tem como saber quem ta lançando essa exceção.

E tenta postar o seu codigo dentro da tag de codigo e identado… POR FAVOR!!.. :smiley:

Brigadu" :wink:

C

Isso aqui foi o fim da picada, Jo… pelo amor de deus, formata esse codigo direito! :x

Criado 4 de fevereiro de 2004
Ultima resposta 6 de fev. de 2004
Respostas 6
Participantes 3