Interfaces

Boa tarde,

Senhores tenho algumas duvidas sobre interfaces,
então vamos lá:

lendo o artigo do GUJ sobre Interfaces me deparei com uma série de questões…
tenho o conceito de abstração bem formulado em mente mas não consigo ver “O Grande Negócio” da Interface.

[quote]Qual é o problema aqui? O problema é que outras classes do sistema possuíam códigos como este:

public class Relatorios { // ... public void imprimeRelatorio(Pessoa p) { // ... } // ... } [/quote]

Convenhamos este é um problema,

Segundo o artigo a solução para isso seria uma interface “Paciente”
permitindo assim códigos como:

Paciente a = new Animal(); Paciente p = new Pessoa();

após implementar esta interface voltando ao código anterior do artigo teriamos o seguinte:

public class Relatorios { // ... public void imprimeRelatorio(Paciente p) { // ... } // ... }

sendo assim teriamos que alterar todos os códigos do tipo “Pessoa” como:

Pessoa p = new Pessoa();

para:

Paciente p = new Pessoa();

Certo, até aqui vi vantagem da interface neste código,
no que diz respeito aos relatórios ou demais classes que trabalhem com o Objeto Paciente, tendo em vista que ainda terei que alterar o tipo do objeto instanciado quando códigos do tipo:

Paciente p = new Pessoa();

ocorrerem, para Animal();

correto ?

andei lendo bem sobre o assunto e vi que talvez por ser um assunto um tanto quanto confuso não é empregado de maneria correta por muitos desenvolvedores,
nestas idas e vindas da internet constatei o uso de interfaces para definir constantes como:

public static final int FUNCIONARIO_GERENTE = 0;

o que possibilita códigos como:

Funcionario f = new Funcionario(); f.setCargo(FUNCIONARIO_GERENTE); }

enfim a utilização de interfaces para este fim é recomendada ?
pois posso ter uma interface para este fim de constantes e ela ser implementa em uma “classe 1” e a mesma é a super classe da “classe 2” e
acessaria estas constantes diretamente da “classe 2”

penso, não sei exatamente como se comporta a JVM em relação a isso,
a utilização de interfaces diretamente na super classe sobrecarrega o sistema ?
é uma pratica comum ?

Atenciosamente.

Operacionalmente, para evitar mal entendido, classe abstrata pode fazer o papel de interface porque ela permite definir método abstrato (sem implementação) para ser implementado por um classe herdeira concreta.

A interface por sua vez só determina aspecto de interação e não de comportamento. Ela está sujeita a ser utilizada durante uma instância de arquitetura e não de programação.

Por quê?

A interface realmente é mal explorada, porque se pensar bem, você pode querer na interface algum processamento prévio e não apenas padronizar métodos e suas assinaturas. Por isso a classe abstrata normalmente é utilizada no lugar da interface, pois a arquitetura de software embora muito falada, é aplicada somente em situações onde a empresa de desenvolvimento tem um processo maduro e grana para investir em profissionais cujo leque de conhecimento inclua a competência de arquiteto de software.

A interface sempre coube muito bem para determinar padrões de projetos do tipo listening como é o caso de uma aplicação interativa baseada no lançamento de eventos. Também em caso do padrão DAO ela é muito aplicada.

Veja, normalmente ela está no front ou no end de um programa, e naturalmente é raro encontrar interface no core do processamento do programa. Na visão de componentes, pode-se entender claramente a utilidade da interface estar no front ou no end de um programa.

Para resumir, a interface é útil e tem seu lugar garantido na arquitetura de software.

wiliamps

[quote=wellington.nogueira]@gejava não é necessário alterar a criação das instâncias de:

Pessoa p = new Pessoa();[/code]para[code]Paciente p = new Pessoa();[/code] mas na classe pessoa, ela teria que implementar Paciente:[code]class Pessoa implements Paciente {...}

Se você tem uma interface Paciente, é interessante declarar o tipo da variável para Paciente sim. Pois você poderia alterar fazer implementações de pessoas diferentes, sabendo que todas são pacientes.

Se você somente precisou determinar Paciente para sua aplicação, poderia pedir para fornecedores diferentes fazer suas versões do paciente a partir da sua interface.

@wiliamps

já havia percebido está predisposição das classes abstratas sobre as interfaces pois as mesmas possibilitam métodos concretos, mas a interface trabalha bem na base

“multi-herança” uma vez que não podemos trabalhar “extendendo” duas classes mas duas interfaces sim.

obrigado pela explicação.

@wellington.nogueira

digo trocar esta instanciação a fim de tornar o código mais genérico e para que no processo de desenvolvimento do sistema da clinica veterinaria as alterações necessarias sejam minimas.

procede ?

Para evitar usar testes como instanceof, também é possível combinar com Generic:

Exemplo:

public class ServiceDelegator<E extends IServiceExecutor> ...

Veja que ao instanciar um ServiceDelegator, uma implementação de IServiceExecutor deve ser informada. Isso permite ao delegator invocar os métodos esperados de E.

No geral, o que vocês compartilharam aqui, principalmente uma classe poder implementar mais de um interface, todas estas informações reativam novas possibilidade de explorar a interface pela arquitetura de software.

Agradeço a todos vocês pelas informações.

wiliamps

@gejava não é necessário alterar a criação das instâncias de:

@williamps o que quis dizer é, se houve essa necessidade, ele não precisa trocar todas as chamadas JÁ construídas só por isso.

E caso precise de métodos específicos de Pessoa ou Animal, não será necessário o uso de cast.

Agora, caso você não saiba quais os tipos que são Paciente (objetos retornados por Factories, por exemplo) aí não tem jeito, tem que usar interface.

[quote=gejava]…@wellington.nogueira

digo trocar esta instanciação a fim de tornar o código mais genérico e para que no processo de desenvolvimento do sistema da clinica veterinaria as alterações necessarias sejam minimas.

procede ?[/quote]Não havendo necessidade de cast, não há problemas.
É apenas um impacto que pode ser “negligenciado” naquilo que já foi produzido, sem danos ao código. No fim, provavelmente você passará esses objetos a métodos que tratarão de maneira genérica e o argumento declarado poderá ser Paciente e, a partir deste que o tratamento deverá ser realizado de modo genérico.

Porém há de se observar que:
se há necessidade de usar técnicas para identificar qual o tipo específico como instanceof ou uso de cast, possivelmente exista um problema de design maior que o uso de interfaces/classes abstratas.