Programação III Aula Revisão I Prof. Alexandre Monteiro Recife ‹#› Contatos Prof. Guilherme Alexandre Monteiro Reinaldo Apelido: Alexandre Cordel E-mail/gtalk: [email protected] [email protected] Site: http://www.alexandrecordel.com.br/fbv Celular: (81) 9801-1878 Programação Concorrente [ O que é ] “Um programa concorrente especifica 2 ou mais processos que cooperam para realizar uma tarefa. Processos cooperam através de comunicação; utilizam variáveis compartilhadas ou troca de mensagens“(G. R. Andrews) Programação Concorrente [ Motivação ] Aproveitar hardware com múltiplos processadores Atender a vários usuários simultaneamente Melhorar o desempenho das aplicações Aumentar a disponibilidade da CPU para o usuário Objetos ativos e controle de atividades Programas paralelos Programação Concorrente [ Conceitos ] Paralelismo • Processamento simultâneo físico Concorrência • Processamento simultâneo lógico (aparente) • Requer entrelaçamento (interleaving) de ações Processo • Execução de um programa (running) Programa Concorrente • Vários processos que cooperam para a realização de uma tarefa ou mais tarefas Programação Concorrente [ Conceitos ] Comunicação • Variáveis compartilhadas • Passagem de mensagens Sincronização • Exclusão mútua de seções críticas • Sincronização por condição Estado de um programa concorrente • Consiste dos valores das variáveis (explícitas e implícitas) • A execução de um comando muda o estado Ações atômicas • Transformação indivisível de estado Programação Concorrente [ Conceitos ] Comunicação • Variáveis compartilhadas • Passagem de mensagens Sincronização • Exclusão mútua de seções críticas • Sincronização por condição Estado de um programa concorrente • Consiste dos valores das variáveis (explícitas e implícitas) • A execução de um comando muda o estado Ações atômicas • Transformação indivisível de estado Threads [ Ciclo de Vida ] Intervalo de tempo expirou 4.sleep() Dormindo 6.stop() 1.new Thread() escalonada Criada Encerrada Término 3.run() 2.start() Pronta Executando interrompida Operação de E/S concluída 5.notify() 5.notityAll() 4.wait() Esperando Bloqueada Operação de E/S iniciada Threads [ Sincronização ] A sincronização baseia-se na idéia de que para acessar um método sincronizado ou um entrar em um bloco sincronizado, é preciso obter (ou já ter) o lock desse objeto. A Thread que conseguir esse lock é a única autorizada a acessar os recursos protegidos através de sincronização. DICA QUENTE: •Aprendam a implementar sincronização na prática. Classes java.io Vamos passar a conhecer APIs do Java. java.io Possuem as classes que você mais comumente vai usar, não importando se seu aplicativo é desktop, web, ou mesmo para celulares. OO em java.io A ideia atrás do polimorfismo no pacote java.io é de utilizar fluxos de entrada (InputStream) e de saída (OutputStream) Para toda e qualquer operação, seja ela relativa a um arquivo, a um campo blob do banco de dados, a uma conexão remota via sockets, ou até mesmo às entrada e saída padrão de um programa (normalmente o teclado e o console). As classes abstratas InputStream e OutputStream definem, respectivamente, o comportamento padrão dos fluxos em Java: em um fluxo de entrada, é possível ler bytes e, no fluxo de saída, escrever bytes. Decorator Pattern Como o próprio nome diz, essa classe lê do Reader por pedaços (usando o buffer) para evitar realizar muitas chamadas ao sistema operacional. Você pode até configurar o tamanho do buffer pelo construtor. É essa a composição de classes que está acontecendo. Esse padrão de composição é bastante utilizado e conhecido. É o Decorator Pattern. Lendo Strings do Teclado Apenas modificamos a quem a variável is está se referindo. Podemos receber argumentos do tipo InputStream e ter esse tipo de abstração: não importa exatamente de onde estamos lendo esse punhado de bytes, desde que a gente receba a informação que estamos querendo. Vejamos: Escrevendo Caracteres (Saída) Como você pode imaginar, escrever em um arquivo é o mesmo processo: Introdução ao MVC É um modelo padrão de arquitetura usado em engenharia de software para separar o projeto 3 camadas: • Model: representam suas entidades e as que te ajudam a armazenar e buscar os dados são chamadas de Modelo (Model). • View: interface visual gráfica (GUI), ou páginas web de apresentação ao usuário, normalmente página HTML com <forms>, constando informações da aplicação. • Controller: interpreta eventos e manipula os dados (Objetos) como listar, procurar, alterar, inserir e deletar dados; “O Modelo é o objeto de aplicação que é manipulado, a Visão é a apresentação ao usuário através das telas e o Controlador é o que define a maneira como a interface do usuário reage às entradas do mesmo”. Fonte: livro “Padrões de projeto: Soluções reutilizáveis de software orientado a objetos“. Introdução ao MVC MVC é implementado em várias linguagens de programação e altamente difundida, permitindo equipes distintas (programadores e designers) trabalharem sem interferência no trabalho uns dos outros; Deixa o código mais legível e possibilita que cada equipe foque exclusivamente nas suas atribuições. Duas palavras-chave em MVC são: Reuso e Flexibilidade. Vantagens do MVC Abaixo serão listadas algumas das vantagens em utilizar MVC em seus projetos: • Facilita o reaproveitamento de código; • Facilidade na manutenção e adição de recursos; • Maior integração da equipe e/ou divisão de tarefas; • Diversas tecnologias estão adotando essa arquitetura; • Facilidade em manter o seu código sempre limpo; Comportamento do MVC Comportamento do MVC Top-Down Browser Evolução dos Dados (DADOS) MODEL (Objeto) MODEL (Objeto) Mapeamento Objeto-Relacional TABELA (Registro) Linguagens (VIEW) (CONTROLLER) (MODEL) HIBERNATE JSP JAVA JAVA HQL SQL Hibernate Um aplicação simples usando hibernante consiste de • uma classe Java • um arquivo de mapeamento XML • uma tabela de banco de dados SQL (MySQL) O objetivo é desenvolver o Mapeamento ObjetoRelacional usando Hibernate como framework de comunicação com um banco de dados. Hibernate é produtividade! Não tenha medo dos metadados XML! • Siga as convenções que eles se mantêm simples Pode-se gerar tudo em Hibernate • O arquivo XML de mapeamento pode ser gerado automaticamente de classes ou tabelas • Classes podem ser geradas automaticamente a partir de tabelas • Tabelas podem ser geradas automaticamente a partir de classes • Outros arquivos de configuração podem ser gerados Mais adiante apresentaremos ferramentas que realizam essas tarefas Criação da base de dados Use a interface do seu MySQL Worbench 1) Crie a seguinte base de dados teste_hibernate 2) Crie a seguinte tabela CREATE TABLE `aluno` ( `id_aluno` int(11) NOT NULL, `nm_aluno` varchar(255) NOT NULL, `mat_aluno` varchar(255) NOT NULL, `nota` double DEFAULT NULL, `dt_cadastro` datetime DEFAULT NULL, ); Os Meta dados de mapeamento As informações sobre o mapeamento entre a tabela e a classe Aluno ficam em um arquivo XML • Guarde-o no mesmo pacote que a classe (entidade) • Chame-o de Aluno.hbm.xml Os Meta dados de mapeamento <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="entidade.Aluno" table="aluno" catalog="teste_hibernate"> <id name="idAluno" type="java.lang.Integer"> <column name="id_aluno" /> <generator class="identity" /> </id> <property name=“nome" type="string"> <column name="nm_aluno" length="45" not-null="true" /> </property> ... <set name="disciplinas" inverse="false" table="aluno_has_disciplina"> <key> <column name="aluno_id_aluno" not-null="true" /> </key> <many-to-many entity-name="entidade.Disciplina"> <column name="disciplina_id_disciplina" not-null="true" /> </many-to-many> </set> </class> </hibernate-mapping> A classe Possui: • Identificador do aluno(id), • Nome do aluno (nome) • ... É um POJO/Java Bean (Plain Old Java Object ou Velho e Simples Objeto Java) Não tem nada a ver com o Hibernate • Pode ser usado em qualquer aplicação Java. • Segue as convenções usadas em JavaBeans A classe package entidade; public class Aluno { private int id; private String nome; ... public Aluno() {} public String getNome() { return this.nome; } public void setNome(String nome) { this.nome = nome; } ... // getters e setters e outros construtores } Configuração em ambientes não gerenciados Em ambientes não gerenciados, a aplicação é responsável por obter conexões JDBC • Deve-se sempre usar um pool de conexões para obter uma conexão • O Hibernate faz interface com o pool isolando-o da aplicação Fonte: Bauer/King. Hibernate In Action, Manning, 2005 Introdução à Padrão de Projeto É uma solução geral reutilizável para um problema que ocorre com frequência dentro de um determinado contexto no projeto de software. Um padrão de projeto não é um projeto finalizado que pode ser diretamente transformado em código fonte ou de máquina, ele é uma descrição ou modelo (template) de como resolver um problema que pode ser usado em muitas situações diferentes. Padrões são melhores práticas formalizadas que o programador pode usar para resolver problemas comuns quando projetar uma aplicação ou sistema. Introdução à Padrão de Projeto Padrões de projeto orientados a objeto normalmente mostram relacionamentos e interações entre classes ou objetos, sem especificar as classes ou objetos da aplicação final que estão envolvidas. Padrões que implicam orientação a objetos ou estado mutável mais geral, não são tão aplicáveis em linguagens de programação funcional. Padrão GoF Livro Design Patterns: Elements of Reusable Object-Oriented Software, publicado em 1995. Autores: Erich Gamma, Richard Helm, Ralph Johnson e John Vlissides, são conhecidos como a "Gangue dos Quatro" (Gang of Four) ou simplesmente "GoF". Os padrões "GoF" são organizados em 3 famílias : • Padrões de criação: relacionados à criação de objetos • Padrões estruturais: tratam das associações entre classes e objetos. • Padrões comportamentais: tratam das interações e divisões de responsabilidades entre as classes ou objetos. Padrão "GoF" é classificado em 2 outros grupos : • Padrões com escopo de classe : definido por relacionamentos de herança e em tempo de compilação. • Padrões com escopo de objeto : encontrados no relacionamento entre os objetos definidos em tempo de execução. Facade ou Fachada É um objeto que disponibiliza uma interface simplificada para uma das funcionalidades de uma aplicação. Singleton Este padrão garante a existência de apenas uma instância de uma classe, mantendo um ponto global de acesso ao seu objeto. Ex.: Conexão com banco de dados, Log de sistema, Sessão de Aplicação, etc. Fachada + Singleton Browser Evolução dos Dados (DADOS) MODEL (Objeto) MODEL (Objeto) Mapeamento Objeto-Relacional TABELA (Registro) Linguagens (VIEW) JSP Fachada (CONTROLLER) (MODEL) HIBERNATE JAVA JAVA HQL SQL Fachada + Singleton Fachada Singleton Continuação: Fachada + Singleton Controlador Controlador: saveUsuario(u)