Pergunta sobre C++

Programação C em geral

Moderadores: 51, guest2003

Pergunta sobre C++

Mensagempor joao » 04 Fev 2009 05:12

Ola Pessoal!

Acho que devo estar trabalhando muito, mas no momento não consigo imaginar uma solução para o que eu quero fazer:

Tenho uma classe CBancoDeDados que tem métodos como por exemplo:
SalvaCadastroUsuario
BuscaCadastroUsuario

Ela por sua vez tem que chamar métodos especificos para cada Banco de Dados, como por exemplo:
OpenDB;
Execute;
GetLastError;
CreateDataBase;

Mas todos esses métodos tem os mesmos nomes para cada suporte ao DB que eu irei fazer:
MySQL
SQL
SQLite
Por exemplo

Como eu faria na minha classe DataBase para ter uma variavel apontando para o correto Banco de Dados e dai eu não precisar fazer algo do tipo:
if(SQLite_flag == 1)
//executa SQLite
else if(SQL_flag == 1)
// executa SQL
else
//executa MySQL

Lembrem-se: Todas as classes referentes aos Banco de Dados tem o mesmo nome. Eu queria algo do tipo na inicializacao:
void *handle;
if(SQLite_flag == 1)
handle = SQLite
else if(SQL_flag == 1)
handle = SQL
else
handle = MySQL

E dai quando fizer um Connect eu apenas faria:
handle->Connect();

Pois todas as classes teriam o mesmo nome.

Espero que tenham entendido! :)

PS: Tentei usar o void *, mas está dando um erro muito estranho.

Obrigado,
Joao
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor joao » 04 Fev 2009 08:30

ok!

Descobri como fazer.
Tenho que declarar uma interface:
interface BancodeDadosInterface
{
OpenDB;
Execute;
GetLastError;
CreateDataBase;
};

e dai na criação das classes dos CMysql ou CSqlite eu faço
class CMysql : BancodeDadosInterface
{
OpenDB;
Execute;
GetLastError;
CreateDataBase;
};


Dai lá no código do BancodeDados eu faço:

CBancodeDadosInterface *tmp = new CMysql ();
ou
CBancodeDadosInterface *tmp = new CSQLite();


Dai td vai ser usado apenas chamando o tmp.

Eu poderia usar tambem uma classe e herdaria esta classe. Mas como no meu caso TODOS os métodos são identicos, a melhor solução seria essa.

Fica ai para quem algum dia precisar! :)

[]'s
Como já diria um grande amigo: Só sei que nada sei!!!
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor ivan » 04 Fev 2009 10:37

joao wrote:
Eu poderbia usar tambem uma classe e herdaria esta classe. Mas como no meu caso TODOS os métodos são identicos, a melhor solução seria essa.


Na minha opinião, o seu problema só deve ser resolvido por herança, justamente pelo motivo q vc mesmo citou e eu grifei acima. Faz um casting pra classe PAI e executa o método direto.

Uma Interface so é usada qdo classes de hierarquias diferentes compartliham alguns métodos, ou seja, tem uma interface em comum:
Ex:
- Carro de corrida x Carro de brinquedo
- Asa Delta x Planador, etc

Tb não criaria métodos do tipo: "SalvaCadastroUsuario"; na Classe de Banco de Dados pq assim sugere métodos para q cada tabela, ou cadastro, acesse aos dados(imagine um BD com 2000 tabelas com tantos métodos na Classe BD?), qdo as operações de BD são Insert, Update e Delete. Teria por exemplo:
Usuario - ligado a GUI, com as sua validaçoes
UsuarioDB - Ligado a tabela no BD para serializar o conteudo do usuario GUI
==== com os metodos insert, update e delete
CBancoDados - somente com o execute, rollbcak e commit, etc...

[/b]
"A mente que se abre a uma nova idéia jamais volta ao seu tamanho original." (Albert Einstein).
Avatar do usuário
ivan
Word
 
Mensagens: 618
Registrado em: 12 Out 2006 21:27

Mensagempor joao » 04 Fev 2009 11:17

Ola Ivan,

Sim, pode ser uma classe pai e cada uma delas pode ser uma filha da classe pai.
Dai quando for usar o código pai, pode criar como sendo classes filhas já que eu fiz a herança.

