Sugestões programa básico OOP

5 respostas
M

Pessoal estou começando a programar em JAVA, então comecei lendo a apostila Caelum Java Objetos FJ11, eu li ate o Capitulo 4 quando decidi fazer um programa Orientado a Objetos que calcula a área do Circulo, Quadrado, Retângulo e Triangulo.
Então eu vou postar o código aqui para vocês avaliarem e darem sugestões sobre a organização do código e tals.

CalculaArea.java
package CalculaArea;

import java.util.Scanner;

class CalculaArea {
    public static void main(String args[]) {
        Scanner entrada = new Scanner(System.in);
        Menu menu = new Menu();
        int opc2;
   
    do {    
        menu.Principal();
        int opc = entrada.nextInt();
        
        switch (opc) {
        case 1 : menu.Circulo();
        break;
        case 2 : menu.Triangulo();
        break;
        case 3 : menu.Retangulo();
        break;
        case 4 : menu.Triangulo();
        break;
        }
        System.out.println ("Deseja voltar para o Menu Principal? 1.Sim / 2.Não");
        opc2 = entrada.nextInt();    
    } while (opc2 == 1);

    }
}
Menu.java
package CalculaArea;

import java.util.Scanner;

public class Menu {
    
    Scanner entrada = new Scanner(System.in);
    Area area = new Area();

    void Principal () {
        System.out.println ("Calcula Area OOP by Gnomo");
        System.out.println ("1 - Area do Circulo");
        System.out.println ("2 - Area do Quadrado");
        System.out.println ("3 - Area do Retangulo");
        System.out.println ("4 - Area do Triângulo Retângulo");
    }
    
    void Circulo() {

        System.out.println ("Digite o valor de PI: ");
        double pi = entrada.nextDouble();
        System.out.println ("Digite o RAIO: ");
        double raio = entrada.nextDouble();    
        area.Circulo(pi,raio);
    }
    
    void Quadrado() {
        System.out.println ("Digite o valor do lado do quadrado: ");
        double lado = entrada.nextDouble();
        area.Quadrado(lado);
    }
    
    void Retangulo() {
        System.out.println ("Digite o valor da base: ");
        double base = entrada.nextDouble();
        System.out.println ("Digite o valor da altura: ");
        double altura = entrada.nextDouble();
        area.Retangulo(base,altura);
    }
    
    void Triangulo() {
        System.out.println ("Digite o valor da base: ");
        double base = entrada.nextDouble();
        System.out.println ("Digite o valor da altura");
        double altura = entrada.nextDouble();
        area.Triangulo(base, altura);
    }
}
Area.java
package CalculaArea;

public class Area {
    private double areaCirculo;
    private double areaQuadrado;
    private double areaRetangulo;
    private double areaTriangulo;
    
    void Circulo(double pi, double raio) {
        this.areaCirculo = pi * raio * 2;
        System.out.println ("A area do circulo é: " + this.areaCirculo);
    }
    
    void Quadrado(double lado) {
        this.areaQuadrado = lado * lado;
        System.out.println ("A area do quadrado é: " + this.areaQuadrado);
    }
    
    void Retangulo(double base, double altura) {
        this.areaRetangulo = base * altura;
        System.out.println ("A area do retangulo é: " + this.areaRetangulo);
    }
    
    void Triangulo(double base, double altura) {
        this.areaTriangulo = (base * altura)/2;
        System.out.println ("A area do triangulo é: " + this.areaTriangulo);        
    }
    
    
}

5 Respostas

R

legal, mas para ficar um OO mais “puro” seria ideal você pensar mais em objetos do mundo real, por exemplo:

Círculo, quadrado, retângulo, etc são seus objetos, área não seria um objeto. O melhor seria que você tivesse classes Círculo, Retângulo, Quadrado, etc, e dentro de cada uma você incluir um método que calcule a área destes objetos

renzonuccitelli

Do jeito que vc fez está muito procedural. Mas o exemplo que vc está fazendo é bom para vermos conceitos.

Primeiramente vc tem que abstrair. Então o que vc quer são figuras que saibam responder sua área. Bom seria então criar uma interface comum:
package base;

public interface Area {
	double calcArea();
}
Agora, basta vc fazer suas figuras:
package base;

public class Quadrado implements Area {
	private double a;

	@Override
	public double calcArea() {
		return a * a;
	}

	@Override
	public String toString() {
		return "Quadrado [a=" + a + "]";
	}

	public Quadrado(double a) {
		this.a = a;
	}
}
package base;

public class Retangulo implements Area {
	private double a;
	private double b;

	@Override
	public double calcArea() {
		return a * b;
	}

	public Retangulo(double a, double b) {
		this.a = a;
		this.b = b;
	}

	@Override
	public String toString() {
		return "Retangulo [a=" + a + ", b=" + b + "]";
	}
}
Então vc escreve uma classe pra printar as áreas:
package base;

import java.util.ArrayList;
import java.util.List;

public class Main {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		List<Area> areaList = new ArrayList<Area>();
		areaList.add(new Quadrado(2));
		areaList.add(new Quadrado(4));
		areaList.add(new Retangulo(2, 3));
		areaList.add(new Retangulo(8, 3));
		for (Area a : areaList) {
			System.out.println(a.toString() + " Possui área = " + a.calcArea());
		}
	}
}

O pulo do gato de OO está aqui. Agora, se vc kiser printar a area de um circulo, não é necessário rescrever toda a classe. Vc só precisa implementar seu circulo extendendo a Area e adicionar na lista. O código de impressão já está pronto.

Então a grande sacada em OO é se perguntar qual é a abstração e traduzir a mesma em uma interface ou classe abstrata.

Do jeito que vc fez a coisa está procedural demais. Se vc quiser colocar a área de uma nova figura, tem que mexer por todo seu código, coloca mais uma clausula no switch case.

Espero ter clarificado as coisas.

[]s

aajjbb

Aula de OO. vlw

renzonuccitelli

Pois é, abri a Nuccitec, então OO tem que estar na veia…hehe.

Quando vc começa e pensar em termos de interface é quando começa efetivamente a aprender OO.

Eu confesso que demorei um pouco pra pegar o pulo do gato.

[]s

M

renzonuccitelli, consegui entender o seu exemplo. Axo que isso vai ficar mais claro para mim quando eu ler um pouco mais sobre arrays, list, set e maps.

Obrigado a todos que derão sugestões.

Criado 1 de outubro de 2010
Ultima resposta 2 de out. de 2010
Respostas 5
Participantes 4