Hélio Engholm Jr

Especializado em Engenharia de Software

DICAS PARA DESIGN E IMPLEMENTAÇÃO DE SISTEMAS OO

CONTEÚDO EXTRAÍDO DO LIVRO

Livro Análise e Design

Indice

1- Herança.

1.1 – Código JAVA para implementação da herança.

2 – Classes abstratas.

2.1 – Utilizando classe abstrata como superclasse para  caixa de agência e gerente operacional

2.2 – Código JAVA para implementação de classe abstrata.

3 – Interfaces.

3.1- Utilização de interface para aplicações financeiras.

3.2 – Código JAVA para utilização da interface.

4 – Polimorfismo.

4.1 – Utilização de polimorfismo para o menu da aplicação.

4.2 – Código JAVA para utilização de polimorfismo.

1- Herança

Herança é um mecanismo onde temos uma classe definida a partir de outra, adicionando todas as funcionalidades e propriedades daquele nela mesma e podendo adicionar outras que se mostrem necessárias. Sua utilização força que a subclasse inclua todos os métodos e propriedades de sua superclasse.

Por outro lado, a utilização da herança permite o override de métodos que pode ser considerado como uma substituição do método original da superclasse. Este recurso é prático pois nos permite redefinir as ações do método original da superclasse na subclasse.

Algumas linguagens orientadas a objetos permitem uma única herança.

A figura 1 mostra o diagrama de classes que representa a herança proposta neste exemplo. Observe nesta figura que o objeto GerenteOperacional faz overhead do método aumentaSalario(), pois o cálculo deste aumento é diferenciado daquele da superclasse que é utilizado pela entidade CaixaAgencia.

heranca

Figura 1 – Exemplo de herança.

1.1 – Código JAVA para implementação da herança

Veja a seguir a implementação da herança da figura 1 em JAVA, juntamente com um programa de console para testar o código.

Classe Funcionario

package heranca;

public class Funcionario {

public Funcionario(){

salario = 1000;

}

//Membros de dados

String nome=”", CPF=”";

double salario = 0;

//Funcoes membro

public String getNome(){ return nome;}

public double getSalario(){ return salario; }

public void aumentasalario(double aumento){

salario += aumento;

}

}

Classe GerenteOperacional

package heranca;

public class GerenteOperacional extends Funcionario{

double bonus = 100;

public void aumentaBonus(double aumento){

bonus += aumento;

}

public double getSalario(){ return salario + bonus; }

}

Classe CaixaAgencia

package heranca;

public class CaixaAgencia extends Funcionario{

String educacao = “Educacao do caixa”;

public String getEducacao() {  return educacao; }

}

Aplicação de console para o teste

package principal;

import heranca.*;

public class Principal {

public static void main(String[] args) {

System.out.println(“Heranca”);

Funcionario f = new Funcionario();

System.out.println(“Salario do objeto da superclasse:” + f.getSalario());

CaixaAgencia c = new CaixaAgencia();

c.aumentasalario(500);

System.out.println(“Salario do funcionario com aumento de R$500,00:” + c.getSalario());

GerenteOperacional g = new GerenteOperacional();

g.aumentaBonus(350);

System.out.println(“Salario do gerente com aumento do bonus em R$350,00:” + g.getSalario());

}

2 – Classes abstratas

Classes abstratas possuem uma função importante na orientação a objetos. São classes que possuem pelo menos um método abstrato e que, deste modo, não podem ser instanciadas pelo programa. Elas devem ser consideradas como modelos para classes concretas, aquelas que comumente utilizamos.

Em classes abstratas podemos ter a definição de atributos, métodos e definir construtores, mas devemos ter pelo menos um método abstrato. A única maneira de utilizá-las é através de herança por classes concretas, que devem implementar seus métodos abstratos.

2.1 – Utilizando classe abstrata como superclasse para  caixa de agência e gerente operacional

A figura 2 mostra a utilização de superclasse abstrata relacionada a funcionário. Esta classe possui o método abstrato aumentaSalario() que deverá ser implementada por todas suas subclasses, neste exemplo GerenteOperacional e CaixaAgencia. Isto é válido, já que cada tipo de funcionário possui suas particularidades na hora de se calcular os respectivos salários.

classe abstrata

Figura 2 – Exemplo de classe abstrata.

2.2 – Código JAVA para implementação de classe abstrata

Mostramos a seguir a implementação da classe Funcionario como sendo abstrata com relação ao método aumentaSalario(). Este método é implementado de maneiras diferentes nas classes CaixaAgencia e GerenteOperacional, observe o código JAVA a seguir.

Classe Funcionario

package classesAbstratas;

public abstract class Funcionario {

public Funcionario(){

salario = 1000;

}

//Membros de dados

String nome=”", CPF=”";

double salario = 0;

//Funcoes membro

public String getNome(){ return nome;}

public double getSalario(){ return salario; }

public void setSalario(double salario){ this.salario = salario; }

public abstract void aumentasalario(double aumento);

}

 

Classe GerenteOperacional

package classesAbstratas;

import heranca.Funcionario;

public class GerenteOperacional extends Funcionario{

double bonus = 100;

public void aumentaBonus(double aumento){

bonus += aumento;

}

public  void aumentasalario(double aumento){

super.setSalario(super.getSalario()+aumento+bonus*.02);

}

}

 

Classe CaixaAgencia

package classesAbstratas;

import heranca.Funcionario;

public class CaixaAgencia extends Funcionario{

String educacao = “Educacao do caixa”;

public String getEducacao() {  return educacao; }

public  void aumentasalario(double aumento){

super.setSalario(super.getSalario()+aumento);

}

}

 

3 – Interfaces

Interface pode ser vista como um nome relacionado a um conjunto de operações que caracterizam um comportamento de uma entidade, definindo as ações que devem ser obrigatoriamente executadas, mas que cada classe que as implementa pode implementá-las de maneiras diferente.

A ideia é definir em uma interface assinaturas de métodos que devem ser implementados da maneira apropriada por outras classes. Isso deve-se ao fato de que muitos objetos (classes) podem possuir uma mesma ação sendo executada de maneiras diferentes.

3.1- Utilização de interface para aplicações financeiras

Vamos mostrar agora, como podemos utilizar o conceito de interface na modelagem dos objetos relacionados à aplicação financeira de nosso estudo de caso. No mercado temos diversos tipos de aplicação financeira com algumas propriedades e métodos análogos e outros específicos de cada uma delas. Deste modo, podemos modelar nosso sistema para agrupar o que for comum em uma classe única para reaproveitamento de código e separar o que for diferente em outros objetos específicos.

interface

Figura 3 – Exemplo da utilização de interface.

Observe através deste exemplo como fica fácil agora criar outros objetos aplicação financeira em nosso sistema, bastando apenas especializar novas classes com suas particularidades de negócio.

Veja também o Artigo 10 – Programando para Interfaces.

3.2 – Código JAVA para utilização da interface

A seguir é mostrada a implementação da classe AplicacaoFinanceira, da FIF12 e da interface que define os métodos que deverão ser implementados pelas classes de aplicação financeira do sistema. Observe que neste exemplo, conseguimos desacoplar os métodos que manipulam os membros de dados da classe AplicacaoFinanceira, que são implementados nas subclasses.

Interface ControleAplicacaoFinanceira

package interfacePackage;

public interface ControleAplicacaoFinanceira {

public void realizaAplicacao(double valorAplicacao);

public void realizaResgate(double valorAplicacao);

public void calculaRendimento();

}

