Programação defensiva

Preview:

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.