Desenvolvimento de Software

Post on 18-Dec-2014

1.412 views 4 download

description

Slides usados na disciplina do curso de Especialização em Projeto e Desenvolvimento de Sistemas, da Universidade Presbiteriana Mackenzie.

Transcript of Desenvolvimento de Software

1

Desenvolvimentode Software (2011)

Especialização em Projeto e Desenvolvimento de Sistemas

PhD Vagner Figueredo de Santana

2

Objetivo da disciplina

Desenvolver software básico (em Java) Utilizando boas práticas de programação

3

Conteúdo programático

Implementação de conceitos de Orientação a Objetos (OO)

Desenvolvimento de soluções computacionais stand-alone (em Java)

4

Avaliação

Um projeto Grupo de até 4 pessoas Conceitos possíveis: A, B, C e R Compõem o conceito

Apresentação Código

Enviar projeto por email até a data de apresentação

5

Avaliação - Apresentação

Tempo (25 min. no máximo) Utilização dos termos de OO discutidos Clareza e didática da apresentação Legibilidade Carga de trabalho dos componentes do

grupo

6

Avaliação - Código

Estrutura/modelagem/arquitetura do trabalho Clareza, legibilidade do código e

documentação Manipulação de exceções Interface de usuário Carga de trabalho dos componentes do grupo

7

Introdução

A linguagem que utilizamos influencia a maneira como vemos o mundo

A linguagem de programação usada para resolver um problema vai influenciar na solução usada

8

Introdução

Orientação a Objetos (OO) também é um paradigma de programação

... mas o que é paradigma?

9

Paradigma de programação

Conceitualizar: ... o que significa computar ... construção e organização de tarefas ... como tarefas são executadas por um

computador

10

Programação Orientada a Objetos

O que é uma linguagem de programação orientada a objetos?

11

Programação Orientada a Objetos

É mais do que incluir coisas em uma linguagem de programação

POO é uma forma de pensar em como decompor problemas e resolvê-los computacionalmente

... mas POO é melhor que as outras?

12

Um pouco de história

Conjectura/Hipótese de Alonzo Church, 1960s Qualquer função computável pode ser processada

por uma Máquina de Turing

Prova de Böhm, 1966 Uma Máquina de Turing pode ser emulada por

qualquer linguagem de programação que conte, no mínimo, com um condicional (e.g., if) e um laço (e.g., for)

13

Por quê POO?

POO facilita a resolução de problemas e gerenciamento de grandes projetos de software

Escala bem Tem foco na reutilização de componentes É baseada em uma metáfora (Qual?) ... mas POO não é mágica

14

Objeto

Conta com: Dados (i.e., attributos) Operações (i.e., métodos)

Tudo é objeto!

Atributos: “Memória” dos objetos e também são objetos

Métodos: Algoritmos ou conjunto de operações para uma dada requisição

15

Classe

Categoria que representa um grupo de objetos similares

16

Instância

Objeto que representa uma classe Um exemplar da classe

17

Programas queseguem OO são: Organizados como objetos que interagem

entre si Cada um oferecendo um conjunto de

métodos para outros objetos Usando solicitações para que objetos

alterem seus próprios dados

18

Tríade

Herança Organização em que atributos e métodos são

automaticamente disponibilizadas para qualquer descendente

Em outras palavras: agrupa invariantes Encapsulamento

Proteção dos atributos e métodos Polimorfismo

Existência de um nome (e.g., métodos, classes) e vários significados (i.e., funcionalidades)

19

Em suma...

Não pergunte o que pode fazer com suas estruturas de dados

Pergunte o que suas estruturas de dados pode fazer para você

20

Abstração em OO

Suprimir/esconder propositalmente detalhes de um processo para destacar outros detalhes.

... mas como encontrar o nível certo de abstração?

21

Abstração em OO

Como gerar novos tipos? Composição:

Combinar tipos primitivo e/ou customizados para criar outros tipos de dados customizados

Tipos de dados abstratos

22

Exemplos em código

23

Java – Classe

