Ajuda teórica OO

4 respostas
L

Boa noite pessoal!

Alguem poderia me explicar de uma maneira descomplicada o que é um [color=red]parâmetro implicito [/color] e [color=red]efeito colateral[/color]. Se possível citar uma exemplo de efeito colateral, pois não consegui enxergar isso.

4 Respostas

E

Dentro de OO eu particularmente nunca vi isso

tnaires

Eu também nunca vi isso, mas vou dar um chute muito grande aqui.

Acredito que o conceito de efeito colateral tem a ver com idempotência. Uma função idempotente é aquela que faz sempre a mesma coisa caso seja chamada sucessivas vezes com os mesmos parâmetros.

Por exemplo, considere a função abaixo:
int soma(int a, int b) {
    return a + b;
}
A chamada soma(1, 1) retorna sempre o mesmo resultado, não importando quantas vezes seja chamada. Perceba que o resultado depende apenas dos parâmetros que você passa. Agora, vamos supor que você adicione o resultado da soma a uma lista:
List<Integer> resultados = new ArrayList<Integer>();

int soma(int a, int b) {
    resultados.add(a + b);
    return a + b;
}
A função agora possui um efeito colateral: todo resultado é adicionado a uma lista. O estado do programa é alterado a cada chamada da função.

Sobre parâmetro implícito... Não sei Python, mas creio que a linguagem oferece um exemplo de parâmetro implícito quando escrevemos métodos. O primeiro parâmetro de um método é sempre uma referência ao objeto - o nome dessa variável, por convenção, é self. Porém, na hora de chamar o método, não é necessário explicitar a passagem desse parâmetro.

Exemplo:
class Usuario:
  # Observe que o método possui dois parâmetros
  def set_login(self, login):
    self.login = login

u = Usuario()
# Na hora de chamar, o self é passado implicitamente
u.set_login('tnaires')
discorpio

Bom dia a todos.

Vamos a um exemplo de Efeito Colateral:

//Classe ponto
    public class Ponto {
          public float x,y;
          
          public Ponto(float x; float y)
               this.x = x;
               this.y = y;
          }
          ....
          ....
    }

    //Classe principal
    public class Principal {
             
         public static void main(String args[]) {

        //preparacao das variaveis copia de objetos
        Ponto inicial, alias,  copia;
        inicial = new Ponto((float)0.0, (float)0.0f);
        alias = inicial; //copiando atraves de atribuicao
        copia = new Ponto(inicial.x, inicial.y); //copiando atributo por atributo
   }

Voce vai reparar que alias e uma referência para o mesmo local de memória que inicial, por este motivo quando aliás é alterado, inicial se altera por “efeito colateral”, eles compartilham o mesmo objeto pois a atribuição alias = inicial, copia o endereço de inical.

Já a cópia, é o resultado de uma nova alocação de memória, portanto um novo endereço, um objeto independente dos outros.

Comparacao de objetos:

inicial == alias e outras comparações equivalentes têm o significado de comparação do endereço de memória e não do conteúdo.

inicial.x == inicial.x tem o significado de comparação do valor desses atributos, assim como uma comparação entre inteiros. Se esses atributos por sua vez fossem objetos, esta operação teria o significado de comparação entre endereços de memória dos objetos.

Quanto ao atributo implícito a própria classe Ponto tem um que é o “this”.

//Classe ponto
    public class Ponto {
          public float x,y;
          
          public Ponto(float x; float y)
               this.x = x;  // O this é um atributo implícito que representa o objeto da própria classe.
               this.y = y;
          }
          ....
          ....
    }

No caso acima, para diferenciar o atributo que vem do construtor do atributo da classe x e y, foi usado o atributo implícito “this” para referenciar ao objeto da própria classe.

Outro atributo implícito é “super” que serve para dar acesso a atributos e métodos de super classes em caso de herança, onde super faz referência a super classe.

L

Muito Obrigado senhores! Agora entendi !

Criado 19 de maio de 2011
Ultima resposta 20 de mai. de 2011
Respostas 4
Participantes 4