Recursividade na Programação
Por: andersoonwesley • 4/6/2018 • Trabalho acadêmico • 3.991 Palavras (16 Páginas) • 310 Visualizações
RECURSIVIDADE
Cesar Tegani Tofanini
Anderson Wesley Barbosa
Resumo
Neste trabalho são apresentados os conceitos relacionados à testabilidade de um software. As características desejáveis para se obter testabilidade são: controlabilidade, observabilidade, disponibilidade, simplicidade, estabilidade e informação, sendo que as mais importantes são controlabilidade e observabilidade. É apresentado o conceito de testabilidade de domínio, através das extensões de observabilidade e controlabilidade, assim como, o conceito de testabilidade como probabilidade de se revelar defeitos, que tem como base a ideia da perda de informação. Medidas para avaliar e aumentar o grau de testabilidade são discutidas através de exemplos práticos que podem ser aplicados no processo de desenvolvimento de um software.
Palavras-chaves: testabilidade, controlabilidade, observabilidade
1- Introdução
Recursão ou Recursividade é uma técnica na qual um subprograma chama a si mesmo, ou seja, uma função ou método que pode chamar a si mesmo para resolver um determinado problema. Toda recursividade é composta por um caso base e pelas chamadas recursivas, no caso base é simples, é usada uma condição em que se resolve o problema com facilidade e nas chamadas recursivas procuram simplificar o problema de tal forma que convergem para o caso base.
Nesse exemplo a seguir, fica fácil de entender como funciona a recursividade : Alguém te pergunta : Como faço para chegar na Avenida Jundiaí ? Neste momento você imagina mil formas de chegar até o determinado local, porém as direções podem ser muito complexas ou até mesmo você não tem a certeza de como chegar lá, poderia responder : Vá até a travessa da Avenida Nove de Julho com a Rua São Lazaro então lá pergunte como pode chegar a Avenida Jundiaí.
- 2- Conceitos e Definições
Alguma coisa é recursiva quando é definida em termos dela própria, o conceito da recursão traz a possibilidade de dar uma definição finita para um conjunto que pode ser infinito. Portanto recursividade é um termo usado de maneira mais geral para descrever o processo de repetição de um objeto de forma similar ao que já foi mostrado.
2.1- Características entre programação iterativa e recursiva
Tendo como base uma função fatorial podemos afirmar que a programação iterativa é executada mais rápida do que a programação recursiva, pois a recursiva precisa registrar o estado em que se encontra o processamento, de uma forma que ela possa continuar de onde parou após a conclusão de cada nova execução subordinada do procedimento recursivo.
Outro fator que nos leva a escolher um algoritmo iterativo ao invés de um algoritmo recursivo é que nas linguagens de programação modernas o espaço disponível para o fluxo de controle é geralmente bem menor que o espaço disponível no heap, e algoritmos recursivos tendem a necessitar de mais espaço na pilha do que algoritmos iterativos.
Digamos que na maioria das vezes normalmente métodos iterativos são mais rápidos que métodos recursivos, porém em alguns casos a implementação de um método recursivo é muito mais simples do que a de um método iterativo.
forma geral, algumas características são desejáveis para que um software seja testável. Abaixo seis características elencadas por Bach [4] e referenciada por outros autores [1, 2, 5]: 1) Controlabilidade: existe uma interface para conduzir os testes, os estados de variáveis e condições de hardware podem ser controlados pelo testador e os componentes de software podem ser testados de forma independente; 2) Observalidade: registros de estados atuais e anteriores do sistema estão disponíveis para consulta, resultados diferentes são gerados para entradas diferentes, todos os elementos que afetam a saída são visíveis e saída incorreta pode ser facilmente percebida; 3) Disponibilidade: o código fonte do programa deve ser acessível, defeitos não impedem que os testes continuem e o produto evolui em fases; 4) Simplicidade: a implementação deve ser o mínimo necessário para atender os requisitos, os módulos devem ser coesos e com baixo acoplamento; 5) Estabilidade: as alterações de software são controladas e não freqüentes. Alterações realizadas não devem invalidar os testes já existentes; 6) Conhecimento: metodologia e tecnologia utilizada é similar a outros projetos já conhecidos pelos testadores. A documentação é acessível, organizada, detalhada e precisa.
- 2.1.1- Observabilidade e Controlabilidade
Um componente de software é observável se seu comportamento externo bem como seu comportamento interno pode ser observado em tempo real ou gravado para posterior análise [3]. As entradas fornecidas, como parte do teste, devem produzir resultados distintos. Além disso, um resultado incorreto e erros internos podem ser facilmente identificados [1]. O grau de observabilidade de um programa pode ser obtido pela capacidade de determinar de forma econômica se um resultado obtido por um teste é o resultado esperado [6].
Um componente de software é controlável se através de sua interface de comandos pode ser inicializado com diferentes estados conforme requerido pelos testes [3]. Testes podem ser especificados, automatizados e reproduzidos convenientemente [1]. Obviamente, quanto mais controlável é um componente, mais previsível é o seu comportamento [6].
2.2- Testabilidade de domínio
Se um componente de software for testado duas vezes com o mesmo valor de entrada, os dois resultados de execução deveriam ser iguais. Se isso não acontecer, os dados de entrada estão incompletos, ou seja, as saídas não estão dependendo somente das entradas. Neste caso, estados internos do componente, não conhecidos pelo testador, interferem no resultado de saída. Nesta situação, diz-se que o componente está com inconsistências de entrada.
Por outro lado, se a saída de um componente de software é especificada dentro de um intervalo de valores, deveria ser possível construir uma entrada de teste cuja execução poderia cobrir qualquer um dos valores do intervalo de saída desejado. Se não for possível especificar um valor de entrada para algum dos valores do intervalo de saída, diz-se que o componente está com inconsistências de saída.
Componentes de software com inconsistências de entrada e saída não são facilmente testáveis. Estas inconsistências podem ser evidências de um defeito de software, mas não implica, de fato, em sua existência.
...