Uma comparação segundo os princípios da Orientação à Objetos.

Post on 17-Apr-2015

107 views 2 download

Transcript of Uma comparação segundo os princípios da Orientação à Objetos.

Uma comparação segundo os princípios da Orientação à Objetos

Introdução à linguagem Java

HistóricoO Projeto Green

Um sistema para uso em produtos de consumo eletrônicos.

O C++ não funcionou e uma nova linguagem era necessária.

James Gosling, programador de rede assume o projeto.

O nome Java Inspirado em uma loja de café.

Introdução à linguagem Java

Padrão AbertoPadrão homologado internacionalmente

Aprovado pela ISO/IEC JTC-1. Implementações Java podem ser disponibilizadas por

terceiros para qualquer plataforma. Fidelidade e compatibilidade com a especificação

original é atestada em conjunto com a IBM e a Netscape.

O executável Java é compatível com qualquer implementação em qualquer plataforma, roda sem ter o códgo fonte recompilado.

Introdução à linguagem Java

Arquitetura

O Java roda sobre uma máquina virtual que abstrai particularidades da máquina hospedeira.

O código desta máquina virtual, chamado bytecode, é verificado antes de ser executado, evitando que seja corrompido em sua transferência.

Código fonte em Java

Compilador Java

CA FE BE 00 03 00 2D…

Estrutura básica de uma classe Java

Exemplopublic class Point2d {

int x, y;Point2d(int x, int y) {

this.x = x;this.y = y;

}Point2d() {

this(0,0);}double length() {

return Math.sqrt(x*x + y*y);}

}

Estrutura básica de uma classe Java

Visibilidade de atributos e operações

Estes são os modificadores de visibilidade para atributos e operações:

public - acesso a partir de todas as classes protected - acesso a partir de todas as classes filhas e

do mesmo pacote friendly - acesso a partir de classes do mesmo pacote

(não precisa ser declarado) private - acesso exclusivamente pela própria classe

Gerenciamento de memória

Garbage Collector

A alocação de memória é dinâmica Todos os objetos em Java são alocados

dinamicamente quando explicitamente solicitados. Não existem ponteiros em Java: o acesso aos objetos

é feito através de referências. O cálculo do espaço a ser alocado é de

responsabilidade exclusiva do compilador e o programador não pode nem precisa intervir.

Gerenciamento de memória

Garbage Collector

A liberação de memória alocada é automática Todas as referências a um determinado objeto são

contabilizadas pelo gerenciador de memória. Objetos que não tiverem referência são destruídos

automaticamente pelo “garbage collector”. Programadores não precisam se preocupar em

descartar explicitamente um objeto. Basta remover todas as suas referências.

Gerenciamento de memória

Garbage Collection

O gerenciamento de memória é feito através de procedimentos similares.

Influenciou o comportamento na linguagem Java.

Herança

Hierarquia de classes

Todas classes herdam implicitamente da classe Object (raiz)

A classe Object já tem implementações prontas de métodos que facilitam a implementação de novas classes.

Métodos como de serialização, construtor e representação em String já estão prontos e ainda podem ser redefinidos caso necessário.

Herança

Hierarquia de classes

Todas classes herdam implicitamente da classe GENERAL (raiz), de forma similar ao Java.

A EKLS (Eiffel Kernel Library Standard) define também outras outras 25 classes que provêem funcionalidades essenciais das quais o desenvolvedor pode herdar.

Herança e Interface

Heranças simples e múltipla

Java suporta apenas herança simples.

Para contornar a falta da herança múltipla ela usa interfaces, que só possuem as declarações dos métodos.

Uma classe pode implementar várias interfaces, possibilitando o uso de um certo tipo de “herança múltipla”, porém descartando os perigos da mesma.

Uma interface pode ser implementada em várias classes de hierarquias diferentes.

Herança e Interface

public class Point2d { int x, y; Point2d(int x, int y) { this.x = x; this.y = y; } Point2d() { this(0,0); } double length() { return Math.sqrt(x*x + y*y); }}

Exemplospublic class Point3d extends Point2d {

int z;

Point3d(int x, int y, int z) {

super(x,y);

this.z = z;

}

Point3d() {

this(0,0,0);

}

double length() {

return Math.sqrt(x*x + y*y + z*z);

}

}

Herança e Interface

interface Colored {

modifyColor(Color color);

Color getColor();

}

public class Line implements Colored {

}

Exemplospublic class Point3d extends Point2d implements Colored {

Color color;

modifyColor(Color color) {

this.color = color;

}

Color getColor() {

return this.color;

}

}Como implementam a