Pelo o que o pessoal me explicou aqui, a Interface é usada para compartilhar os métodos e não variáveis, que é o meu caso. Não sei se isso procede. Se sim, dai para mim seria mais interessante fazer Interface, porque só vou usar os métodos em comum, não as variáveis. E desculpe, eu fiz um erro ali na parte que vc grifou, eu queria dizer que todos os métodos são identicos, mas o código dentro do método é diferente.

Quanto a classe CBancoDados é que na verdade essa classe vai processar td referente ao Banco de Dados(Porque já estava ficando muito zoneado nas outras classes essa parte) e as classes CMySQL e CSQLite é que terão os execute, commit, rollback e etc...

Por exemplo, tenho uma chamada que era retornar chamada de usuário por semana, por dia, por hora, por ano, por qualquercoisa. Se eu fizesse isso na camada acima do CBancoDeDados, o arquivo estaria com aproximadamente 5000 linhas de código. É muita coisa dai. Por isso que eu decidi criar a classe CBancoDados e nela terá retornausuariosemana(),retornausuariodia() e etc...

Isso é só um exemplo, pois sei que poderia fazer diferente, mas é que no momento só me veio este exemplo no momento! :D

Mas fica aqui as dicas!

[]'s
Como já diria um grande amigo: Só sei que nada sei!!!
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor Jorge_Francisco » 04 Fev 2009 13:17

Poderia usar herança para que as filhas herdassem os métodos do pai e criaria uma função virtual, que mesmo com o mesmo nome na classe filha identica ao da classe pai, seria carregada a função da filha.
Avatar do usuário
Jorge_Francisco
Dword
 
Mensagens: 1009
Registrado em: 12 Out 2006 09:53
Localização: Rio de Janeiro

Mensagempor Jorge_Francisco » 04 Fev 2009 13:22

Bom, sobre retornar por semana,dia, mês ou usa um switch na escolha e manda uma string diferente para o execute, ou então cria uma procedure no MySQL e deixa o banco de dados cuidar disso.

Vlw
Avatar do usuário
Jorge_Francisco
Dword
 
Mensagens: 1009
Registrado em: 12 Out 2006 09:53
Localização: Rio de Janeiro

Mensagempor ivan » 04 Fev 2009 21:08

joao wrote:
...métodos são identicos, mas o código dentro do método é diferente.


É para isso que se usa a herança,.pois com ela aplica-se o polimorfismo (http://pt.wikipedia.org/wiki/Polimorfismo)

Qto a herdar as variáveis/métodos é possivel restringir sim o acesso de classes filhas a elas, basta declara-las como private. Outro ponto crucial é q todos os acessos a variáveis só podem ser realizados por métodos setter/getter. Variáveis públicas nem pensar!
http://www.cprogramming.com/tutorial.html

Interfaces são usadas somente no caso q comentei anteriormente, em classes de hierarquias diferentes q compartilham um mesmo comportamento.
Golfinhos x Tubarões: Ambas nadam, vivem na agua mas pertencem a hierarquias diferentes. Nadar seria a interface entre elas.

Uma classe q faz tudo, como a CBancoDados, é frontalmente contra o principio da especialização tão preconizada pela OO.
Por exemplo, uma classe abstrata EntidadeDB que defina os métodos e variaveis - repare q não estou falando em tabelas pq pode haver agregações e outras - para que as classes que descrevam os objetos a serem armazanados no BD herdem dela sobrescrevendo-os ou estendendo-os. Ou seja, a pulverização de classes é natural e facilita a manutenção tendo em vista q esta é feita na classe referente ao assunto da qual ela trata.

Padrões de Projeto
http://pt.wikipedia.org/wiki/Padr%C3%B5 ... e_software
"A mente que se abre a uma nova idéia jamais volta ao seu tamanho original." (Albert Einstein).
Avatar do usuário
ivan
Word
 
Mensagens: 618
Registrado em: 12 Out 2006 21:27

Mensagempor joao » 05 Fev 2009 06:00

valeu pelas dicas.

Só gostaria de dizer que eu acabei de descobrir que em C++ não existe Interface ou extends. Neste caso sou obrigado a usar classes. :)

[]'s
Como já diria um grande amigo: Só sei que nada sei!!!
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21


Voltar para Visual C++/C/C++/C#

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x