paradigmas de linguagens de programação - modularização, componentização e reutilização de...

22
Prof. Adriano Teixeira de Souza Modularização, componentização e reutilização de código

Upload: adriano-teixeira-de-souza

Post on 19-Jun-2015

2.803 views

Category:

Technology


0 download

TRANSCRIPT

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

Prof. Adriano Teixeira de Souza

Modularização, componentização e reutilização de código

Page 2: Paradigmas de Linguagens de Programação - 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

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

Módulos são integrados com o objetivo de atender a um requisito

“Dividir e conquistar”

Prof. Adriano Teixeira de Souza

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

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

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

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

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

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

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

“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

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

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

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

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

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

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

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

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

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

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

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

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

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

Classes predefinidas agrupadas em categorias de classes relacionadas – pacotes

Uso de import: ◦ import java.util.Scanner;

◦ import java.util.*;

Prof. Adriano Teixeira de Souza

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

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.

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

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.

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

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

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

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

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

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

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

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

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

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

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

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