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)