Esse código que acabei de escrever está bom?

No inicio do aprendizado da linguagem Java, tudo é dificil. Não conseguimos nem mesmo converter um string em um numero ou vice e versa. Pra superar estas dificuldades recorremos a livros, apostilas, fóruns, blogs ou cursos.

Depois de ler livros, ou fazer cursos, essas “dificuldades operacionais” desaparecem, afinal aprendemos a usar melhor a linguagem e passamos a conhecer melhor suas apis. Nesse ponto já somos capazes de por exemplo converter um String em um numero, criar e organizar listas de elementos, usar arquivos para realizar operações de leitura e escrita.

Uma vez que já sabemos criar aplicações em Java, precisamos nos perguntar outras coisas:

  • “As aplicações que criamos foram constuidas da melhor maneira possível?”
  • “Meu código está orientado a objetos, ou é apenas procedural Java?”
  • “Como eu identifico o que deve e o que nao deve ser uma classe no meu sistema?”

A boa noticia é que estas perguntas possuem respostas. A má noticia é que eu não vou dar todas as respostas de bandeja a vocês. Ao invés disso vamos aprender a ter “senso critico” sobre o código que escrevemos. Para isso vamos começar simplesmente criando uma pequena e simples aplicação Java para cadastro e consulta de Dvd’s.

Em geral, nos preocupamos primeiramente em escrever uma aplicação que funcione, e talvez esta atitude nos leve a não ter uma aplicação bem construida. Existem várias “desculpas” que podemos utilizar para justificar esse tipo de construção, mas dentre elas destacam-se as classicas: “nao tenho tempo” e “o cronograma está apertado”. =)

Nesta primeira etapa estamos interessados em escrever uma aplicação que funcione. ( Talvez porque estejamos sem tempo =p )

Bem, para isso nos vamos precisar da classe Dvd, entao:

public class Dvd {
	private String titulo;
	private String sinopse;
	private String genero;
	private String ano;
	private String duracao;
	private boolean emprestado;
        //Gets e Sets
}

Agora vamos a nossa classe “principal”:

public class Principal {
	public static void main(String[] args) throws FileNotFoundException {
		Scanner scan = new Scanner(System.in);
		int opcao = 0;
		do {
			System.out
					.println("--------------- Controle de Dvds e Cds ---------------");
			System.out.println("   1 - Cadastrar Novo Dvd ");
			System.out.println("   2 - Listar Dvd's ");
			System.out.println("   3 - Terminar ");
			System.out
					.println("------------------------------------------------------");
			System.out.println(" Escolha uma opção:--> ");
 
			opcao = scan.nextInt();
 
			switch (opcao) {
			case 1: {
				BufferedReader br = new BufferedReader(new InputStreamReader(
						System.in));
				PrintStream ps = new PrintStream(new File("Dvds.txt"));
				try {
					Dvd dvd = new Dvd();
					System.out.println("Titulo.: ");
					dvd.setTitulo(br.readLine());
					System.out.println("Sinopse: ");
					dvd.setSinopse(br.readLine());
					System.out.println("Genero.: ");
					dvd.setGenero(br.readLine());
					System.out.println("Ano....: ");
					dvd.setAno(br.readLine());
					System.out.println("Duracao: ");
					dvd.setDuracao(br.readLine());
 
					ps.println(dvd.getTitulo());
					ps.println(dvd.getSinopse());
					ps.println(dvd.getGenero());
					ps.println(dvd.getAno());
					ps.println(dvd.getDuracao());
					ps.close();
					br.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
				break;
			}
			case 2: {
				System.out
						.println("------------- Lista de Dvd's -------------");
				Scanner reader = new Scanner(new File("Dvds.txt"));
				while (reader.hasNext()) {
					System.out.println(reader.nextLine());
				}
				reader.close();
			}
			}
		} while (opcao < 3);
	}
}

É isso ai gente! Nossa aplicação está pronta e funcionando. Porém eu faço a vocês duas perguntas:
Este codigo está bom? Porque?

No proximo post, vamos analisar este codigo responder a estas perguntas. Porém você que leu este post nao precisa esperar, pode escrever seu comentario aqui respondendo esta pergunta.

Abraços,
Sergio Junior

Confira a sequencia deste post aqui.

  1. Márcio says:

    Bom, pra começar, poderíamos dividir as opções em métodos diferentes…. ;)

  2. Mas porque deveriamos dividir as opções em métodos diferentes? Afinal o codigo apresentado funciona. Isso é só pra ficar mais bonito?

  3. Márcio says:

    Não é para ficar mais “bonito”, o método tem quer simples e objetivo e fazer apenas o que foi designado a ele. Isso auxilia muito na hora de uma manutenção… Imagina esse código aí com 20 opções a trabalheira que iria dar para um desenvolvedor dar uma manutenção (principalmente para que não conhece o código). Acho que essa divisão de métodos já seria um bom começo…

  4. Márcio says:

    Corrigindo a primeira frase do comentário anterior… “o método tem QUE SER simples e objetivo…”

  5. ACMattos says:

    Nosso sistema, como proposto, é um programa procedural. Não há divisão de responsabilidades. Uma única classe é responsável pela gerência da interface, CRUD de dados e é o próprio mecanismo de persistência.
    Além destes aspectos existem os mencionados pelo Marcio. Temos q

  6. ACMattos says:

    Temos ter em mente o grau de manutenibilidade de nosso sistema. Uma boa organização da classe já é o inicio do refactor para organizar o sistema em classes que colaboram entre si.
    Mas vamos aguardar o próximo post. ;) Passei para prestigiar o blog do amigo (que é muito bom)

  7. Gabriel Amorim says:

    Acredito que carece de divisão de responsabilidades, no exemplo acima foge a regra de desenvolvimento orientado a Objeto, esta tudo definito e trabalhado em apenas uma clase, começaria com a criaçao de um metodo para cada opcao do Menu.
    Tornaria as classes BufferedReader e PrintStream extensões da classe DVD, e por sua vez DVD se tornaria Super, etc e por ai vai.

    Abraços seu Aluno Gabriel Amorim FJ-11 da Caelum.

  1. There are no trackbacks for this post yet.

Leave a Reply