AFINAL, COMO DEVO LIDAR COM OS ERROS?

MARCOS 19/11/2010 11:58:13
#357834
Boa tarde, colegas!
é impressionante, como existem dezenas de
temas em desenvolvimento em que , se você
comprar livros de TI ,fizer cursos,apostilas
perceberá que ninguém toca no assunto.O problema
é que quando nos deparamos com o desenvolvimento
[Ô]prático[Ô] de um software, estes problemas surgem.

Se algum colega puder me esclarecer:


1.) Todo software profissional, tem de fazer um Log
dos erros.Mas, pelas boas práticas de programação
este Log deve ser feito em um arquivo ou no SGBD que
minha aplicação estiver manipulando.Ou tanto faz???


2.) Digamos que eu tenha um programa (Orientado a Objetos), que consiste em um simples cadastro
de Clientes.Com duas classes: ClCliente e ClBD.A classe cliente, herda (Por herança) os métodos
de manipulação do SGBD . (Para fazer o CRUD no BD).Pergunto,o certo ,é usar o Try/Catch/End Try
nos métodos da classe ClBD ou os erros só devem ser tratados na classe ClCliente,que chamou a classe
ClBD????


3.) Se eu for tratar, somente na classe ClCliente,como eu poderei informar a classe ClCliente que houve um erro
na classe ClBD (Problema na conexão com o SGBD,por exemplo) ?



Agradeço qualquer orientação
LLAIA 19/11/2010 21:13:10
#357861
Bom tópico!

Quanto ao item 1 acredit que tanto faz com vai ser gravado, mas acredito que seria legal em outro BD, não no BD da aplicação.

Quanto a item 2 acho que a herança não se aplica bem ao caso. Os experts em POO dizem que só usamos herança quando a classe que extende é da mesma essência que a superclasse. O famoso exemplo: Aluno extends Pessoa, então Aluno é uma Pessoa.
MARCOS 20/11/2010 14:24:39
#357890
LLAIA, muito obrigado pela resposta.
No entanto, ainda não tenho uma resposta conclusiva
para nenhuma das 3 perguntas que faço. Se algum
colega, com experiência em OO, puder esclarecer
fico muito grato.
RODRIGOFERRO 20/11/2010 19:19:16
#357907
Resposta escolhida
Seguinte, Item 1, eu gravo em arquivos CSV pois caso perca a Conexao com o banco, ja era tua gravação de LOGS, e CSV dificilmente vai dar erro.

Item 2, Concordo com o que ja foi dito, herança nao se aplica bem a este caso, e sim cada classe fazer tua função, e voce ira tratar com TRY/CATCH e ira lançar a exception em cada try chamando a classe de LOGERROR.

Item 3 A Classe cliente ira ser chamada entes, caso de algum erro que impede a gravação, o erro sera gravado no log e o processo de inserção deverá ser abortado.

Eu estou finalizando a classe se erros, ela ta ficando boa, da pra chamar prum datagridview e da pra apagar todos os arquivos, a classe grava o seguinte,
Exception, Dia, Hora, Usuario, Tipo de Operação, Nome do Arquivo, Metodo e Linha.

Ainda tenho algumas implementações em mente, do tipo: tirar uma SS da tela e gravar, (no caso de erro em windows FORM) e mandar varios ou somente um erro por email ( no caso email do desenvolvedor)

Espero ter ajudado.
MARCOS 21/11/2010 10:54:43
#357921
Pessoal,
O colegqa ZEROCAL forneceu uma resposta para Pergunta 01 que fiz
muito boa ( Obrigado Zero Cal) !

No entanto ainda estou com dúvidas nas perguntas 2 e 3...


2.) Em termos de OO,Se como os colegas estão dizendo,o correto em uma situação de
cadastro ( ClCliente) , não é usar uma classe separada para manipular
o BD e sim fazer a classe executar esta função. Então... devo concluir
que em Classes de cadastro ( Cadatros de Clientes,Fornecedores,Produtos,etc...)
o certo é que estas classes contenham os métodos necesários para fazer
o CRUD, sem recorrer a uma classe de acesso a BD?????


3.) Do ponto de vista de OO, é correto criar uma classe de Erros separada,como sugere o
ccolega ZERCAL, e disparar esta classe ( No Catch do ClCliente) toda vez que houver
erro?????
FOXMAN 21/11/2010 12:45:24
#357925
Citação:

:
Seguinte, Item 1, eu gravo em arquivos CSV pois caso perca a Conexao com o banco, ja era tua gravação de LOGS, e CSV dificilmente vai dar erro.

Item 2, Concordo com o que ja foi dito, herança nao se aplica bem a este caso, e sim cada classe fazer tua função, e voce ira tratar com TRY/CATCH e ira lançar a exception em cada try chamando a classe de LOGERROR.

Item 3 A Classe cliente ira ser chamada entes, caso de algum erro que impede a gravação, o erro sera gravado no log e o processo de inserção deverá ser abortado.

Eu estou finalizando a classe se erros, ela ta ficando boa, da pra chamar prum datagridview e da pra apagar todos os arquivos, a classe grava o seguinte,
Exception, Dia, Hora, Usuario, Tipo de Operação, Nome do Arquivo, Metodo e Linha.

Ainda tenho algumas implementações em mente, do tipo: tirar uma SS da tela e gravar, (no caso de erro em windows FORM) e mandar varios ou somente um erro por email ( no caso email do desenvolvedor)

Espero ter ajudado.



Apenas uma conclusão ao comentário do amigo ZEROCAL.

Legal as implementações dos erros, eu já utilizo em meus sistemas o envio de todos os erros para meu email, tenho uma classe enviaErros, que já recebe todas as informações do erro(as já citada acima) , além da empresa onde ocorreu o erro.
Estou obtendo grandes resultados após essa implementação pois os erros identificados já corrijo imediatamente no sistema ficando disponível para a próxima atualização.

