20 de novembro de 2016

Assunto abordado por Cargill (1992) e Meyer (1997), uma função produz efeito colateral quando além de retornar um valor, ela altera o estado do objeto que está tratando, ou seja, ela muda o valor do objeto em questão. O efeito colateral pode ser necessário em alguns casos, mas, deve ser evitado por ser nocivo de forma geral.

Para ilustrar a ocorrência de efeito colateral, utilizaremos o seguinte exemplo simples:

class A
{

int x = 0;

public int calculoX()
{   
    return x = x+1;
}
}

Caso a função acima fosse utilizada como o teste de uma condição, qual seria o resultado de if(a.calculoX() == a.calculoX()), para A? O resultado seria false, pois, na primeira vez em que a função é chamada ela retorna um, na segunda ela retorna dois. Nesse caso, as duas chamadas da função não retornarão o mesmo valor. Uma situação como essa pode prejudicar o raciocínio equacional.

Na maior parte das vezes, o efeito colateral nas funções deve ser evitado, pois cada função deve ser executada em prol de um único objetivo e sem surpresas a cada nova execução da mesma. De toda forma, podemos analisar alguns casos onde seria benéfico o uso do efeito colateral em funções. Depende da finalidade de uso da função.

Todo objeto tem um estado abstrato e um estado concreto. O estado abstrato é o estado percebido pelo usuário do objeto. O estado concreto é o estado definido pela implementação do objeto. Mudanças no estado concreto podem ou não serem percebidas pelo usuário do objeto.

O efeito colateral no estado abstrato do objeto é como ocorre no exemplo mostrado, o objeto sofreu um efeito colateral de forma que a cada vez que a função for chamada, ela retornará valores diferentes. Mas, no caso de efeito colateral no estado concreto do objeto, esse tipo de efeito colateral produz um efeito interno que não é percebido externamente e é constantemente utilizado na implementação de objetos como máquinas de estado. Como exemplo de aplicação de efeito colateral no estado concreto do objeto, podemos citar o uso de variáveis que armazenam os valores dos últimos objetos acessados de uma lista para facilitar a pesquisa e a inserção de itens na lista. Esse tipo de efeito colateral não é nocivo e ajuda a reduzir o custo das operações.

Outro exemplo muito interessante do uso do efeito colateral apenas no estado concreto é o funcionamento de uma memória cache em um navegador de internet. Quando acessamos uma página web pela primeira vez, o navegador utilizado carrega todos os itens daquela página para exibi-lo, mas, ao acessar pela segunda vez, podemos notar que a página é carregada de forma mais rápida. Isso ocorre porque o cache trabalha com efeito colateral para armazenar a página visitada e exibi-la mais rápido nas próximas vezes em que ela for solicitada ao navegador. Essa é uma forma de utilizar efeito colateral de forma benéfica ao resultado da execução.

Referências:

CARGILL, T. C++ Programming Style, Reading. 1. ed. Reading, MA: Addison-Welsey, 1992.

MEYER, B. Object-Oriented Software Construction. 2. ed. New Jersey: Prentice Hall, 1997.

0 comentários:

Postar um comentário

Comentários:

Perfil

Formada em Sistemas de Informação e pós-graduada em Engenharia de Software.

Facebook

Views