42
Programação Defensiva Felype Tabosa, 7º semestre, Engenharia de Software Kayo Rayner, 5º semestre, Engenharia de Software

Programação defensiva

Embed Size (px)

DESCRIPTION

Abordagem da programação defensiva e suas forma de aplicação.

Citation preview

Page 1: Programação defensiva

Programação Defensiva

Felype Tabosa, 7º semestre, Engenharia de Software

Kayo Rayner, 5º semestre, Engenharia de Software

Page 2: Programação defensiva

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/

Page 3: Programação defensiva
Page 4: Programação defensiva

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.

Page 5: Programação defensiva
Page 6: Programação defensiva

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.

Page 7: Programação defensiva

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.

Page 8: Programação defensiva

Do que devemos proteger o código?

Entradas inválidas.

Eventos que "nunca acontecerão“

Erros de outros programadores.

Page 9: Programação defensiva

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.

Page 10: Programação defensiva

"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".

Page 11: Programação defensiva

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.

Page 12: Programação defensiva

Assertiva

Page 13: Programação defensiva

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.

Page 14: Programação defensiva

Exemplo em C++ de uma macro de

assertiva

Page 15: Programação defensiva

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

Page 16: Programação defensiva

- Use assertivas para documentar e verificar

pré-condições e pós-condições

Page 17: Programação defensiva

Para código altamente robusto, faça uma

assertiva...

Page 18: Programação defensiva

... E depois trate o erro de qualquer

maneira

Page 19: Programação defensiva

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.

Page 20: Programação defensiva

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

Page 21: Programação defensiva

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.

Page 22: Programação defensiva

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

Page 23: Programação defensiva

Exceções

Page 24: Programação defensiva

Exceções

-Inclua na mensagem de exceção todas as informações que levam à

exceção

-Evite blocos cacth vazios

Page 25: Programação defensiva

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

Page 26: Programação defensiva

Problemas com dados de entrada

Dados sujos.

Dados em limite de áreas seguras

Page 27: Programação defensiva

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.

Page 28: Programação defensiva

Defenda seu programa com

barricada

Page 29: Programação defensiva

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).

Page 30: Programação defensiva

Auxiliares de depuração

Em programação defensiva, utilizar os auxiliares de depuração, ajuda

bastante na busca e detecção de erro.

Page 31: Programação defensiva

Com o auxiliar fica fácil identificar

Page 32: Programação defensiva

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.

Page 33: Programação defensiva

Saia da defensiva, vá para o ataque

Page 34: Programação defensiva

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.

Page 35: Programação defensiva

Planeje e acerte

Page 36: Programação defensiva

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

Page 37: Programação defensiva

Mas afinal, o quanto de programação

defensiva deve ser deixada no código?

Page 38: Programação defensiva

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.”

Page 39: Programação defensiva

... 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.

Page 40: Programação defensiva

Mas até quando ser defensivo na

programação defensiva?

Page 41: 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.

Page 42: Programação defensiva