Paradigmas de Linguagens de Programação - Modularização, componentização e reutilização de código

adrianots 2,907 views 22 slides Oct 24, 2011
Slide 1
Slide 1 of 22
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22

About This Presentation

No description available for this slideshow.


Slide Content

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.ev
ent
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