Ir para conteúdo
Fórum Script Brasil
  • 0

Designs De Orientacao A Objeto


Thiago Alencar

Pergunta

Acho que muitos que colocam OO em pratica devem obter problemas similares a este..

Imagine a seguinte situacao:

tenho uma colecao de classes cada uma com suas especificas funcoes:

'colecao de classes--------------------INICIO

clsMssql > usada para conectar/manipular bds mssql

clsMysql > usada para conectar/manipular bds mysql

clsQualquer > qualquer outra classe

'colecao de classes----------------------FIM

e clsMainForm > aplicativo principal

Considerando:

-O clsMainForm utilizara uma classe de conexao(clsMssql ou clsMysql) E a classe "clsQualquer";

-A classe "clsQualquer" precisa utilizar uma conexao com o banco de dados para funcionar(eg.: clsMssql ou clsMysql)

A primeira vista, imagino que este seria o design apropriado:

clsMainForm tem uma conexao com o bd

clsMainForm tem uma clsQualquer

clsQualquer tem uma conexao com o bd

A relacao "has a" (tem um(a)) em OO se define declarando a mesma e instanciado-a. Porem:

a classe "clsQualquer" precisa utilizar a mesma classe de conexao que o clsMainForm. então como ela instanciara esta classe se somente a classe que a instancia esta ciente de qual classe de conexao usar?

I.E., como a classe "clsQualquer" ira declarar/instanciar uma classe de conexao, se ela não sabe qual das classes de conexao utilizar?

Logo, este "design" não parece correto. Sugestoes? ideias?

abracos!

Editado por Thiago Alencar
Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0

Neste caso você tem basicamente três opções:

1) Crie uma classe base (por exemplo, Conexão) e as classes clsMssql e clsMysql como classes derivadas desta. Daí ao declarar a propriedade você colocaria o tipo como Conexão e poderia atribuir a ele tanto um objeto clsMssql quanto um objeto clsMysql;

2) Criar uma interface (por exemplo, IConexão) e implementá-la nas duas classes (clsMssql e clsMysql). Depois declarar a propriedade com o tipo da interface e o esquema vai ser o mesmo na solução nº 1, ou seja, você poderá atribuir objetos que implementem esta interface à propriedade;

3) Usar duck-type (tipagem pato) declarando a propriedade como Object, à qual você poderá atribuir qualquer objeto.

Certo? ;)

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

A terceira opcao (Duck-type), procuro evitar pois não acredito ser um bom habito programar desta forma, uma vez que por exemplo, voce vai acabar so descobrindo se digitou um metodo incorretamente com erro em tempo de execucao (não na compilacao).

Enfim, acho q a primeria opcao seria a mais adequada.. dividindo a classe de conexao em duas (a base, sendo e.g. uma MustInherit) e as derivadas (MsSql e MySql) como voce disse..

já a segunda opcao não entendi pois não recordo mais como usar interfaces (acredito que seria a mesma coisa dessa 1a opcao não?).

obrigado!

Thiago.

Link para o comentário
Compartilhar em outros sites

  • 0
A terceira opcao (Duck-type), procuro evitar pois não acredito ser um bom habito programar desta forma, uma vez que por exemplo, voce vai acabar so descobrindo se digitou um metodo incorretamente com erro em tempo de execucao (não na compilacao).

É, porém em alguns casos a dinamicidade proporcionada compensa isso.

Enfim, acho q a primeria opcao seria a mais adequada.. dividindo a classe de conexao em duas (a base, sendo e.g. uma MustInherit) e as derivadas (MsSql e MySql) como voce disse..

já a segunda opcao não entendi pois não recordo mais como usar interfaces (acredito que seria a mesma coisa dessa 1a opcao não?).

Se existir bastante código comum entre as duas classes (ou seja, métodos em que não exista diferença no código de uma classe para outra), então prefira a primeira opção. Já se este não for o caso (ou seja, se as classes são completamente diferentes) então você pode usar uma interface. A interface é como um "esqueleto" da classe, nela você define quais métodos e propriedades a sua classe deverá implementar. Exemplo:

Public Interface IConexão
    Function Abrir() As Boolean
    Function AbrirTabela() As DataTable
    Sub Fechar()
End Interface
Daí ao fazer...
Public Class MySql
    Implements IConexão

... já serão gerados os métodos a serem implementados.

Certo? ;)

Graymalkin

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...