• Nenhum resultado encontrado

2. Eiffel

2.10. Eiffel vs Java

Como já foi referido, Eiffel é uma linguagem bastante apreciada no universo dos programadores, devido às suas características que se enquadram nas teorias sobre orientação a objectos de Bertrand Meyer. Sendo uma linguagem que permite uma expressividade particularmente interessante, foi adoptada como base para a realização deste trabalho. O objectivo principal deste trabalho parte então da motivação de usufruir das mais importantes características do Eiffel num ambiente de programação em Java.

Tendo em conta a abordagem sistemática à linguagem Eiffel que é feita ao longo deste documento, com vista a uma implementação da linguagem JavaCO à imagem do Eiffel, vamos aqui fazer alusão às principais características da linguagem Eiffel, e consequente comparação em relação às propriedades correspondentes que existam na linguagem Java.

Eiffel

Java

Covariância dos argumentos em redefinição de métodos

Esta linguagem possui um poderoso mecanismo de herança. Uma das suas propriedades passa por permitir que se especializem argumentos dos métodos na sua redefinição em subclasses.

A linguagem Java não permite tipos mais específicos nos argumentos de métodos redefinidos, em comparação aos tipos declarados nos argumentos dos métodos na superclasse.

Abordagem completamente orientada a objectos

As classes são usadas em Eiffel como base única para a Estrutura dos Módulos e Sistema de Tipos. Apresenta um sistema de tipos consistente, dado que todos os tipos são baseados em classes, incluindo os tipos básicos como inteiros, booleanos, caracteres, etc.

Linguagem não puramente orientada a objectos

Em Java nem tudo são classes/objectos. Esta linguagem possui um grupo especial de oito tipos de dados, normalmente chamados de tipos primitivos, que foram introduzidos na linguagem de forma a melhorar o desempenho. São eles:

boolean, char, byte, short, int, long, float e double.

Estes tipos não podem ser estendidos, nem permitem a adição de novos métodos.

Herança múltipla

Possibilidade de definição de classes como extensão ou especialização de outras classes. Em Eiffel uma classe pode herdar de quantas classes for necessário. É permitida a renomeação de

features nas classes herdadas.

Herança simples

A linguagem possui o mecanismo de herança, sendo permitida a extensão e especialização das classes. No entanto, uma classe só pode herdar de uma única classe.

Desenho por Contracto e Asserções

Pré-condições, pós-condições e invariantes; Constituem um poderoso mecanismo, que tem como objectivo principal a correcção dos programas. É também factor precioso para a documentação.

Asserções

A linguagem Java possui um mecanismo de asserções que permite assegurar a veracidade de uma expressão booleana em tempo de execução. As asserções não são herdadas ao contrário dos contractos do Eiffel.

“like Current”

Declaração que denota um tipo baseando-se na classe corrente. Esta declaração é particularmente interessante e útil da redeclaração de métodos em classes herdadas.

A linguagem Java não possui nenhum mecanismo semelhante.

Tipos genéricos

Uma das técnicas fundamentais para assegurar a criação de software reutilizável e expansível. Permite a implementação de tipos de dados abstractos, criando estruturas flexíveis, contendo objectos de um certo tipo, sendo que o parâmetro genérico denota esse tipo.

As entidades genéricas em Eiffel podem ser restringida ou não restringida. A variante restringida deste mecanismo permite colocar requisitos específicos em possíveis parâmetros genéricos.

Tipos genéricos

Técnica igualmente disponível na linguagem Java. Também aqui podemos aplicar restrições, introduzindo fronteiras aos tipos que cada genérico aceitará.

Conformidade de tipos

Característica que determina quando um tipo pode ser usado no lugar de outro. Fundamental na segurança do sistema de tipos Eiffel, no sentido em que evita erros de tipos tanto na afectação de variáveis como na passagem de argumentos, assegurando a compatibilidade entre os tipos a tratar.

Subtipos

Relação entre classes, diz-nos quando podemos passar um objecto de uma dada classe a um método de outra classe, ou afectar uma variável de uma classe com um objecto de outra classe.

Erradicação de chamadas void

A introdução da noção de tipos “Attached” e “Detachable”, sendo que só os últimos permitem

void como valor possível, agregada a outras

técnicas de programação, como o recurso a CAP (Certified Attachment Patterns), que são esquemas de programas que são demonstráveis como void-

safe, permite a erradicação de desreferenciações

nulas.

Mecanismo não existente em Java.

Tipificação estática e dinâmica

A verificação de tipos é, na sua maioria, efectuada em tempo de compilação (estaticamente). No entanto, existem verificações que são feitas dinamicamente.

Tipificação estática e dinâmica

Além da verificação estática de tipos, a linguagem Java também efectua algumas verificações dinamicamente, nomeadamente quando se recorre ao operador instanceof, que verifica em tempo de execução se um objecto é uma instância de uma determinada classe, e quando se recorre a casts.

Tratamento de Excepções

As excepções em Eiffel podem surgir caso um contracto seja violado ou devido a condições anormais reportadas pelo hardware ou sistema operativo.

Esta linguagem permite a detecção e tratamento de excepções dentro das rotinas.

Tratamento de Excepções

A linguagem Java também permite o tratamento de excepções dentro dos métodos.

Ligação Dinâmica (Dynamic Binding)

Aparece quando uma função membro de uma classe derivada é invocada com base no tipo dinâmico do objecto. O poder da programação orientada por objectos reside em grande parte neste mecanismo.

Ligação Dinâmica (Dynamic Binding)

Esta propriedade existe em Java e é idêntica à da linguagem Eiffel.

Polimorfismo

Propriedade que permite a definição de entidades flexíveis, que podem ficar anexadas a objectos de vários tipos em tempo de execução.

Polimorfismo

O Java possui o mesmo recurso através da herança, permitindo que referências de classes mais abstractas representem o comportamento das classes concretas que referenciam, possibilitando o tratamento de vários tipos de maneira homogénea.

Agentes

Mecanismo que aplica conceitos orientados por objectos à modelação de operações. Passa por encapsular operações em objectos, à semelhança de closures.

A linguagem Java não tem directamente o conceito de Agente, mas também permite criar closures através de classes anónimas.

Garbage collection

Mecanismo que gere automaticamente a recuperação de memória ocupada por objectos que já não estão em uso pelo programa.

Garbage collection

A linguagem Java também possui um mecanismo que de forma automática gere a libertação de memória ocupada por objectos que já não se encontram em uso.

Classes “Deferred”

Uma classe é “deferred” se contém pelo menos uma feature “deferred”. Significa isto que não existe implementação dessa feature dentro desta classe, implementação essa que aparecerá em eventuais descendentes da mesma. É o nome dado em Eiffel a classes abstractas.

Classes abstractas

Documentos relacionados