10. encapsulação; cópia de instâncias; igualdade de instâncias – fundamentos de programação...

22
Apresentação 10 Encapsulação Cópia de instâncias Igualdade de instâncias

Upload: manuel-menezes-de-sequeira

Post on 11-Jun-2015

933 views

Category:

Education


1 download

DESCRIPTION

Fundamentos da Programação 10: • Encapsulação • Cópia de instâncias • Igualdade de instâncias Apresentação 10 da unidade curricular de Fundamentos de Programação da Universidade Europeia. Alterações de Manuel Menezes de Sequeira sobre versão original por vários autores do DCTI do ISCTE-IUL, incluindo Luís Nunes, Ricardo Ribeiro, André Santos e o próprio Manuel Menezes de Sequeira.

TRANSCRIPT

Page 1: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

Apresentação 10

EncapsulaçãoCópia de instânciasIgualdade de instâncias

Page 2: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

Fundamentos de Programação 2

Da apresentação anterior…

Operação toString

Classes, instâncias e objectos

Leituras com Scanner

2013/2014

Page 3: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

Fundamentos de Programação 3

Encapsulação

Aplica ocultação de informação a elemento de linguagem

Oculta implementação e revela interface Produtores: acesso exclusivo à implementação Consumidores ou clientes: acedem apenas a

interface

Resultado são módulos Rotinas Objectos/classes Pacotes

2013/2014

Ou «encapsulamento»

.

A ver mais tarde.

Page 4: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

Interface vs. implementação

Interface Como se usa? O que faz? Qual o contrato entre produtor e

consumidor?

Implementação Como funciona? Qual o mecanismo?

2013/2014 Fundamentos de Programação 4

Page 5: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

Fundamentos de Programação 5

Encapsulação: vantagens Implementação pode mudar sem afectar

consumidores

Produtores podem garantir bom comportamento dos módulos

Mais fácil localizar erros

Mais fácil corrigir erros

Facilita abstracção do consumidor!2013/2014

Page 6: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

Encapsulação: interface

Métodos e rotinas Cabeçalho apenas

Classes Operações Propriedades …

2013/2014 Fundamentos de Programação 6

Page 7: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

Encapsulação: implementação

Métodos e rotinas Corpo apenas

Classes Métodos auxiliares Métodos enquanto implementação de

operações Atributos …

2013/2014 Fundamentos de Programação 7

Page 8: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

Encapsulação: rotinas

2013/2014 Fundamentos de Programação 8

Page 9: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

{ if (m == 0 && n == 0) throw new IllegalArgumentException("Illegal call with " + "m = 0 and n = 0."); m = Math.abs(m); n = Math.abs(n);

if (m == 0 || n == 0) return Math.max(m, n);

int possibleGcd = Math.min(m, n); while (m % possibleGcd != 0 || n % possibleGcd != 0) possibleGcd--;

return possibleGcd;}

/** * Returns the greatest common divisor (GCD) of two integer

numbers. * * @param m first of the two integer numbers whose GCD will be

returned. * @param n second of the two integer numbers whose GCD will be

returned. * @return the greatest common divisor of m and n. * @pre m ≠ 0 ∨ n ≠ 0 * @post gcd = gcd(m, n) */ public static int gcd(int m, int n)

2013/2014 Fundamentos de Programação 9

{ if (m == 0 && n == 0) throw new IllegalArgumentException("Illegal call with " + "m = 0 and n = 0."); m = Math.abs(m); n = Math.abs(n);

if (m == 0 || n == 0) return Math.max(m, n);

int possibleGcd = Math.min(m, n); while (m % possibleGcd != 0 || n % possibleGcd != 0) possibleGcd--;

return possibleGcd;}

Interface: como se usa.

Interface: o que faz, contrato.

Implementação: como funciona.

Page 10: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

/** * Returns the greatest common divisor (GCD) of two integer numbers. * * @param m first of the two integer numbers whose GCD will be returned. * @param n second of the two integer numbers whose GCD will be

returned. * @return the greatest common divisor of m and n. * @pre m ≠ 0 ∨ n ≠ 0 * @post gcd = gcd(m, n) */ public static int gcd(int m, int n)

2013/2014 Fundamentos de Programação 10

{ if (m == 0 && n == 0) throw new IllegalArgumentException("Illegal call with " + "m = 0 and n = 0."); m = Math.abs(m); n = Math.abs(n); while (m != 0) { int temporary = m; m = n % m; n = temporary; }

return n;}

/** * Returns the greatest common divisor (GCD) of two integer numbers. * * @param m first of the two integer numbers whose GCD will be returned. * @param n second of the two integer numbers whose GCD will be

returned. * @return the greatest common divisor of m and n. * @pre m ≠ 0 ∨ n ≠ 0 * @post gcd = gcd(m, n) */ public static int gcd(int m, int n)

Implementação alternativa:

funcionamento diferente.

Mesma interface: usa-se da mesma forma,

faz o mesmo.

Page 11: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

Encapsulação: classes

2013/2014 Fundamentos de Programação 11

Page 12: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

private final double abscissa; private final double ordinate;

{ this.abscissa = abscissa; this.ordinate = ordinate; }

{ return abscissa; }

