Neste módulo veremos:
Na abordagem orientada a objetos de programação de computadores (POO -- Programação Orientada a Objetos) uma tarefa inicial e fundamental é a definição dos objetos.
Para definir um objeto o analista/programador precisa abstrair
os conceitos envolvidos no problema a ser resolvido para
identificar os objetos, ou seja, é necessario abstrair para
POO os objetos do mundo real
.
Neste processo de abstração é crucial definir a granularidade dos objetos, ou melhor, seu nível de detalhamento. Vejamos um exemplo de comoum automóvel pode ser visto como diferentes objetos por diferentes especialistas:
Pelo exemplo acima, podemos inferir que a visão de um analista ou
programador pode ter amplitudes diferentes ao se analisar
os mesmos objetos.
O problema da granularidade
é uma das questões essenciais que a modelagem orientada
a objetos auxilia resolver.
Juntamente com a tarefa de abstração e posterior definição de um objeto vem a questão da separabilidade ou não de componentes do objeto analisado.
Por exemplo: quando pensamos num automóvel, na visão de
um mecânico, será que não poderíamos dividí-lo em
sub-objetos
, ou seja, em componentes menores, por
exemplo: motor, suspensão, chassi, câmbio... e estes
ainda em: pistão, rodas, engrenagens...
A modularização é justamente esta outra tatefa árdua de segmentar, dividir um objetos em unidades físicas, no nosso caso de POO, em unidades lógicas, menores e que podem ser tratadas independentemente e, ainda mais, serem reunidas para formarem um novo objeto.
Vamos imaginar um relógio digital constituído de dois mostradores, um para os minutos e outro para as horas, algo do tipo 13:47, para mostrar treze horas e quarenta e sete minutos.
Para nossa abstração, existirão dois objetos do tipo mostrador, um que mostra de 0 a 24 para as horas e outro de 0 até 60 para os minutos. O conjunto formado por dois mostradores será um relógio.
Vejamos parte do código fonte abaixo:
public class Mostrador { private int limite; private int value; // construtor e metodos } public class Relogio { private Mostrador horas; private Mostrador minutos; // construtor e metodos }
/** Mostrador * @author Kölling e Barnes * @version 20.ago.2005 */ public class Mostrador { private int limite; private int valor; public Mostrador(int termino) { limite=termino; valor=0; } public int getValor() { return valor; } public void setValor(int entrada) { if((entrada>=0)&&(entrada<limite)) valor=entrada; } // retorna o valor do mostrador public String getMostrador() { if (valor<10) return "0"+valor; else return ""+valor; } public void incrementa() { valor=(valor+1)%limite; } }
public String getMostrador() { if (valor<10) return "0"+valor; else return ""+valor; }
Notem mais uma vez que o operador +
não é um
operador de adição e sim um concatenador de
cadeias de caracteres, de String
.
O tipo String
é o tipo do retorno e
"0"
é uma string que será concatenada
com a string formada pelos caracteres do valor do mostrador.
public void incrementa() { valor=(valor+1)%limite; }
O operador módulo (%
) calcula o resto de uma divisão
de inteiros. Logo, se o contador ultrapassar o limite
estabelecido, o valor retorna para zero.Vejamos agora a classe
Relogio
:
/** Relogio * @author Kölling e Barnes * @version 20.ago.2005 */ public class Relogio { private Mostrador hora; private Mostrador minuto; // simula mostrador private String display; public Relogio() { hora = new Mostrador(24); minuto = new Mostrador(60); updateDisplay(); } public Relogio(int hora_e, int minuto_e) { hora = new Mostrador(24); minuto = new Mostrador(60); setTime(hora_e, minuto_e); } public void setTime(int hora_e, int minuto_e) { hora.setValor(hora_e); minuto.setValor(minuto_e); updateDisplay(); } public String getTime() { return display; } private void updateDisplay() { display=hora.getMostrador()+":"+ minuto.getMostrador(); } public void avancaTempo() { minuto.incrementa(); if(minuto.getValor()==0) hora.incrementa(); updateDisplay(); } }
Vejamos agora cada componente separadamente da classe Relogio
.
public class Relogio { private Mostrador hora; private Mostrador minuto; // simula mostrador private String display;
Notem que hora
e minuto
são atributos
da classe Mostrador
, como já tínhamos adiantado.
O identificador display
, da classe String
,
que é a impressão visual dos valores de hora
e minuto
, também é um atributo da classe.
São dois os construtores. O construtor padrão inicializa o relógio com os limites máximos do mostrador, um suma, declarar que o relógio estará no formato de 24 horas. O outro construtor faz o mesmo mas inicializa o display com qualquer valor, ou seja, ajusta, acerta o relógio.
Veja aqui as chamadas ao métodos construtores
da classe Mostrador
vista anteriormente.
public Relogio() { hora = new Mostrador(24); minuto = new Mostrador(60); updateDisplay(); } public Relogio(int hora_e, int minuto_e) { hora = new Mostrador(24); minuto = new Mostrador(60); setTime(hora_e, minuto_e); }
public void setTime(int hora_e, int minuto_e) { hora.setValor(hora_e); minuto.setValor(minuto_e); updateDisplay(); }
Observem o envio da mensagem setValor()
passada ao tipo Mostrador
nos objetos
hora
e minuto
.
public String getTime() { return display; }
Simples! Retorna o tipo String
na figura do
atributo display
que poderá ser impresso
pelo objeto que invocar o objeto Relogio
.
private void updateDisplay() { display=hora.getMostrador()+":"+ minuto.getMostrador(); }
Este método é o responsável por manter a cadeia de caracteres
display
atualizada e no formato aproximado de um relógio digital.
Aqui também há uma concatenação de cadeias de caracteres.
public void avancaTempo() { minuto.incrementa(); if(minuto.getValor()==0) hora.incrementa(); updateDisplay(); }
Este método incrementa o valor do minuto no relógio. Quando o valor do minuto chegar ao seu limite as horas são incrementadas.
Relogio
.
x
e y
e, a partir desta classe, construir uma classe retângulo.
(evandro at usp ponto br)