Por que implementar Interface em OOP?
Acabei de ter esta conversa rápida sobre o porquê de implementar Interface em classes quando se trabalha com orientação a objetos e achei bastante pertinente.
Resposta curta: Interface serve para garantir que o código que utiliza o objeto vai ter determinada funcionalidade disponível; não importa como o objeto vai fazer, contanto que possa fazer. É como contratar alguém com diploma.
Referências:
- http://www.php.net/language.oop5.interfaces
- http://pt.wikipedia.org/wiki/Interface_(programa%C3%A7%C3%A3o)
- http://java.sun.com/docs/books/tutorial/java/concepts/interface.html
[19:06:24] paaaaaaaaaa–agora tomou susto num foi????
estive pensando sobre interfaces…. sobre o conceito de interfaces..
[19:06:57] paaaaaaaaaa–agora tomou susto num foi????
no que diz respeito a você apenas deixar a assinatura do método, daí a classe que implementá-la coloca o código nos métodos..
[19:07:27] paaaaaaaaaa–agora tomou susto num foi????
a primeira impressão nos faz pensar que isso não é nada pragmático, não acha?
[19:08:19] diogo In Communist China, files share you!
http://www.rankmygf.com/
[19:08:27] paaaaaaaaaa–agora tomou susto num foi????
o que é isso?
[19:08:34] diogo In Communist China, files share you!
não sei o que é uma coisa pragmática
[19:08:38] diogo In Communist China, files share you!
um site pornô
[19:08:48] paaaaaaaaaa–agora tomou susto num foi????
o título parece bem baum….
[19:09:08] diogo In Communist China, files share you!
a idéia é legal
[19:09:22] paaaaaaaaaa–agora tomou susto num foi????
a idéia da interface?
[19:09:40] paaaaaaaaaa–agora tomou susto num foi????
de certo modo faz o programador digitar mais códigos..
[19:09:41] diogo In Communist China, files share you!
a idéia do site pornô.
[19:10:00] paaaaaaaaaa–agora tomou susto num foi????
ahh ta..
[19:10:04] diogo In Communist China, files share you!
as interfaces servem de contrato entre duas pontas.
[19:10:05] paaaaaaaaaa–agora tomou susto num foi????
achei que fosse da interface..
[19:10:13] diogo In Communist China, files share you!
também é interessante.
[19:10:33] diogo In Communist China, files share you!
em uma ponta você tem um código que precisa que o objeto tenha determinado método.
[19:10:44] diogo In Communist China, files share you!
na outra ponta você tem uma classe que implementa esse método.
[19:11:03] diogo In Communist China, files share you!
a classe então implementa a interface e algum outro lugar exige que o objeto implemente esta interface.
[19:11:20] diogo In Communist China, files share you!
esse é o propósito. não importa COMO o método faz o procedimento, contanto que o objeto saiba fazer.
[19:13:32] paaaaaaaaaa–agora tomou susto num foi????
eu sei como funciona o conceito… o que digo é que isso não parece pragmático, pois vou fazer uma interface que vai apenas me trazer a assinatura do método… na classe que estou implementando a interface terei que digitar tudo mesmo…. então!!!! não seria melhor digitar de vez sem implementar tal interface?
[19:14:52] diogo In Communist China, files share you!
se você programa sozinho objetos que só servem pra você, e se você só utiliza os seus próprios objetos e só tem 1 classe que implementa tal função, sim. aí você não precisa de interface.
[19:16:42] paaaaaaaaaa–agora tomou susto num foi????
mas mesmo com vários objetos não me parece pragmático pelo simples fato de termos que escrever o código em cada objeto que implementa a interface. imagine que temos 10 objetos e temos uma interface. ao implementar essa interface nos 10 objetos escrevemos o código 10 vezes..
[19:17:47] diogo In Communist China, files share you!
imagina que você tem uma classe que baixa arquivos. ela implementa um método public function baixar($url)
[19:18:11] diogo In Communist China, files share you!
imagina também que você tem uma outra classe que precisa baixar arquivos. ela tem um método que recebe a instância de um browser, que é um objeto que sabe baixar arquivos.
[19:18:55] diogo In Communist China, files share you!
então essa classe que precisa baixar arquivos tem um método public function setBrowser( MeuBrowser $browser ) e um pouco depois, nela mesma, é feito algo como $this->browser->baixar(”http://…”);
[19:19:17] diogo In Communist China, files share you!
só que amanhã você não tem mais só essa classe MeuBrowser. você tem também a classe BrowserDoDiogo.
[19:19:57] diogo In Communist China, files share you!
as duas classes têm o método baixar($url) e a sua classe que precisa baixar arquivos não se importa se é a classe MeuBrowser ou BrowserDoDiogo que está sendo usada. sua classe só precisa que o browser tenha o método para baixar arquivos.
[19:20:29] diogo In Communist China, files share you!
então você muda a assinatura da sua classe para setBrowser( IBrowser $browser ). e cria a interface IBrowser que vai exigir que as classes que a implementem tenham o método baixar($url).
[19:20:46] diogo In Communist China, files share you!
então as classes MeuBrowser e BrowserDoDiogo passam a implementar essa interface e todos ficam felizes.
[19:20:48] diogo In Communist China, files share you!
captou?
[19:22:25] paaaaaaaaaa–agora tomou susto num foi????
poxa captei sim sua idéia..
[19:22:26] paaaaaaaaaa–agora tomou susto num foi????
mas…
[19:23:52] paaaaaaaaaa–agora tomou susto num foi????
você poderia muito bem definir o método baixar nas classes MeuBrowser e BrowserDoDiogo sem precisar da interface…
[19:24:34] diogo In Communist China, files share you!
sim. mas aí a sua classe que precisa de um browser não ia ter como garantir que o objeto que ela recebe como browser realmente tem capacidade de baixar.
[19:25:25] diogo In Communist China, files share you!
lembre-se que essa idéia de Interface é de engenheiros heheh eles precisam de uma garantia de que as coisas funcionarão sem dar erro em tempo de execução.
[19:26:10] paaaaaaaaaa–agora tomou susto num foi????
mas pensando assim…
[19:27:08] paaaaaaaaaa–agora tomou susto num foi????
eu poso fazer as classes MeuBrowser e BrowserDoDiogo implementarem uma interface e essa interface, no caso IBrowser, teria um método baixar… correto?
[19:27:16] diogo In Communist China, files share you!
exatamente.
[19:28:18] paaaaaaaaaa–agora tomou susto num foi????
de qualquer forma eu iria implementar o código do método baixar() em MeuBrowser e em BrowserDoDiogo, ou seja, isso não iria garantir a integridade 100% de que o método saberia baixar…. seriam dois códigos diferentes
[19:29:11] diogo In Communist China, files share you!
sim, mas a responsabilidade da interface é garantir que a classe TEM a capacidade de executar determinada função e não COMO ela executará! ter dois códigos diferentes é realmente a idéia da interface.
[19:29:15] diogo In Communist China, files share you!
é como um diploma.
[19:31:01] diogo In Communist China, files share you!
no PHP ainda não tem como definir o retorno do método, mas em Java é praxe você garantir também o tipo de retorno, especializando ainda mais a Interface e diminuindo as chances de falha.
[19:31:49] paaaaaaaaaa–agora tomou susto num foi????
em Java tem como garantir o retorno do método?
[19:32:25] diogo In Communist China, files share you!
sim. o método precisaria, por exemplo, retornar sempre uma instância de MeuArquivo.
[19:34:16] paaaaaaaaaa–agora tomou susto num foi????
bom, em PHP é só você fazer um método que retorne um objeto, daí você teria um método retornando uma instância..
[19:34:52] diogo In Communist China, files share you!
sim. mas a interface não pode garantir isso. em Java a interface pode garantir o retorno, e se o método não retornar a instância corretamente, provavelmente nem compila.
[19:35:30] paaaaaaaaaa–agora tomou susto num foi????
tow ligado..



