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.
Bom, pra começar, poderíamos dividir as opções em métodos diferentes….
Mas porque deveriamos dividir as opções em métodos diferentes? Afinal o codigo apresentado funciona. Isso é só pra ficar mais bonito?
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…
Corrigindo a primeira frase do comentário anterior… “o método tem QUE SER simples e objetivo…”
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
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.
Passei para prestigiar o blog do amigo (que é muito bom)
Mas vamos aguardar o próximo post.
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.