Upload
kayo-rayner
View
146
Download
0
Embed Size (px)
DESCRIPTION
Abordagem da programação defensiva e suas forma de aplicação.
Citation preview
Programação Defensiva
Felype Tabosa, 7º semestre, Engenharia de Software
Kayo Rayner, 5º semestre, Engenharia de Software
Referências
CODE COMPLETE, 2ª EDIÇÃO. McConnell, Steve.
Exemplo de código em programação defensiva.
http://imasters.com.br/desenvolvimento/a-programacao-defensiva-
merece-um-nome-tao-ruim/
Origem da programação defensiva
Origina-se no conceito de direção defensiva do automobilismo que busca
evitar acidentes através de uma conduta de direção de automóveis
antecipando e buscando evitar possíveis situações de acidentes.
O que é programação defensiva?
Não é "O software faz, portanto funciona".
É a maneira de programar tentando prevenir que erros afetem o sistema.
É entender que seu código não é seguro o suficiente e que mesmo após
manutenções o código continuará a ser inseguro.
O que é programação defensiva?
"Um homem prevenido vale por dois".
"Seja uma pessoa prevenida, esteja sempre preparado para
acontecimentos inesperados“ Johnny De Carli
“Aquele que se empenha a resolver as dificuldades resolve-as antes que
elas surjam. Aquele que se ultrapassa a vencer os inimigos triunfa antes
que as suas ameaças se concretizem.” Sun Tzu - A arte da guerra.
Do que devemos proteger o código?
Entradas inválidas.
Eventos que "nunca acontecerão“
Erros de outros programadores.
Protegendo o programa de entradas
inválidas
Verifique os valores de todos os
dados de fontes externas.
Verifique os valores de todos os
parâmetros de entrada da rotina
Decida como irá tratar de
entradas incorretas.
"Aproveite bem as pequenas coisas; algum dia você vai descobrir que elas
eram grandes.“ Robert Brault.
" As grandes coisas não são feitas por impulso, mas através de uma série
de pequenas coisas acumuladas.“ Vincent van Gogh.
"As pequenas coisas fazem toda a diferença".
Assertivas
É um código usado durante o desenvolvimento(normalmente uma rotina
ou uma macro) que permite a um programa fazer sua própria verificação
enquanto é executado.
Assertivas são especialmente úteis em programas grandes e complexos, e
em programas de alta confiabilidade.
Assertiva
As assertivas podem ser usadas pra
verificar suposições como as seguintes:
Se o valor de um parâmetro de entrada(ou saída) cai dentro de seu
intervalo esperado.
Se um arquivo ou fluxo está aberto(ou fechado) quando uma rotin
começa a ser executada(ou quando ela acaba de ser executada).
Se um arquivo ou fluxo esta no início(ou no fim) quando uma rotina
começa a ser executada(ou quando ela acaba de ser executada).
- Se um ponteiro é não-nulo.
- Se um array ou outro contêiner passado para uma rotina pode conter
pelo menos um número X de elementos de dados.
- Se uma tabela foi inicializada para conter valores reais.
Exemplo em C++ de uma macro de
assertiva
Diretrizes para uso de assertivas
Use código de tratamento de erro para as condições que você espera
que ocorram; use assertivas para as condições que nunca devem ocorrer
Evite colocar código executável em assertivas
- Use assertivas para documentar e verificar
pré-condições e pós-condições
Para código altamente robusto, faça uma
assertiva...
... E depois trate o erro de qualquer
maneira
Técnicas de tratamento de erro
As assertivas são usadas para tratar de erros que nunca devem ocorrer no
código. As técnicas de tratamento de erro são usadas para tratar de erros
esperados.
Técnicas de tratamento de erro
Técnicas de tratamento de erro:
-Retornar um valor neutro
-Substituir pelos próximos dados válidos
-Retornar a mesma resposta da vez anterior
-Substituir pelo valor válido mais próximo
-Registrar uma mensagem de alerta em um arquivo de log
-Retornar um código de erro
-Configurar um valor de uma variavel de status
-Retornar o status como valor de retorno da função
-lançar uma exceçã usando o mecanismo de exceção interno da linguaguem
Exceções
As exceções são um meio específico pelo qual o código pode passar erros
ou eventos excepcionais ao código que o chamou.
A estrutura básica de uma exceção é que uma rotina usa throw para
lançar um objeto de exceção.
Exceções quando usadas com sabedoria reduzem a complexidade
porem quando usadas imprudentemente podem tornar o código quase
impossível de seguir.
Exceções
-Use exceções para notificar outras partes do programa sobre erros que
não devem ser ignorados
-Lance uma exceção somente para as condições que sejam realmente
excepcionais
-Não use uma exceção para se eximir da responsabilidade
-Evite lançar exceções em construtores e destrutores, a não ser que você
as capture no mesmo lugar
-Lance exceções no nível de abstração correto
Exceções
Exceções
-Inclua na mensagem de exceção todas as informações que levam à
exceção
-Evite blocos cacth vazios
Exceções
Conheça as exceções que seu código de biblioteca lança
-Considere a construção de um relator de exceção centralizado
Problemas com dados de entrada
Dados sujos.
Dados em limite de áreas seguras
Solução
Verificar a validade dos dados que entram em parte de risco do sistema.
Utiliza barricadas no seu programa.
Converter os dados de entrada, assim que possível.
Defenda seu programa com
barricada
O que é defender com barricadas
É evitar que dados “sujos”, atrapalhem o funcionamento total do software,
criar mecanismos(classes de validação) que detectem esses dados e os
trate antes de serem utilizados(classes internas).
Auxiliares de depuração
Em programação defensiva, utilizar os auxiliares de depuração, ajuda
bastante na busca e detecção de erro.
Com o auxiliar fica fácil identificar
Versão de:
produção X desenvolvimento
Programadores iniciantes, tendem a se limitar na versão de produção. Isso
ocasiona problemas. Pois eles devem saber que as duas versões são
diferentes. A versão de produção deve ser executada rápido a outra
pode ser lenta.
Deve-se utilizar meios na versão de desenvolvimento que se detecte erros
mais facilmente.
Saia da defensiva, vá para o ataque
Como atacar corretamente
“Não permitir que programadores habituem-se a apenas pressionar o
entra e escape do problema conhecido”
“Preencha toda a memória e descubra erros para alocação de
memórias.”
E como no futebol, sabemos que a boa defesa é o bom ataque. E se você
recuar na identificação dos erros, eles irão aparecer para o cliente.
Planeje e acerte
Como se planejar e evitar duplicações
ou erros?
Utilize ferramentas de controle de versão
Ferramentas internas como a Ant(ferramentas para compilar, montar,
testar e executar).
Crie seus pré-processadores.
Tutorial de como utilizar o Ant
Mas afinal, o quanto de programação
defensiva deve ser deixada no código?
A resposta...
“Um dos paradoxos da programação defensiva é que, durante o
desenvolvimento, você gostaria que um erro fosse perceptível – você
preferiria irritar-se com ele do que correr o risco de não percebê-lo. No
entanto, durante a produção, você preferiria que o erro fosse o mais
discreto possível.”
... Continuação. Veja técnicas
sugeridas
“Mantenha código que identifica erros importante”
Em quais áreas do seu programa, é permitido a existência de erros não-
detectados e os locais que não deve.
“Remova o código que identifica erro simples”
Registre os erros em arquivos de Logs. Em uma aplicação a parte gráfica é
aceitável algum erro, o que não é aceitável é erros de cálculos., a partir dos
dados externos
“Remova código que resulta em falhas sérias”
Faça com que o programa pare de rodar, imprima mensagem de errose gera
um log para enviar para o suporte.
Mas até quando ser defensivo na
programação defensiva?
Resposta
Você deverá planejar em quais pontos utilizar a programação defensiva.
Como já dito, na programação defensiva você irá produzir código para
utilizar seu próprio código e isso poderá causar lentidão – caso muito
código defensivo seja criado- no programa. Imagino como em um jogo de
futebol, o técnico não poderá colocar 8 jogadores para defender o lado
esquerdo do campo, por conta de um craque do outro time, pois o lado
direito irá ficar desprotegido e poderá perder a partida. Assim é na
programação, você deve saber dosar as áreas para inclusão da
programação defensiva.