A linguagem Java é uma linguagem OO,
tendo sido lançada em 1995 pela Sun MicroSystems. É uma das linguagens
de programação OO mais amplamente utilizadas no mundo. Segundo Deitel e
Deitel (2005).
Java é uma linguagem que possibilita a criação de páginas web
com conteúdo dinâmico e interativo, o desenvolvimento de aplicativos
corporativos de grande porte, o aprimoramento da funcionalidade de
servidores web e o fornecimento de aplicativos para dispositivos voltados para consumo popular (por exemplo, celulares, smartphones e PDAs).
Para que se possa criar projetos e
sistemas orientados a objetos, é necessário conhecer o processo de
desenvolvimento da modelagem OO antes de iniciar a criação de códigos na
linguagem Java. Assim, vamos conhecer um pouco sobre a evolução do
desenvolvimento de sistemas.
Na década de 1960 não se utilizavam
metodologias ou formalidades para a criação de documentos dos projetos
de sistemas desenvolvidos. Entretanto, no final da década de 1970,
surgiu a análise estruturada. Nessa metodologia, o objetivo do processo a
ser informatizado está nas funções que agem sobre os dados. O principal
diagrama utilizado nela é o diagrama de fluxo de dados (DFD). Na década
de 1980, os autores Tom DeMarco e Chris Gane se destacaram ao
escreverem algumas obras sobre a análise estruturada. Além deles, Edward
Yourdon é uma referência muito importante sobre o assunto.
Na década de 1990, as metodologias OO começaram a surgir por causa da
necessidade da criação de uma que pudesse atender às demandas dessas
linguagens de programação.
De acordo com Blaha e Rumbaugh
(2006), o termo orientado a objetos (OO) significa que organizamos o
software como uma coleção de objetos distintos, que incorporam uma
estrutura de dados e comportamentos.
A OO é uma metodologia utilizada para
entender melhor os requisitos do cliente e solucionar os problemas com
maior qualidade. A construção da modelagem OO se dá por meio de objetos,
combinando estrutura de dados e comportamento. É um modo de pensar e
não uma técnica de programação.
Brooks (1995) observa que a parte difícil
do desenvolvimento de software é a manipulação de sua essência, por
causa da complexidade inerente do problema, em vez das especificidades
de seu mapeamento para uma linguagem em particular.
O desenvolvimento de software ocorre por meio de fases do ciclo de vida
dele, como análise, projeto e implementação. Além disso, os conceitos e a
notação OO são importantes para a elaboração da documentação de todo o
processo de modelagem.
A abordagem de organização OO é essencialmente diferente do
desenvolvimento tradicional de software, pois estruturas de dados e
rotinas são desenvolvidas de forma apenas fracamente acopladas.
O paradigma OO tem como sua entidade essencial o objeto que
recebe e envia mensagens, executa processamentos e pode mudar de estado.
Problemas são resolvidos por meio de objetos enviando mensagens a
objetos.
Na OO as funções e os dados são fundidos para formar a entidade
objeto (object).
Os objetos, diferentemente dos dados passivos das linguagens
tradicionais, podem atuar. Suas ações são ativadas pelas mensagens
enviadas e depois processadas por funções chamadas
métodos (methods).
Uma coleção de objetos similares é chamada
classe (class).
Uma instância de uma classe é um objeto. A maior abstração é conseguida
pelo uso da hierarquia de classes. Para reutilizar métodos, as
hierarquias de classe recorrem ao mecanismo exclusivo da OO que é a
herança (inheritance) ou hereditariedade.
Quando um programa OO é executado ocorrem 3 eventos:
- Os objetos são criados de acordo com a necessidade;
- As mensagens movimentam-se de um objeto para outro;
- Quando os objetos não são mais necessários, eles são apagados, e a área na memória, recuperada.
O paradigma de orientação a objetos favorece a aplicação de
diversos conceitos considerados fundamentais para o desenvolvimento de
bons programas, tais como
abstração (abstraction),
encapsulamento (encapsulation),
herança (inheritance) e
polimorfismo (polymorphism).
Alguns conceitos não são exclusivos desta abordagem, mas são suportados
de forma melhor no desenvolvimento orientado a objetos do que em outras
metodologias.
Técnicas de orientação a objetos promovem o compartilhamento
de recursos em diversos níveis distintos. Herança de estruturas de dados
e comportamento permite que estruturas comuns sejam compartilhadas
entre diversas classes derivadas similares sem redundância. O
compartilhamento de código usando herança é uma das grandes vantagens da
orientação a objetos. Ainda mais importante que a economia de código é a
clareza conceitual de reconhecer que operações sobre objetos diferentes
podem ser a mesma coisa, o que reduz o número de casos distintos que
devem ser entendidos e analisados.
O desenvolvimento orientado a objetos não apenas permite que a
informação dentro de um projeto seja compartilhada como também oferece a
possibilidade de reaproveitar projetos e códigos em projetos futuros.
As ferramentas para alcançar este compartilhamento, tais como abstração,
encapsulamento, polimorfismo e herança, estão presentes na metodologia;
uma estratégia de reuso entre projetos é a definição de bibliotecas de
elementos reusáveis. Entretanto, orientação a objetos não é uma fórmula
mágica para se alcançar reusabilidade; para tanto, é preciso
planejamento e disciplina para se pensar em termos genéricos, não
voltados simplesmente para a aplicação corrente.
Segundo Blaha e Rumbaugh (2006), a metodologia OO possui os seguintes estágios:
- Concepção do sistema: os analistas de negócios ou usuários concebem uma aplicação e formulam os requisitos hipotéticos.
- Análise: o analista examina e reespecifica rigorosamente os requisitos da concepção do sistema por meio da construção de modelos.
- Projeto do sistema: a
equipe de desenvolvimento planeja a arquitetura do sistema para
solucionar o problema da aplicação. O projetista do sistema deve decidir
que características de desempenho otimizar, escolher uma estratégia
para atacar o problema e fazer alocações de recursos experimentais.
- Projeto de classes: o
projetista de classes elabora objetos tanto do domínio como de aplicação
com os mesmos conceitos e notação de orientação a objetos. O foco do
projeto de classes são as estruturas de dados e os algoritmos
necessários para implementar cada classe.
- Implementação: os
implementadores traduzem as classes e os relacionamentos desenvolvidos
durante o projeto de classes para linguagem de programação, banco de
dados ou hardware específico.
Os conceitos OO aplicam-se
por todo o ciclo de vida de desenvolvimento do sistema. Não se trata de
um ciclo de vida do tipo cascata, mas de um processo interativo e
incremental.
Blaha e Rumbaugh (2006) identificam algumas características importantes da OO, entre as quais podemos citar:
- Ênfase na essência de um objeto:
a OO enfatiza o que um objeto é, e não como ele é usado. O
desenvolvimento OO dá uma ênfase maior à estrutura de dados e menor à de
procedimentos.
- Sinergia: identidade,
classificação, polimorfismo e herança caracterizam as linguagens OO.
Cada um desses conceitos pode ser usado isoladamente, mas juntos eles se
complementam com sinergia. Esses conceitos são definidos pelos autores
da seguinte forma:
- Identidade: significa que os dados são
quantizados em entidades distintas e distinguíveis, chamados objetos.
Cada objeto tem sua própria identidade inerente.
- Classificação: significa que os objetos
com a mesma estrutura de dados (atributos) e comportamento (operações)
são agrupados em uma classe. Esta é uma abstração que descreve
propriedades importantes para uma aplicação e ignora as demais.
- Herança: é o compartilhamento de atributos e operações (recursos) entre classes com base em um relacionamento hierárquico.
- Polimorfismo: significa que a mesma operação pode se comportar de forma diferente para diferentes classes.
- Abstração: permite que o
programador se concentre nos aspectos essenciais de uma aplicação,
ignorando os detalhes. Isso significa focalizar o que um objeto é e faz
antes de decidir como implementá-lo. A capacidade de abstrair
provavelmente é a habilidade mais importante exigida para o
desenvolvimento OO.
- Encapsulamento (ocultamento de informações):
separa os aspectos externos de um objeto, que são acessíveis a outros
objetos, dos detalhes internos da implementação, que estão escondidos
deles. Pode-se mudar a implementação de um objeto sem afetar as
aplicações que o utilizam.
- Compartilhamento: as
técnicas OO promovem compartilhamento em diferentes níveis. A herança
tanto da estrutura de dados quanto do comportamento permite que as
subclasses compartilhem um código comum. Esse compartilhamento via
herança é uma das principais vantagens das linguagens OO.
- Modelos: é uma
abstração de algo com a finalidade de entendê-lo antes de construí-lo.
As finalidades dos modelos são teste de uma entidade física antes de sua
construção, comunicação com os clientes, visualização e redução da
complexidade. A modelagem de um sistema se dá por meio de três modelos:
- Modelo de classes: descreve a estrutura
estática dos objetos em um sistema e seus relacionamentos. O modelo de
classes define o contexto para o desenvolvimento de software.
- Modelo de estados: descreve os aspectos de um objeto que mudam com o tempo.
- Modelo de interações: descreve como os objetos em um sistema cooperam para conseguir resultados mais amplos.
- Os três modelos são partes separadas da descrição de um sistema completo, mas estão interligados.