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.
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.
Dentro de OO eu particularmente nunca vi isso
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;
}
List<Integer> resultados = new ArrayList<Integer>();
int soma(int a, int b) {
resultados.add(a + b);
return a + b;
}
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')
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.
Muito Obrigado senhores! Agora entendi !