HERANÇA Prog. Orientada a Objetos em Java
Lembrando: Acoplamento slide 2 O acoplamento se refere às ligações entre distintas unidades de um programa. Se duas classes dependem rigorosamente de muitos detalhes uma da outra, dizemos que são fortemente acopladas. Nosso objetivo é o acoplamento fraco.
Lembrando: Coesão slide 3 A coesão refere-se ao número e à diversidade de tarefas pelas quais uma única unidade de uma aplicação é responsável. Se cada unidade é responsável por uma única tarefa lógica, dizemos que ela tem alta coesão. A coesão se aplica a classes e métodos. Buscamos a alta coesão.
Lembrando: Acoplamento fraco slide 4 Se duas classes dependem rigorosamente de muitos detalhes uma da outra, dizemos que são fortemente acopladas O acoplamento fraco possibilita: entender uma classe sem ler outras mudar uma classe sem afetar outras assim: melhora a capacidade de manutenção
Lembrando: Alta coesão slide 5 Se cada unidade é responsável por uma única tarefa lógica, dizemos que ela tem alta coesão. A alta coesão possibilita: entender o que uma classe ou método faz usar nomes descritivos reusar classes ou métodos
Lembrando: Coesão slide 6 Métodos: Um método deve ser responsável por apenas uma tarefa bem definida. Classes: As classes devem representar uma entidade única, bem definida.
Lembrando: Design baseado na responsabilidade slide 7 Questão: onde adicionar um novo método (que classe)? Cada classe deve ser responsável por manipular seus próprios dados. A classe que deter os dados deve ser responsável por processá-los. RDD resulta em acoplamento fraco.
Lembrando: slide 8 Duplicação de código Sinal de baixa coesão de métodos Encapsulamento Reduz acoplamento Design baseado na responsabilidade Reduz acoplamento Acoplamento implícito Gera bugs difíceis de encontrar Código mal estruturado grande quantidade de trabalho para alteração.
Principais conceitos a serem abrangidos slide 9 Herança Subtipagem Substituição Variáveis polimórficas
O exemplo do DoME slide 10 "Banco de dados de entretenimento multimídia" armazena detalhes sobre CDs e DVDs CD: título, artista, número de faixas, tempo de reprodução, flag go-it, comentário DVD: título, artista, número de faixas, tempo de reprodução, flag go-it, comentário permite (posteriormente) pesquisar informações ou imprimir listas
slide 11 Objetos DoME
Classes DoME slide 12 metade superior mostra os campos metade inferior mostra os métodos
Modelo de objeto DoME slide 13 2008 by Pearson Education Programãção orientada com objetos JAVA Uma introdução prática utilizando o BlueJ Barnes Kölling
slide 14 Diagrama de classes
slide 15 Código-fonte do CD [ ] incompleto (comentários!) public class CD { private String title; private String artist; private String comment; public CD(String thetitle, String theartist) { title = thetitle; artist = theartist; comment = " "; public void setcomment(string newcomment) {... public String getcomment() {... public void print() {......
slide 16 Código-fonte do DVD [ incompleto ] (comentários!) public class DVD { private String title; private String director; private String comment; public DVD(String thetitle, String thedirector) { title = thetitle; director = thedirector; comment = " "; public void setcomment(string newcomment) {... public String getcomment() {... public void print() {......
Código-fonte de Database slide 17 class Database { private ArrayList<CD> cds; private ArrayList<DVD> dvds;... public void list() { for(cd cd : cds) { cd.print(); System.out.println(); // linha em branco entre itens for(dvd dvd : dvds) { dvd.print(); System.out.println(); // linha em branco entre itens
Crítica de DoME slide 18 duplicação de código classes CD e DVD muito semelhantes (grande parte é idêntica) torna manutenção difícil/mais trabalho introduz risco de bugs por meio da manutenção incorreta duplicação de código também na classe Database
slide 19 Utilizando herança
Utilizando herança slide 20 define uma superclasse : item define subclasses para Video e CD a superclasse define atributos comuns as subclasses herdam os atributos de superclasse as subclasses adicionam atributos próprios
slide 21 Hierarquias de herança
Herança em Java slide 22 public class Item {... nenhuma alteração aqui alteração aqui public class CD extends Item {... public class DVD extends Item {...
Superclasse slide 23 public class Item { private String title; private int playingtime; private boolean gotit; private String comment; // construtores e métodos omitidos.
Subclasses slide 24 public class CD extends Item { private String artist; private int numberoftracks; // construtores e métodos omitidos. public class DVD extends Item { private String director; // construtores e métodos omitidos.
Herança e construtores slide 25 public class Item { private String title; private int playingtime; private boolean gotit; private String comment; /** * Inicializa os campos do item. */ public Item(String thetitle, int time) { title = thetitle; playingtime = time; gotit = false; comment = ""; // métodos omitidos
Herança e construtores slide 26 public class CD extends Item { private String artist; private int numberoftracks; /** * Constructor for objects of class CD */ public CD(String thetitle, String theartist, int tracks, int time) { super(thetitle, time); artist = theartist; numberoftracks = tracks; // métodos omitidos
Chamada de construtor de superclasse slide 27 Os construtores de superclasse devem sempre conter uma chamada 'super'. Se nenhuma for escrita, o compilador insere uma (sem parâmetros): funciona somente se a superclasse tiver um construtor sem parâmetros. Deve ser a primeira instrução no construtor de subclasse.
slide 28 Adicionando mais tipos de item
slide 29 Hierarquias mais profundas
slide 30 Revisão (até esse ponto) A herança (até esse ponto) ajuda: A evitar a duplicação de código A reutilizar código A facilitar a manutenção Extensibilidade
Novo código-fonte de Database slide 31 public class Database { private ArrayList<Item> items; evita duplicação de código no cliente! /** * Cria uma classe Database vazia. */ public Database() { items = new ArrayList<Item>(); /** * Adiciona um item ao banco de dados. */ public void additem(item theitem) { items.add(theitem);...
Novo código-fonte de Database slide 32 /** * Imprime uma lista de todos os CDs armazenados * atualmente e DVDs ao terminal de texto. */ public void list() { for(item item : items) { item.print(); // Imprime uma linha em branco entre itens System.out.println(); 2008 by Pearson Education Programãção orientada com objetos JAVA Uma introdução prática utilizando o BlueJ Barnes Kölling
Subtipagem slide 33 Primeiro, tínhamos: public void addcd(cd thecd) public void addvideo(dvd thedvd) Agora, temos: public void additem(item theitem) Chamamos esse método com: DVD mydvd = new DVD(...); database.additem(mydvd); 2008 by Pearson Education Programãção orientada com objetos JAVA Uma introdução prática utilizando o BlueJ Barnes Kölling
Subclasses e subtipos slide 34 Classes definem tipos. Subclasses definem subtipos. Objetos de subclasses podem ser usados onde os objetos de supertipos são necessários. (Isso é chamado de substituição.)
Subtipagem e atribuição slide 35 os objetos de subclasse podem ser atribuídos a variáveis de superclasse Vehicle v1 = new Vehicle(); Vehicle v2 = new Car(); Vehicle v3 = new Bicycle();
Subtipagem e transmissão de parâmetro slide 36 public class Database { public void additem(item theitem) {... DVD dvd = new DVD(...); CD cd = new CD(...); os objetos de subclasse podem ser atribuídos a variáveis de superclasse database.additem(dvd); database.additem(cd);
slide 37 Diagrama de objetos
slide 38 Diagrama de classes
Variáveis polimórficas slide 39 As variáveis de objeto em Java são polimórficas. (Podem armazenar objetos de mais de um tipo.) Podem armazenar objetos do tipo declarado ou subtipos do tipo declarado.
Coerção slide 40 É possível atribuir o subtipo ao supertipo. Não é possível atribuir o subtipo ao supertipo! Vehicle v; Car c = new Car(); v = c; // correto; c = v; erro de tempo de compilação! A coerção corrige isso: c = (Car) v; (ok apenas se o veículo for de fato um carro!)
Coerção slide 41 Um tipo de objeto entre parênteses. Usado para superar 'perda do tipo'. O objeto não é alterado de modo algum. Uma verificação em tempo de runtime é feita para garantir que o objeto realmente é desse tipo: ClassCastException se não for! Utilize-a com moderação.
A classe Object slide 42 Todas as classes herdam de Object.
Coleções polimórficas slide 43 Todas as coleções são polimórficas. Elementos são do tipo Object. public void add(object element) public Object get(int index)
Coleções e tipos primitivos slide 44 Todos os objetos podem ser inseridos em coleções...... porque coleções aceitam elementos do tipo Object...... e todas as classes são subtipos de Object. Excelente! Mas o que dizer dos tipos simples?
Classes wrappers slide 45 Tipos primitivos (int, char, etc) não são objetos. Eles devem ser empacotados em um objeto! Existem classes empacotadoras para todos os tipos simples: tipo simples classe empacotadora int Integer float Float char Character......
Classes wrappers slide 46 int i = 18; Integer iwrap = new Integer(i); int value = iwrap.intvalue(); empacota o valor desempacota-o Na prática, autoboxing e unboxing significam que não precisamos fazer isso com freqüência.
Autoboxing e unboxing slide 47 private ArrayList<Integer> marklist; public void storemark(int mark) { marklist.add(mark); autoboxing int firstmark = marklist.remove(0); unboxing
Revisão slide 48 A herança permite a definição de classes como extensões de outras classes. Herança: evita a duplicação de código permite reuso de código simplifica o código simplifica a manutenção e extensão Variáveis podem armazenar objetos de subtipo. Subtipos podem ser usados sempre que se esperar objetos de supertipo (substituição).