paradigmas de linguagens de programação - modularização, componentização e reutilização de...
TRANSCRIPT
Prof. Adriano Teixeira de Souza
Modularização, componentização e reutilização de código
Sistemas são feitos para resolver problemas do mundo real.
Estudos mostram que a construção de sistemas grandes a partir de pequenas partes (módulos) permite um desenvolvimento mais rápido e com menor índice de erros – “DIVIDIR PARA CONQUISTAR”.
Em Java há 3 tipos de módulos: ◦ métodos;
◦ classes;
◦ pacotes.
Prof. Adriano Teixeira de Souza
Módulos são integrados com o objetivo de atender a um requisito
“Dividir e conquistar”
Prof. Adriano Teixeira de Souza
A modularização consiste em decompor um programa em uma série de subprogramas individuais.
Trata-se de um método utilizado para facilitar a construção de grandes programas, através de sua divisão em pequenas etapas (dividir para conquistar), que são os módulos ou subprogramas;
A primeira delas, por onde começa a execução do trabalho, recebe o nome de programa principal, e as outras são os subprogramas propriamente ditos, que são executados sempre que ocorre uma chamada dos mesmos, o que é feito através da especificação de seus nomes.
Prof. Adriano Teixeira de Souza
Planejar mais fácil
Manutenção
Testes e depuração
Ocultação de Informações
Módulos devem ser especificados e projetados de tal modo que informações desnecessárias sejam inacessíveis
Apenas o necessário é fornecido para a realização de funções
Abstração + ocultação (erros não são propagados nas modificações)
Prof. Adriano Teixeira de Souza
Modularidade + abstração + ocultação = Independência Funcional
◦ “Finalidade única” e menos interação
◦ Interfaces simplificadas
◦ Manutenção mais fácil
◦ Propagação de erros minimizada
◦ Reutilização
◦ Dois critérios (qualitativos) para avaliação
COESÃO: robustez funcional de um módulo (módulo realiza
uma única tarefa)
ACOPLAMENTO: indicação da interdependência entre módulos
Prof. Adriano Teixeira de Souza
“Software reuse is the use of existing software knowledge or artifacts to build new software artifacts” [Frakes, 1995]
Vantagens (em POTENCIAL) ◦ MAIS Qualidade
◦ MENOS Tempo de desenvolvimento
◦ MENORES custos TOTAIS no ciclo de vida... implementação, testes... integração, documentação, manutenção... evolução...
Prof. Adriano Teixeira de Souza
Código compilado [fonte]
Casos de testes
Modelos e projetos: frameworks e padrões
Interface de usuário
Planos, estratégias e regras arquiteturais
...
Prof. Adriano Teixeira de Souza
Aspectos de um componente ◦ Descrever ou realizar uma função específica
◦ Estar em conformidade e prover um conjunto de interfaces definidas
◦ Ter uma documentação adequada
◦ Estar inserido no contexto de um modelo que oriente a composição deste componente com outros
Categorias [Williams, 2001] ◦ Componentes GUI
◦ Componentes de Serviços
◦ Componentes do Domínio [Negócio]
Prof. Adriano Teixeira de Souza
Reuso : A habilidade de reusar componentes existentes para criar sistemas mais complexos.
Evolução : Um sistema altamente componentizado é de mais fácil manutenção. Em um sistema bem projetado, as alterações serão localizadas, e essas poderão ser feitas no sistema com pouco ou nenhum efeito nos componentes restantes.
Prof. Adriano Teixeira de Souza
Programas Java são concebidos através da união de classes e métodos criados pelo programador, juntamente de classes e métodos disponibilizados em bibliotecas de classes Java, a API Java – Java Application Programming Interface –, e outras bibliotecas de classes criadas por outros programadores.
As bibliotecas são utilizadas por meio do uso da instrução import. ◦ Ex: import java.util.*;
Prof. Adriano Teixeira de Souza
A API Java contém classes que permitem:
◦ a realização de cálculos matemáticos simples;
◦ manipulação de strings;
◦ de caracteres;
◦ operações de entrada/saída;
◦ de bancos de dados;
◦ de rede;
◦ processamento de arquivos;
◦ tratamento de erros;
◦ etc.
Prof. Adriano Teixeira de Souza
A API faz parte das JDK.
É importante, antes de criar algo novo, que se verifique se a API já disponibiliza as operações (métodos) em suas classes para não se “reinventar a roda”.
É possível obter informações a respeito da API Java por meio do uso de Javadocs.
A reutilização de código é uma vantagem da Orientação a Objetos e para que isso possa ser feito, é importante que os métodos tenham tarefas muito bem definidas.
Prof. Adriano Teixeira de Souza
Classes predefinidas agrupadas em categorias de classes relacionadas – pacotes
Uso de import: ◦ import java.util.Scanner;
◦ import java.util.*;
Prof. Adriano Teixeira de Souza
Prof. Adriano Teixeira de Souza
Pacote Descrição
java.applet O Java Applet Package contém uma classe e várias interfaces exigidas para criar applets Java — programas que executam nos navegadores da Web.
java.awt O Java Abstract Window Toolkit Package contém as classes e interfaces exigidas para criar e manipular GUIs no Java 1.0 e 1.1. Nas versões atuais do Java, os componentes GUI Swing dos pacotes javax.swing são freqüentemente utilizados em seu lugar.
java.awt.event O Java Abstract Window Toolkit Event Package contém classes e interfaces que permitem o tratamento de eventos para componentes GUI tanto nos pacotes java.awt como javax.swing.
java.io O Java Input/Output Package contém classes e interfaces que permitem aos programas gerar entrada e saída de dados.
java.lang O Java Language Package contém classes e interfaces (discutidas por todo esse texto) que são exigidas por muitos programas Java. Esse pacote é importado pelo compilador para todos os programas, assim o programador não precisa fazer isso.
Prof. Adriano Teixeira de Souza
Pacote Descrição
java.net O Java Networking Package contém classes e interfaces que permitem aos programas comunicar-se via redes de computadores, como a Internet.
java.text O Java Text Package contém classes e interfaces que permitem aos programas manipular números, datas, caracteres e strings. O pacote fornece recursos de internacionalização que permitem a um programa ser personalizado para um local específico (por exemplo, um programa pode exibir strings em diferentes idiomas com base no país do usuário).
java.util O Java Utilities Package contém classes utilitárias e interfaces que permitem ações como manipulações de data e hora, processamento de números aleatórios (classe Random), armazenamento e processamento de grandes volumes de dados e a divisão de strings em parte menores chamadas tokens (classe StringTokenizer).
javax.swing O Java Swing GUI Components Package contém classes e interfaces para componentes GUI Swing do Java que fornecem suporte para GUIs portáveis.
javax.swing.event
O Java Swing Event Package contém classes e interfaces que permitem o tratamento de eventos (por exemplo, responder a cliques de botão) para componentes GUI no pacote javax.swing.
Refinamento ◦ Processo de elaboração (alto nível -> mais detalhes)
◦ Refinamentos sucessivos
◦ (Abstração + refinamentos): conceitos complementares
Refatoração ◦ Reorganizar para simplificar o projeto sem alterar as
funções e os comportamentos.
◦ O que pode ser refatorado?
Redundância, elementos não utilizados, algoritmos ineficientes, etc
Prof. Adriano Teixeira de Souza
void imprimeDivida () {
Enumerate e = _pedidos.elementos ();
double divida = 0.0;
// imprime cabeçalho
System.out.println (“***************************”);
System.out.println (“*** Dívidas do Cliente ****”);
System.out.println (“***************************”);
// calcula dívidas
while (e.temMaisElementos ()){
Pedido cada = (Pedido) e.proximoElemento ();
divida += cada.valor ();
}
// imprime detalhes
System.out.println (“nome: ” + _nome);
System.out.println (“divida total: ” + divida);
}
Prof. Adriano Teixeira de Souza
void imprimeDivida () {
Enumerate e = _pedidos.elementos ();
double divida = 0.0;
imprimeCabecalho ();
// calcula dívidas
while (e.temMaisElementos ()){
Pedido cada = (Pedido) e.proximoElemento ();
divida += cada.valor ();
}
//imprime detalhes
System.out.println(“nome: ” + _nome);
System.out.println(“divida total: ” + divida);
}
void imprimeCabecalho () {
System.out.println (“***************************”);
System.out.println (“*** Dívidas do Cliente ****”);
System.out.println (“***************************”);
}
Prof. Adriano Teixeira de Souza
void imprimeDivida () {
Enumerate e = _pedidos.elementos ();
double divida = 0.0;
imprimeCabecalho ();
// calcula dívidas
while (e.temMaisElementos ()){
Pedido cada = (Pedido) e.proximoElemento ();
divida += cada.valor ();
}
imprimeDetalhes (divida);
}
void imprimeDetalhes (double divida)
{
System.out.println(“nome: ” + _nome);
System.out.println(“divida total: ” + divida);
}
Prof. Adriano Teixeira de Souza
void imprimeDivida () {
imprimeCabecalho ();
double divida = calculaDivida ();
imprimeDetalhes (divida);
}
double calculaDivida ()
{
Enumerate e = _pedidos.elementos ();
double divida = 0.0;
while (e.temMaisElementos ()){
Pedido cada = (Pedido) e.proximoElemento ();
divida += cada.valor ();
}
return divida;
}
Prof. Adriano Teixeira de Souza
void imprimeDivida () {
imprimeCabecalho ();
double divida = calculaDivida ();
imprimeDetalhes (divida);
}
double calculaDivida ()
{
Enumerate e = _pedidos.elementos ();
double resultado = 0.0;
while (e.temMaisElementos ()){
Pedido cada = (Pedido) e.proximoElemento ();
resultado += cada.valor ();
}
return resultado;
}
Prof. Adriano Teixeira de Souza