Interface, Point3d e Line são obrigadas a definir os

métodos declaradosna interface.

Herança e Interface

Exemplos

Desta forma, implementamos “herança múltipla”, sendo válidas as seguintes atribuições:

Colored colored = new Point3d();

Colored colored2 = new Line();

Ambas as referências só visualizam os métodos da interface.

Herança e Interface

Heranças simples e múltipla

Eiffel contém o melhor suporte nesta área, suportando herança simples, múltipla e repetida. (na qual uma classe desdende multiplamente de classes com ancestral comum)

Ele permite a seleção de quais atributos herdar duplamente ou não.

Além disso, também possui o conceito de interface, provendo encapsulamento e information hiding

Polimorfismo

Sobreposição de atributos e operaçõesEm Java, o que identifica unicamente o método é o nome e a lista de argumentos. Nas subclasses podemos ter:

Overloading - definição de métodos de mesmo nome com listas de argumentos diferentes.

Overriding - definição de métodos de mesmo nome e lista de atributos.

Na herança, sobreposições são tratadas de acordo com as referências que estão acessando as mesmas.

Java não suporta sobrecarga de operadores.

Polimorfismo

Sobreposição de atributos e operações

Eiffel, diferentemente do Java, não suporta sobrecarga de métodos, mas suporta mudança de nomes (renaming), no qual um método ancestral muda de nome para se adaptar semanticamente melhor ao novo contexto.

Eiffel suporta sobrecarga de operadores.

Associações

Agregação

Java e Eiffel não suportam agregações explicitamente.

O fazem através de uma simples referência a outro objeto.

Composição

Novamente não suportam explicitamente.

O fazem colocando uma classe dentro da outra ou passando uma referência de uma no construtor da outra.

Domínios de Classes

Pacotes do JDK - Core APIjava.lang - matemática e stringsjava.util - estrutura de dadosjava.io - entrada e saídajava.net - acesso à redejava.applet - interação com a Webjava.awt - interação com a GUIjava.math - matemática criptográficajava.beans - componentização

Domínios de Classes

Existem bibliotecas de classes escritas em Eiffel para todo tipo de aplicação de uso comum, sendo as principais distribuídas pela Eiffel Software junto com o EiffelStudio.

Além disso, Eiffel pode integrar-se com código C e classes em C++, de maneira que a disponibilidade de classes para uso em Eiffel é enorme.

Espaço-estado e comportamento

Invariantes, Pré-condições e Pós-condiçõesJava não provê suporte a invariantes, pré-condições ou pós-condições.

Desenho por Contrato : Eiffel provê suporte total a esse conceito de projeto de sistemas e o coloca como principal diferencial comparativo com outras linguagens

A Eiffel Software afirma que o desenho por contrato levado a sério pode reduzir os custos de depuração em até 95%

Componentes

JavaBeans

Um componente é um conjunto de objetos que partilham a mesma arquitetura JavaBean e cumprem um determinado contrato.

Os componentes JavaBeans devem atender a uma regra de formação de nomes e atender a certos chamados de métodos.

Componentes

Exemploclass Conta{

   Double saldo;

   Double getSaldo();{     return saldo;   }

   void setSaldo(Double quantia){     saldo = quantia;   }}

class ContaBeanInfo{ /*.....*/}

Componentes

Eiffel por ser puramente OO suporta plenamente componentização

Exceções

Try e Catch

Em java há suporte para tratamento de exceções em tempo de execução através das diretivas "try" e "catch".

Todo método que invoca outro que declarativamente lança uma exceção é obrigado a tratar internamente a exceção sem deixá-la se propagar ou declarar que também lança a mesma exceção ou uma outra exceção que esteja acima na hierarquia da primeira.

Exceções

Exemplotry { c1.divide(c2);

}

catch(AritimethicException e) {   System.out.println("Impossible division by zero.");}

Toda vez que uma exceção ocorre em um método e não é tratada, é passada para o escopo do método que invocou o primeiro.

Exceções

Uma exceção em Eiffel semanticamente indica “Quebra no Contrato", bastando que uma invariante, pré ou pós-condição de classe seja violada.

Comportamento imprevisto, intratável, no qual a única alternativa possível é tentar novamente (retry), ou falhar.

Exceções

Desenho por contrato + exceções : Funciona bem detectando erros durante o processo de desenvolvimento

Abordagem oposta ao Java: a exceção, ainda que seja um erro, não é um imprevisto, mas uma classe bem definida, fazendo parte do próprio desenho da aplicação. O foco da estrutura try-catch é o controle do fluxo do programa pós-exceção.