Projetando classes em Java

Confira neste artigo um olhar sobre o papel do design no contexto do processo de desenvolvimento de software.

Fique por dentro
Os criadores da linguagem Java estão constantemente aperfeiçoando a máquina virtual Java para eliminar os gargalos de performance, como a lentidão de métodos sincronizados e os custos do Garbage Collector (GC). O objetivo com essas melhorias é que os programadores não precisem mais se preocupar com tais gargalos ao projetarem os seus programas, devendo manter atenção apenas na implementação de soluções bem estruturadas. Mas no que constitui um bom desenho de um programa? Mostrar o que é e como alcançar esta meta é o objetivo deste artigo. Para isso, será explicado como desenvolver um programa em Java ajudando a pensar de forma planejada e estruturada antes de começar a escrever o código.

Para conseguirmos criar um bom programa em uma linguagem orientada a objetos, temos que ter uma base sólida de fundamentos sobre como criar os nossos objetos. No caso da linguagem Java, como sabemos, o trabalho de instanciar estes objetos cabe às classes. Ao entendermos os bons princípios de desenhos de classes em Java, estaremos aptos a escrever unidades de código independentes o suficiente para serem reutilizadas de várias formas e mantendo um código robusto.

Para compreendermos a importância de um bom desenho de classes, vamos considerar um fabricante de automóveis. Uma grande empresa construtora de automóveis não fabrica todas as partes para cada um dos seus modelos. Várias peças, como rodas, bancos, pneus, sistema de freios, velas, etc., já vêm prontas, de diferentes fabricantes, e depois são montadas nos seus respectivos carros. Este modelo de fabricação especializado por peças ajuda a manter um custo baixo, ao mesmo tempo em que traz uma alta qualidade, criando uma resposta rápida e eficiente às necessidades do mercado. Assim, a principal responsabilidade do fabricante de automóveis é a de desenhar seus carros e montá-los a partir de peças já existentes.

A Programação Orientada a Objetos (POO) nasceu desta mesma ideia de se utilizar módulos pré-existentes na construção de aplicações. Este modelo de programação fornece aos desenvolvedores uma maneira natural e elegante de dividir aplicações em peças pequenas e reutilizáveis, chamadas de objetos, o que viabiliza a construção de aplicações de forma mais eficiente, através da reutilização das coleções de componentes disponíveis.

Assim como as construtoras de automóveis, temos disponível na linguagem Java várias peças, ou objetos, prontos para serem utilizados, quer sejam objetos do próprio framework, quer sejam objetos de terceiros (como da Apache, da SpringSource, etc.), que nos disponibilizam tais recursos através de arquivos JAR (Java ARchive).

Sendo assim, a nossa responsabilidade é a de estruturar nossas aplicações de forma concisa, criando, a partir das peças que temos disponíveis, programas robustos de maneira eficaz. Para isso, vamos ver o que temos disponível na linguagem de programação Java que nos permite desenhar nossas classes de modo a melhor aproveitarmos esses recursos.

Herança

O que é herança em Java? A herança pode ser definida como o processo em que um objeto adquire as propriedades de outro. É um mecanismo para criar uma subclasse que irá herdar atributos e métodos de uma classe já existente. Com o uso de herança, a informação se torna gerenciável por uma ordem hierárquica, como veremos nos exemplos mais à frente. Mas, como a linguagem Java suporta a herança entre objetos?

Sabemos que diferentes tipos de objetos têm, frequentemente, uma certa quantidade de características ou comportamentos em comum. Em Java, estas características e comportamentos são ser herdados de objetos mais genéricos para outros mais específicos, através da utilização de subclasses, o que é definido com a palavra extends. No entanto, a linguagem possui uma restrição que determina que uma classe possa estender apenas uma classe. Esta restrição é chamada de herança única, que evita vários problemas da herança múltipla (como acontece na linguagem C++) onde, por exemplo, um objeto pode herdar dois métodos com o mesmo nome de classes distintas, podendo assim entrar em conflito. Mas ao mesmo tempo que a linguagem Java coloca esta restrição por motivos de segurança, ela também fornece a simulação de herança múltipla através da implementação de interfaces (este assunto será tratado mais à frente), permitindo-nos usufruir dos seus maiores benefícios, sem sofrer dos seus inconvenientes.

Os aspectos mais importantes da herança que devemos ter em conta são: a reutilização de código, o polimorfismo e a invocação de métodos virtuais. Vejamos um exemplo prático para entendermos estes aspectos.

Herança na prática

Para entender melhor como funciona a herança em Java, vamos criar um programa que guarde as informações de empregados de uma empresa. Sabemos que existem diversos tipos de empregados, como gestores, engenheiros, programadores, secretárias, estagiários, etc. Cada um tem um tipo específico de trabalho e suas particularidades, mas todos eles são, para a empresa, um empregado. E para a empresa, todos os empregados devem ter, ao menos, um identificador único, um nome e um salário (para simplificar o exemplo). A Listagem 1 mostra o código que representa o empregado.

Listagem 1. Classe que representa um empregado - Employee.

public class Employee { private String _id; private String _name; private double _salary; public Employee(String id, String name, double salary) { _id = id; _name = name; _salary = salary; } public String getId() { return _id; } public String getName() { return _name; } public double getSalary() { System.out.println("Salário do empregado."); return _salary; } }" [...] continue lendo...

Artigos relacionados