 Classe AplicacaoFinanceira

package interfacePackage;

import java.sql.Date;

public class AplicacaoFinanceira {

Date dataAbertura = null;

double saldo = 0;

String status = “”;

public double retornaSaldo(){return saldo;};

public void realizaDepositoNaAplicacao(double valorDeposito){

saldo += valorDeposito;

};

public void cancelaAplicacao(){};

}

 

 

 

Classe FIF12

package interfacePackage;

public class FIF12 extends AplicacaoFinanceira implements ControleAplicacaoFinanceira{

public void realizaAplicacao(double valorAplicacao){saldo = valorAplicacao;};

public void realizaResgate(double valorResgate){

if(valorResgate < saldo)

saldo -= valorResgate;

};

public void calculaRendimento(){}

public void realizaResgateAntecipado(double valorResgate){}

}

4 – Polimorfismo

Através do polimorfismo um nome pode representar diferentes classes relacionada a uma superclasse em comum. Ele permite esconder ações diferentes em uma interface única e é normalmente implementado através de herança.

4.1 – Utilização de polimorfismo para o menu da aplicação

Poderíamos explorar bastante o uso do polimorfismo através da prática do banco Omega, especialmente na parte de aplicações financeiras. Mas vamos aplicar neste exemplo polimorfismo para o menu do sistema.

Para utilizarmos polimorfismo no sistema, poderíamos criar as classes apresentadas na figura 4 e utilizar uma referência polimórfica para carregar o menu adequado após o login.

polimorfismo

Figura 4 – Classes para o polimorfismo.

4.2 – Código JAVA para utilização de polimorfismo

A seguir é mostrada a implementação das classes Menu, MenuGerenteOperacional, MenuCaixaDeAgencia e a classe Principal que possui aplicação de console para testar a implementação do polimorfismo da figura 6.14.

Classe Menu

package polimorfismo;

public class Menu{

public Menu(){

}

public String getMenu(){

return “”;

}

}

Classe MenuGerenteOperacional

package polimorfismo;

public class MenuGerenteOperacional extends Menu{

public MenuGerenteOperacional(){

}

public String getMenu(){

return “MenuGerenteOperacional”;

}

}

Classe MenuCaixaDeAgencia

package polimorfismo;

public class MenuCaixaDeAgencia extends Menu{

public MenuCaixaDeAgencia(){

}

public String getMenu(){

return “MenuCaixaDeAgencia”;

}

}

Classe Principal

package polimorfismo;

public class Principal {

public static void main(String []s){

Menu referenciaPolimorfica;

//Armazenando objeto da classe MenuGerenteOperacional na Referência polimórfica

referenciaPolimorfica = new MenuGerenteOperacional();

System.out.println(“Referencia polimorfica para menu gerente operacional:” + referenciaPolimorfica.getMenu());

//Armazenando objeto da classe MenuCaixaDeAgencia na mesma Referência polimórfica

referenciaPolimorfica = new MenuCaixaDeAgencia();

System.out.println(“Referencia polimorfica para menu caixa de agencia:” + referenciaPolimorfica.getMenu());

}

}

 

 

 




+ Artigos