garotosopa

Por que implementar Interface em OOP?

Publicado em OOP por garotosopa em Agosto 14, 2008

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:

[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..

Uma resposta

Subscreva aos comentários comRSS.

  1. Willian said, on Outubro 23, 2009 at 9:11 am

    Segundo meu professor da pós graduação: “Programe para uma interface, nunca para uma implementação”. Com a interface você pode aproveitar o poder do polimorfismo!
    Valeu, um abraço.


Deixe uma resposta