class People{private String name;public People(String n){

setName(n);}public String getName(){

return name;}public void setName(String n){

name=n;}

24

Java – Herança

class Employee extends People{private Double salary;...public Double getSalary(){

return salary;}public void setSalary(Double s){

salary=s;}

}

25

Java – Polimorfismo

class FreeLancer extends Employee{private Double hoursPerMonth;private Double salaryPerHour;... // Setters & getterspublic void setSalary(Double h, Double s){

salary=h*s;}public void setSalary(String s){

try{String[] temp=s.split("/");salary=Double.parseDouble(temp[0])*Double.parseDouble(temp[1]);

}...

}

26

Exercício pra entregar

Proposta de projeto Indicar

Classes Atributos Métodos

Herança Encapsulamento Polimorfismo

27

Exemplo

Vamos trabalhar na modelagem de um jogo conhecido usando OO

Sugestões Banco Imobiliário Mario Kart Truco Bilhar ...

28

Java – Visão geral da sintaxe

{ } delimitam grupos de comandos ; finaliza comando // comentário de linha /* */ comentário de bloco

29

Java – Visão geral da sintaxe

Operadores ==, !=, <=, >=, <, > +, -,*, /, %

30

Java – Tipos

Alguns tipos primitivos int long boolean double char

31

Java – Tipos

Alguns objetos Integer Boolean Double String

32

Java – Arrays

Sequência de valores de tamanho fixo Pode ser de tipos primitivos ou objetos

int[ ] values; String[ ] description;

Para criar arrays description = new String[10] ;

Operações description[0] == “Testing 1, 2, 3” ; // atribui System.out.println( description[0] ); // recupera

33

Interface

Não pode ser instanciada Define os métodos que as subclasses

devem implementar Não contém implementação

34

Classe Abstrata

Também não pode ser instanciada Mas pode conter implementação de

métodos Para serem instanciadas as subclasses

devem sobrescrever os métodos abstrados

35

Herança múltipla

Em Java a herança múltipla pode ser implementada combinando interfaces

Herança de implementação apenas pode ocorrer de uma classe

36

Java – Tipagem estática

Dinâmico Conhecido ou feito

enquanto o programa roda Estático

Conhecido ou feitoantes do programa rodar

Dar preferência ao estático ajuda a identificar bugs mais rapidamente

37

PolimorfismoOverloading Sobrecarga Métodos sobrecarregados têm o mesmo

nome Mas diferentes argumentos Seja pelo tipo ou pelo número de

argumentos

38

PolimorfismoOverloadingpublic void setSalary(Double s){

salary = s;

}

public void setSalary(Double h, Double s){

salary = h * s ;

}

public void setSalary(String s){

try{ salary = Double.parseDouble( s );} catch( NumberFormatException nfe ){...}

}

39

PolimorfismoOverriding Sobrescrita Um novo corpo é dado para método

herdado Para chamar a implementação da

superclasse basta utiliza super.nomeDoMétodo( ... );

40

PolimorfismoOverloading vs. Overriding Não confunda Overloading ...

Métodos na mesma classe com mesmo nome, mas com argumentos diferentes

... com Overriding Métodos implementados na superclasse e na

sua subclasse, com mesmos nome e argumentos

Uma forma de evitar overriding é usar final

41

Campos e métodos estáticos

Ao declarar campos/métodos como estáticos eles são associados à classe e não ao objeto

Ele tem um valor apenas para todo o programa

Constantes normalmente usam static e final public static final PI = 3.14159;

42

Criando pacotes

Basta utilizar a palavra package antes da definição da classe

// No arquivo Card.javapackage br.mackenzie.pds2011.monopoly.model;

abstract class Card{...

43

Utilizando pacotes

Organizam classes java.net.URL

No código, basta inserir no início import java.net.URL;

No sistema de arquivos, os pacotes são diretórios Seguem estrutura inversa de domínio

br.com.[domínio].[aplicação].[componente].[Classe] br.com.exemplo.monopoly.model.Card

44

Exceções

São condições anormais de retorno de um método

Exceções também são objetos

45

Exceções

try – Conta com os comandos, então se há um problema, o fluxo vai para a sequência de catch

catch – “Pega” a exceção, então é possível fazer algo pra solucionar o problema

finally – Sempre é executado ao final do bloco; normalmente para liberação de recursos

46

Exceções

Funcionamento básico try executa código que pode disparar um exceção Se uma exceção ocorre, então o fluxo do programa

é desviado e um tratador (catch) é procurado Note que tudo do bloco try expira O primeiro tratador (catch) adequado (em que o

parâmetro combinar com a exceção) é executado Então o fluxo de execução é desviado para o finally

47

Exceções

...public String exemplo(){

...try{ ... }catch( [exceção mais específica] e1 ){ ... }catch( [exceção menos específica] e2 ){ ... }finally{ ... }

}...

48

Disparando exceções

O comando throw dispara uma exceção Quando ocorre em um método, em vez de retornar

um valor, uma exceção é disparada Se uma exceção não é listada no comando throws, o

compilador indica que deve ser capturada com try/catch ou declarada (throws)

Se seu método chamar métodos que disparam (throws) exceções, elas devem ser capturadas ou disparadas no seu método Requisito catch-or-declare

49

Disparando exceções

...public String exemplo2()

throws TipoDeExeção1, TipoDeExceção2{...// caso específicothrow new TipoDeExceção1();...// outro caso específico

throw new TipoDeExceção2();}...

50

Type Casting

Muda o tipo do objeto declarado em tempo de execução, mas não afeta o tipo do objeto em si

É diferente de coerção de tipos primitivos Coerção produz um valor diferente em tempo

de execução (int)0.5 resulta no valor 0

51

Generics

Em alguns casos, definir tipos de objetos no código pode reduzir as possibilidades de reuso

Generics possibilita parametrizar tipos Deixa o código mais estável Possibilita verificações de tipos em tempo de

compilação Muito usado em Collections como List e Map Note que não funciona com tipos primitivos

52

Generics

public class Box {private Object object;public void add(Object object) {

this.object = object;}public Object get() {

return object;}

}

Fonte: Oracle – The Java Tutorials – Learning the Java Language

53

Generics

public class BoxDemo1 {public static void main(String[] args) {

// ONLY place Integer objects//into this box!Box integerBox = new Box();

integerBox.add(new Integer(10));Integer someInteger =

(Integer)integerBox.get();System.out.println(someInteger);

}}

Fonte: Oracle – The Java Tutorials – Learning the Java Language

54

Generics

public class BoxDemo1 {public static void main(String[] args) {

// ONLY place Integer objects//into this box!Box integerBox = new Box();

integerBox.add(“10”);Integer someInteger =

(Integer)integerBox.get();System.out.println(someInteger);

}}

Fonte: Oracle – The Java Tutorials – Learning the Java Language

55

Generics

public class Box<T> {private T t; // T stands for "Type“public void add(T t) {

this.t = t;}public T get() {

return t;}

}

Fonte: Oracle – The Java Tutorials – Learning the Java Language

56

Generics

public class BoxDemo3 {public static void main(String[] args) {

Box<Integer> integerBox = new Box<Integer>();

integerBox.add(new Integer(10));// no cast!Integer someInteger = integerBox.get(); System.out.println(someInteger);

}}

Fonte: Oracle – The Java Tutorials – Learning the Java Language

57

Generics

Pode ter mais de um identificador, mas devem ser diferentes Exemplos:

List<T> Box<T> HashMap<K,V> List<Box<T>> List<Box<HashMap<K,V>>>

58

Generics

Convenções de nomenclatura: E - Element (usado em Collections) K - Key N - Number T - Type V - Value

59

Generics

Há casos em que desejamos restringir os tipos passados como parâmetro

Nesses casos podemos usar bounded type parameters Exemplo: Box<T extends Number>;

Note que extends aqui se refere tanto a classes quanto a interfaces

Para indicar a implementação de interfaces basta concatenar usando & Exemplo: Box<T extends Number & MyInterface>

60

Generics

Relembrando o exemplo do Banco Imobiliário

61

Generics

// Declaração sem GenericsPrivate HashMap cards;...// Caso 1 – Propenso a errosCard c = cards.get( “Copacabana” ) ;...// Caso 2 – Pouco eleganteCard c = (Card)cards.get( “Copacabana” ) ;...

62

Generics

// Declaração com Generics!private HashMap <String,T extends Card> cards;

...

// Caso 3 – Elegante e evita errosCard c = cards.get( “Copacabana” ) ;...

63

Concorrência

Onde encontramos tarefas concorrentes? Java foi projetado para suportar concorrência Em programação concorrente temos duas

unidades básicas de execução: Processos Threads

Note que concorrência é possível mesmo em sistemas com um processador

64

Processos e threads

Processo Ambiente auto contido de execução Conta com seu espaço em memória

Thread Existe dentro do processo Compartilha recursos do processo Eficiente, mas comunicação é complexa Toda aplicação tem ao menos uma thread

65

Threads

Uma das formas de criar uma aplicação concorrente é controlar Criação e gerenciamento de threads Instanciação de threads para tarefas

assíncronas A aplicação que cria uma thread precisa

fornecer o código que vai rodar na thread

66

Threads

Duas formas de instanciar threads: Runnable object

A interface Runnable define o método que deve ter o código a ser executado na thread – run

O objeto Runnable é passado para o construtor da Thread

67

Threads

public class HelloRunnable implements Runnable {

public void run() {

System.out.println("Hello from a thread!");

}

public static void main(String args[]) {

(new Thread(new HelloRunnable())).start();

}

}

68

Threads

Duas formas de instanciar threads: Estender a classe Thread

Thread implementa Runnable Ao estender a classe Thread, basta fornecer a

implementação do método run()

69

Threads

public class HelloThread extends Thread {

public void run() {

System.out.println("Hello from a thread!");

}

public static void main(String args[]) {

(new HelloThread()).start();

}

}

70

Threads

Toda thread tem uma prioridade entre Thread.MIN_PRIORITY Thread.MAX_PRIORITY

Cada nova thread herda a prioridade do objeto que a criou

O rodízio de execução entre as threads pode ocorrer com ou sem fracionamento de tempo (i.e., que usam quantum)

71

Escalonamento de threads

72

Ciclo de vida da thread

73

Como controlar concorrência em métodos? Métodos sincronizados

Threads chamando o mesmo método ficam bloqueadas até que a execução seja terminada

Para tornar um método sincronizado, basta adicionar sinchronized ...

public synchronized int getX(){ return x ;}...

74

Exercício

Discutam em grupo como resolveriam o problema de concorrência ao usar o padrão GoF Singleton

Identifique no projeto locais em que threads poderiam ser utilizadaS

75

Referências Java: Como programar – Deitel e Deitel The Java Tutorials - Learning the Java Language

http://download.oracle.com/javase/tutorial/java/TOC.html

MIT Open Course – Elements of Software Construction http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-005-elements-of-software-construction-fall-2008/

Oracle Java Tutorials – Concurrencyhttp://docs.oracle.com/javase/tutorial/essential/concurrency/index.html