Quanto ao envio de um Screen do erro, estou pensando em implantar também, porém no meu caso não faz muito sentido, uma vez que tenho todas as informações necessárias para identificar os erros, Seria mais para uma possível contestação por parte do cliente.

Acredito que este seja um tópico de muito interesse para muitos, inclusive para mim...
RODRIGOFERRO 21/11/2010 15:52:29
#357927
seguinte, voce trabalha com cadastro de Pessoas, no caso Clientes e Fornecedores, entao voce cria a classe
PESSOAS onde eles compartilham algumas mesmas informações, NOME TELEFONE e etc, mas temos outras
informações que eles não compartilham Ex. no caso do cliente voce pode guardar quando ele fez a
ultima compra, e do fornecedor qual a data da ultima venda valor e etc entao voce poderia criar a
classe FORNECEDOR que ira pegar a herança da classe pessoa.
para entender o esquema que voce esta tentando entender, temos que recorrer aos frameworks, você ja leu
sobre o nHibernate ? e tem um gerador de codigo muito interessante que se chama MyGeneration, que é um
gerador de codigo para varios frameworks e qualquer tipo de trabalho que voce faça que seja
repetitivo, peço que dê uma lida para entender o que seria uma das dicas que eu posso te dar hoje.

Segue Link
http://www.macoratti.net/09/04/net_nhb2.htm

Outra dica amigo MARCOS, eu te vejo muito preucupado com erros, nao te preocupes, eles sempre irão
aparecer, seja por tua causa, por causa do pc do kra, ou por causa daquela peça que fique entre o
teclado e o monitor.. hahahah, cabe a voce decidir quais erros tu manda para o LOG e quais erros
voce taca na tela do cara, sabe aqueles do tipo [Ô]ESPORROBOX[Ô], mas gravar no log nao custa nada e
ajuda pacas, vide o testemunho do nosso amigo FOXMAN.

OFF: Grande FOXMAN, é um enorme prazer te ver por aqui rapaz, sempre te vejo ajudando o povo por
ai. Parabéns..
MARCOS 22/11/2010 12:34:03
#357969
Pessoal,
Cada vez que vocês respondem, eu aprendo algo novo.
Zero Call, vou seguir seu conselho e pesquisar sobre o Hibernate.
Mas, mesmo assim, correndo o risco de parecer chato.....eu
insisto numa pergunta ainda não respondida:

Eu devo ( Em uma classe de Clientes,fornecedores,etc...) fazer
o CRUD na mesma classe (ClCliente) , ou devo usar uma classe
separada só para manipulação do BD, instanciando esta classe
a partir da classe ClCliente?????
RODRIGOFERRO 22/11/2010 14:08:08
#357971
ok, só para desencargo de consciencia. [Ô]Hibernate[Ô] é para Java e [Ô]nHibernate[Ô] é para .NET.

Sobre sua questão, depende da forma como voce deseja trabalhar, mas agora voce disse a palavra chave [Ô]Instanciar[Ô], Vamos ao seguinte quadro.

eu Monto uma solução com a camada de dados (alias estude isso tambem, tem no macoratti, o termo é ([Ô]Camada de Dados[Ô], [Ô]Programação em camadas[Ô]), ela manipula o BD trata as consultas, na classe (Entidade ) dos clientes voce faz o seguinte, cria as propriedades, Nome, Telefone, e de la voce instancia e manipula o projeto do BD, EX; na Classe (Entidade ) Clientes voce cria uma função chamada LoadAll, que vai usar todos as propriedates da classe (Entidade ) e vai lhe retornar todos os clientes que tem cadastrado no banco de dados.

voce estudando o nHibernate irá entender melhor, Precisamente ESSE_LINK irá lhe esclarecer o que voce tem dúvidas.

Abraços
MARCOS 24/11/2010 14:21:48
#358118
Olá, Colegas !
Ja pesquisei sobre Programação em Camadas , conforme sugerido pelo colega ZEROCAL.
Mas, até onde pude entender .....eu recai no mesmo dilema.Pois...

Mesmo que eu crie uma [Ô]Camada de dados[Ô] , para lidar o o acesso e manipulação do BD.
Na prática eu vou estar utilizando uma classe a parte, para manipular o Banco. Ou seja,
vou ter que instanciar esta classe (Da camada de dados) na classe ClCliente e deste
modo usar herança.Continuo na dúvida...


Em um simples cadastro ( Clientes,Fornecedores,Produto,etccc...) eu devo fazer o CRUD
na classe ClCliente, ou devo sar uma classe de acesso aos dados separada.?????

Sim, pois criar uma classe separada para acesso aos dados, e fazer o mesmo usando uma camada
de acesso aos dados, na prática me parece a mesma coisa.Eu fico nesta dúvida, pois
já vi colegas afirmando que a classe tem de prover tudo o que precisa para realizar sua
tarefa . Pois se ficar na dependência de outra isto impede o seu reuso quando necessário.

Socorro, eu só quero usar OO do modo correto.....




RODRIGOFERRO 24/11/2010 15:56:17
#358130
Na prática parece a mesma coisa, mas é como te falei, se na entidade voce carrega todas as propriedades do cliente e chama a Função SaveOrUpdate da sua camada de dados, voce poderá usa-la para todas as entidades, e nao somente para uma, mas se colocar a função SaveOrUpdate direto na entidade cliente, tera que fazer isso para todas as entidades.

o Nhibernate faz exatamente dessa forma, voce cria a entidade e chama as funcoes dele.
Página 1 de 2 [11 registro(s)]
Tópico encerrado , respostas não são mais permitidas