{ return ordinate; }

{ return Math.sqrt(abscissa * abscissa + ordinate * ordinate); }

{ return Math.atan2(ordinate, abscissa); }

}2013/2014 Fundamentos de Programação 12

public class Point {

public Point(final double abscissa, final double ordinate)

public double getAbscissa()

public double getOrdinate()

public double getRadius()

public double getAngle()

}

private final double abscissa; private final double ordinate;

{ this.abscissa = abscissa; this.ordinate = ordinate; }

{ return abscissa; }

{ return ordinate; }

{ return Math.sqrt(abscissa * abscissa + ordinate * ordinate); }

{ return Math.atan2(ordinate, abscissa); }

}

Interface:• Como se usa.

Interface em documentação (omissa):

• O que representa.• Como se comporta.• Contratos.• Etc.

Implementação:• Como funciona.

Page 13: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

public class Point {

private double rho; private double theta;

public Point(final double abscissa, final double ordinate) { rho = Math.sqrt(abscissa * abscissa + ordinate * ordinate); theta = Math.atan2(ordinate, abscissa); }

public double getAbscissa() { return rho * Math.cos(theta); }

public double getOrdinate() { return rho * Math.sin(theta); }

public double getRadius() { return rho; }

public double getAngle() { return theta; }

}2013/2014 Fundamentos de Programação 13

private final double rho; private final double theta;

{ rho = Math.sqrt(abscissa * abscissa + ordinate * ordinate); theta = Math.atan2(ordinate, abscissa); }

{ return rho * Math.cos(theta); }

{ return rho * Math.sin(theta); }

{ return rho; }

{ return theta; }

}

public class Point {

public Point(final double abscissa, final double ordinate)

public double getAbscissa()

public double getOrdinate()

public double getRadius()

public double getAngle()

}

Implementação alternativa:• Funcionamento diferente.Mesma interface:• Usa-se da mesma forma!

Page 14: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

Controlo de acesso

Pode-se controlar acesso a membros de classes

Usam-se modificadores de acesso public protected private

Java tem quatro categorias de acesso Público – acesso sem restrição Protegido Por omissão ou privado ao pacote Privado – acesso apenas no contexto da própria classe

2013/2014 Fundamentos de Programação 14

Page 15: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

Fundamentos de Programação 15

Encapsulação: controlo de acesso

Característica de classe Tipo Acesso

Operações Interface Público

Propriedades (operações inspectoras obtêm e operações modificadoras alteram)

Interface Público

Métodos auxiliares Implementação

Privado

Métodos enquanto implementação de operações

Implementação

Público

Atributos Implementação

Privados

2013/2014

Page 16: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

Fundamentos de Programação 16

Encapsulação: propriedades Propriedades são interface (inspectores e

modificadores)

public class Rational { …

public int getNumerator() { … } public int getDenominator() { … } …}

Rational rational = new Rational(1, 4);out.println(rational.getDenominator());

2013/2014

Por razões históricas, os inspectores das propriedades começam com o horrível prefixo get.

Page 17: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

Fundamentos de Programação 17

Encapsulação: atributos

Atributos são implementação

public class Rational { private int numerator; private int denominator; …}

Rational rational = new Rational(1, 4);rational.denominator = 0;

2013/2014

Page 18: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

Fundamentos de Programação 18

Encapsulação: métodos auxiliares

Métodos auxiliares são implementação

public class Rational { … public Rational(final int numerator, final int denominator) { … reduce(); } … private void reduce() { final int gcd = IntegerUtilities.gcd(numerator, denominator); numerator /= gcd; denominator /= gcd; } …}

Rational rational = new Rational(2, 8);rational.reduce();

2013/2014

Page 19: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

Fundamentos de Programação 19

Cópia de instâncias

Inicializações e atribuições afectam apenas referências!

Necessário construtor por cópia

public class Point { … public Point(final Point other) { abscissa = other.getAbscissa(); ordinate = other.getOrdinate(); } … private final double abscissa; private final double ordinate;}

Point a = new Point(1.0, -2.0);Point b = a;Point c = new Point(a);

2013/2014

a

(1; -2)b

c

(1; -2)

Page 20: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

Fundamentos de Programação 20

Igualdade de instâncias

Operador == com referências verifica identidade e não igualdade!

Necessária operação!

public class Point { … public boolean isEqualTo( final Point other) { return getAbscissa() == other.getAbscissa() && getOrdinate() == other.getOrdinate(); } …}

Point a = new Point(1.0, -2.0);Point b = a;Point c = new Point(a);

2013/2014

a

(1; -2)b

c

(1; -2)

b == a? Sim.c == a? Não!b.isEqualTo(a)? Sim.c.isEqualTo(a)? Sim!

Mais tarde usaremos equals().

Page 21: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

Fundamentos de Programação 21

A reter

Encapsulação em Java Abstracção Módulos em Java Interface vs. implementação Modificadores de acesso public e private Vantagens da encapsulação

Cópia de instâncias usando construtor

Igualdade entre instâncias usando operação

2013/2014

Page 22: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

Fundamentos de Programação 22

Sumário

Encapsulamento

Cópia de instâncias

Igualdade entre instâncias

2013/2014