O nosso próximo Caso de Uso não irá se encaixar em nenhum padrão do jcompany Patterns & Methods e esta é uma situação de se esperar.

Tamanho: px
Começar a partir da página:

Download "O nosso próximo Caso de Uso não irá se encaixar em nenhum padrão do jcompany Patterns & Methods e esta é uma situação de se esperar."

Transcrição

1 A6Regras de Negócio & Batch Capítulo 17 Implementação do Caso de Uso UC005 Calcular Folha de Pagamento! - Analisando a Especificação Caso de Uso Principal O nosso próximo Caso de Uso não irá se encaixar em nenhum padrão do jcompany Patterns & Methods e esta é uma situação de se esperar. Toda aplicação possuirá algum percentual de demandas deste tipo - não generalizáveis por frameworks horizontais, ou porque são Casos de Uso que não possuem cenários previsíveis, repetitivos, passíveis de padronização; ou porque são, fundamentalmente, agrupamentos de regras de negócio (como é o nosso caso). Ainda assim reutilizaremos diversos serviços úteis do jcompany FS Framework. Afinal, como vimos no capítulo 1, o jcompany Developer Suite é muito mais que os geradores do jcompany IDE, utilizados para Casos de Uso Padrões. Figura E17.1. Diagrama de Caso de Uso para UC005 Calcular Folha de Pagamento!. Como não é um Caso de Uso Padrão, esta especificação requer maiores explicações. Note que este é um Caso de Uso disparado por algum mecanismo de temporização, ou de escalonamento, simbolizado pelo Ator com a palavra reservada Tempo. Nestes casos, a interatividade em si do Ator com o Caso de Uso é trivial, sendo o cenário basicamente definido por um passo de disparo e um segundo passo de reação da aplicação. A descrição de cenário para este Caso de Uso UC005 está, portanto, definida da seguinte forma no repositório da ferramenta CASE: 1. O escalonador automático dispara o Cálculo da Folha, todo dia 3 de cada mês, a partir de 01h00min da madrugada. 2. A aplicação recupera todos os funcionários e executa cálculo para cada um, segundo regras definidas em REQ001 - Cálculo de Folha.

2 Capítulo E17 Veja que o cálculo da folha de pagamento em si é definido em um requisito à parte. O cálculo que iremos exemplificar é bem simplificado e altamente fictício, mas suficiente para nossos propósitos. Ele é reproduzido abaixo: Para cada funcionário com horas trabalhadas informadas para o período de referência, imediatamente anterior ao corrente (último mês), o cálculo deve ser feito da seguinte forma: 1. Pegar o último salário base de seu histórico funcional. 2. Calcular o salário inicial tendo como base 22 dias úteis, e realizando cálculo proporcional (regra de três) com o número de dias efetivamente trabalhados informados em provento do tipo DT. 3. Em seguida calcular o salário bruto somando os proventos gerais e subtraindo os descontos gerais, dos lançamentos de Proventos e Descontos para o mês. Exceções a tratar: 3.1. Se o número de dias trabalhados informado for mais que 22, gerar erro 'Numero de dias ultrapassa o possível para o período' Se o salário bruto for negativo, gerar erro 'Cálculo de salário negativo para funcionário [nome - cpf]'. 3.3 Se o cálculo estiver correto, gravar ocorrência em ProventoDesconto com natureza SL, com o valor calculado. 4. Calcular o IR com base no salário bruto, descontando 15% após deduzir 200,00 para cada dependente. Ex: Para um funcionário com salário de 1.400,00 com dois dependentes, o IR deverá ser 15% de 1.000,00, ou seja, 150, Se a dedução for maior que o salário, gravar IR com zero Gravar ocorrência em ProventoDesconto com natureza IR. 5. Calcular salário liquido final, subtraindo o IR do salário bruto e gravando-o em Provento com tipo SL. 6. Se alguma exceção ocorrer durante um cálculo especifico, ele deve ser interrompido e o erro enviado por para além de gravado em log de erro. O processamento deve continuar para os demais. 7. Ao final, se todos os funcionários possuírem o salário calculado, a aplicação gera um fechamento de período, atualizando anomesfechamento. Uma mensagem de sucesso também deve ser enviada para o log. Foi definida uma Colaboração com o estereótipo plcbatch, que não nos traz muita informação, diferentemente das Colaborações Padrões anteriores. A marcação indica apenas que deveremos utilizar um disparo escalonado para esta rotina e implementar sua orquestração a partir de uma classe de negócio/domínio dedicada a processamento de cálculos, chamada CalculoFolha. O grafo de entidades envolvido costuma ser grande em programações batch. Em nosso exemplo, ele está representado pela Figura E17.2. Figura E17.2. Grafo de Entidades, envolvido no Caso de Uso UC005 Calcular Folha de Pagamento!.

3 Regras de Negócio e Batch Uma nova classe FolhaPagamento foi definida para abrigar o valor do último período de fechamento. Esta classe foi estereotipada como plcprefaplicacao, pois contém somente um objeto e é um padrão definido pelo jcompany Patterns & Methods. O jcompany IDE, inclusive, pode gerar um Caso de Uso Padrão para sua manutenção interativa, se preciso for não é o nosso caso, já que iremos gravar o anomesultimofechamento programaticamente. Note que modelamos a referência à classe FolhaPagamento em ProventoDesconto como uma variável de classe dinâmica. Esta é uma conceituação opcional, mas, fazendo deste modo, conseguimos rastrear a classe ProventoDesconto com FolhaPagamento. Finalmente uma parte do grafo de Funcionário foi incluída pois o número de seus dependentes e seu último salário serão ambos utilizados no cálculo. É uma boa prática de modelagem explicitar claramente o grafo de Entidades envolvidas no Caso de Uso. - Analisando a Especificação Extensão Existe uma Extensão definida para nosso Caso de Uso, utilizada por usuários com papel FolhaPagamento, que permite a estes usuários informarem um período não encerrado (somente o mês corrente ou o anterior, por exemplo) e dispararem o mesmo cálculo que roda em batch, de forma interativa. Os requisitos são os mesmos, mas há uma restrição nova, já que o período agora será informado: RES01. Verifica Período. O sistema verifica se o período é válido, ou seja, se é maior que o 'anomesfechamento'. Se não for, impede o cálculo e exibe mensagem 'Não é permitido fazer cálculo para este período, pois ele já foi encerrado'. O formulário a ser utilizado é, também, fora do padrão, apresentando botão de disparo ao lado do campo de período e as mensagens abaixo do botão de disparo. As mensagens estão em cores distintas, utilizando verde para o número de calculados com sucesso e vermelho para o número com problemas e mensagens de erro. As mensagens de erro, além de exibidas para o usuário, também devem ser enviadas por e log. A Colaboração que irá implementar a extensão possui estereótipo plcontrole, conhecido também como Controle Simples, que é na verdade um padrão livre do jcompany, se é que se pode dizer assim. É uma Colaboração utilizada quando se deseja realizar implementações livremente, a partir da camada Controle, mas ainda utilizando leiautes Facelets e possivelmente anotações de metadados para acionar reúso de recursos do framework. Veremos a implementação desta extensão no próximo capítulo. - Obtendo a Entidade em Java Vamos criar a única Entidade nova FolhaPagamento manualmente através do Eclipse, conforme a Figura E Crie um novo pacote folhapagamento, abaixo de entidade em rhtutorial_commons, e digite o código abaixo. Figura E17.3. Novo pacote folhapagamento, abaixo de entidade e classe FolhaPagamento. - Gerando Mapeamento para Classe - Objeto-Relacional VI 1. Edite a classe FolhaPagamento e aperte Control+N para acionar as opções de plugins. Selecione 01 Mapeamento Objeto-Relacional. As informações importantes para o caso do mapeamento O-R de FolhaPagamento se encontram na Figura E17.4.

4 Capítulo E17 Figura E17.4. Mapeamento Objeto-Relacional para "FolhaPagamento". Modifique apenas a indicação de lookup (para usar anomesultimofechamento no tostring da Classe) e tamanho 8 (desnecessário para o JPA, mas pode ser útil se formos gerar formulários que contenham esta data). 2. Após a geração, edite a classe FolhaPagamentoEntity e ajuste o método "tostring" para exibir a data com máscara MM/yyyy, utilizando o SimpleDateFormat, por exemplo. Figura E17.5. Ajuste na exibição da Data em FolhaPagamentoEntity. Note que o jcompany sempre gera uma NamedQuery buscando o "Object-Id + Propriedades de Lookup", com sufixo padrão querysellookup. A query nomeada será útil em tempo de programação, para recuperarmos esta entidade e formatarmos mensagens de erro com a data. - Implementando Classes de Negócio Programação de Camada Modelo I Vamos realizar então nossa primeira programação em camada Modelo, utilizando classes típicas para Regras de Domínio/Negócio. Crie a classe CalculaFolha no projeto rhtutorial_model definindo um novo sub-pacote folhapagamento abaixo de modelo. Figura E17.6. Criação de classe de CalculaFolha na camada Modelo. #1. Serviços de negócio ficam no projeto rhtutorial_model.

5 Regras de Negócio e Batch #2. Ao criar a classe, após posicionar no pacote com.empresa.rhtutorial.model e acionar New Java Class com o clique direito do mouse, pode-se complementar o pacote origem com extensões como.folhapagamento, para que esta extensão seja criada em conjunto com a classe. #3. Digite o nome da classe, conforme especificado. 2. Implemente o algoritmo principal de orquestração da Regra, conforme a Figura E17.7. Figura E17.7. Codificação do método principal de orquestração. #1. Caso não se esteja utilizando um ambiente que proveja rastreabilidade entre requisitos e código (como uma suíte de ALM), a inclusão do identificador no Javadoc é recomendada. Na camada Modelo, em regras do negócio, o Javadoc é especialmente importante. #2. Definimos um objeto de exceção especializado para encapsular exceções internas geradas em nosso cálculo. Vamos discuti-los no próximo tópico. #3. Perceba que definimos o método como protected! Como somente iremos acioná-lo via escalonador, esta é uma restrição útil. Veremos a técnica de disparo mais a frente. Poderíamos também não receber argumentos, inferindo o mês de referência dentro de nosso método que seria o mês anterior ao que estamos. Porém, deste modo o tornamos menos reutilizável. Deixaremos pré-condições relacionadas à temporalidade em si para a tarefa de escalonamento, que descobrirá o período e nos informará. Além do mais, já sabemos que haverá um disparo interativo informando mês de referência para cálculo, o que reforça esta nossa estratégia. #4. Vamos adiar a recuperação da lista de funcionários, por enquanto, para nos concentrarmos no algoritmo de orquestração em si. Mas uma coisa é certa: iremos precisar de um serviço de persistência que traga uma coleção de subgrafos de Funcionario contendo somente aqueles que possuem DT (Dias Trabalhados) informados para o período. Benefício do JPA: em nossas regras de negócio não iremos usar Result Set JDBC ou qualquer outro conjunto relacional como fonte de dados, mas nosso modelo de Entidades de Domínio, expresso pela declaração do tipo de retorno como List<Funcionario>. Isso tornará nossas regras mais legíveis e manuteníveis, um dos grandes benefícios do JPA. #5. Iremos totalizar os funcionários calculados corretamente, conforme requisitado.

6 Capítulo E17 #6. Manteremos uma lista de exceções geradas em cálculos individuais de funcionários para encapsular as causas de erro associadas a alguns dados do funcionário. #7. Os elementos de programação tipicamente encontrados em orquestradores de regras de negócio serão laços e condicionais. #8. É uma boa prática subdividir métodos de orquestração para mantê-los compreensíveis e reutilizáveis. Na sequência, continuaremos a desenvolver nosso raciocínio procedimental, para cada um dos métodos faltantes. Neste caso, teremos um método em separado para o cálculo do pagamento de cada funcionário. #9. O método que calcula salário para cada funcionário, caso encontre algum dos erros apontados na especificação, irá disparar a exceção CalculoFolhaFuncionarioException, que neste tratamento será acumulada, conforme solicitado. #10. Em nosso caso, como recomendado para lógicas de atualização em lote, não devemos encerrar todas as gravações em uma única ULT (Unidade Lógica de Transação ou commit ). Correríamos o risco, neste caso, de comprometer recursos do SGBD excessivamente, já que transações muito longas (conhecidas como long running transactions ) aumentam perigosamente o tamanho e esforço do SGBD para manutenção de áreas de log/redo, dentre outros problemas. Além disso, um erro ao final do processo nos faria perder todos os cálculos corretos que fizemos até ali. Por estes motivos, é recomendável gerenciarmos transações manualmente em programações batch de alto volume ainda assim reutilizando alguns serviços do framework. No nosso caso, vamos efetuar um commit a cada 100 funcionários calculados corretamente, chamando o serviço commit() disponível na implementação de DAO do jcompany FS Framework. Ao final, também faremos uma chamada adicional, para garantir a confirmação dos restantes, abaixo de 100. #11. Se, ao final do processamento, houver algum erro de cálculo individual, nosso método irá encerrar disparando uma exceção principal que irá encapsular as várias exceções individuais e também o total calculado ok. Estas são informações que projetamos para que o método chamador (que chamou o atual) possa tratar o erro e apresentá-lo conforme requisitado. #12. Precisaremos também de uma função que verifique se o total de cálculos efetuados até aqui é igual ao universo de cálculo potencial. Isso porque, segundo a especificação, neste caso devemos atualizar a data do último fechamento. #13. Se a função não disparar uma exceção, ela deve devolver o total de funcionários cujo salário foi calculado para exibição da mensagem de confirmação, no padrão solicitado. - Implementando Objetos de Exceção (Exception) Programação de Camada Modelo II Como teremos que devolver muitas informações em caso de exceções (não somente uma mensagem), nós decidimos utilizar objetos de Exceção especiais para encapsulá-las. Ao decidirmos por disparar uma exceção em nosso método, delegamos a responsabilidade de finalizar o tratamento de erros para um método cliente, mas continuamos responsáveis por prover todas as informações necessárias para tanto, encapsuladas nos objetos de Exceção. As classes de Exceção devem ser criadas na camada ortogonal comuns em rhtutorial_commons, pois objetos deste tipo podem ser disparados entre camadas. Além disso devem especializar a classe java.lang.exception. 1. Siga as orientações das Figura E17.8 e Figura E17.9 para criar as classes de Exceção que utilizaremos.

7 Regras de Negócio e Batch Figura E17.8. Exceção que encapsula problemas em cálculos individuais de funcionários. #1. Crie a classe com nome CalculoFolhaFuncionarioException abaixo de com.empresa.rhtutorial.commons", em rhtutorial_comons. #2. Esta classe deve herdar de java.lang.exception, ancestral para exceções controladas. #3. Declare as propriedades "messagekey", nomefuncionario e cpffuncionario. #4. Note que não foram criados setters para as novas propriedades. Deste modo, elas somente podem ser incluídas através de um novo construtor que também recebe a mensagem do problema em si. Figura E17.9. Exceção que encapsula todos os problemas de um cálculo. #1. A segunda classe de Exceção deve ser criada com nome CalculoFolhaException no mesmo diretório da anterior e também herdando de java.lang.exception.

8 Capítulo E17 #2. Ela irá encapsular uma coleção de exceções individuais e também o total de calculados ok. #3. Da mesma forma (é um padrão para classes Exception), as novas variáveis somente são recebidas em construtores, imutáveis. - Implementando Data Access Objects (DAO) Programação de Persistência I Vamos agora escrever o nosso primeiro serviço de persistência específico, na Classe FuncionarioDAO, que provê serviços de acesso a funcionários. 1. Codifique o método "recuperacomdtinformado" em "FuncionarioDAO". 2. A primeira coisa que métodos de DAO tipicamente conterão é uma cláusula try-catch para garantir tratamento contra problemas externos inesperados. No caso específico destas classes, presentes em uma camada considerada de integração, existem diversos externos possíveis, como problemas de JDBC, Pool de Conexões, SGBD-R, Rede, etc. Utilize o tratamento padrão pauta mínima do jcompany simplesmente digitando try + Control + Space. Um snippet (trecho padrão de código) pré-configurado no Eclipse pelo jcompany gera todo o código necessário. Figura E Digitação do try-catch padrão do jcompany. 3. Utilize "control+shift+o" para importar dependências, especialmente a exceção padrão para problemas inesperados, "PlcException". Note também que uma classe de log (do framework Log4j) é utilizada no disparo da exceção, mas não é preciso declará-la, pois já está injetada pelo CDI no ancestral "PlcBaseJPADAO". Figura E Tratamento de try-catch padrão gerado via snippet e classe de log declarada. 4. Vamos agora obter uma sessão de persistência. Se estivéssemos utilizando EJB 3.1 (que está fora do escopo deste livro) poderíamos usar CDI para injetar o EntityManager como variável de instância do FuncionarioDAO. Mas como estamos com POJOs, podemos obter a sessão de persistência com o método "getentitymanager" como PlcBaseContextVO context; EntityManager entitymanager = getentitymanager(context); Código E17.1. Obtenção de sessão de persistência para fábrica default.

9 Regras de Negócio e Batch O context é um objeto que segue o Design Pattern "Context Param". Trata-se de um POJO que encapsula informações de contexto na camada de Modelo, tais como perfil do usuário corrente, fábrica JPA, definição do grafo de entidades (metadados), dentre alguns outros Este objeto pode ser modificado para a obtenção de acesso a outras fábricas, mas em nosso caso basta recebê-lo por injeção e repassá-lo. 5. O método de persistência utilizando NamedQuery fica conforme abaixo: Figura E Método típico de DAO. #1. Podemos, ao final da cláusula createquery ou "createnamedquery", incluir quantos setparameter aninhados desejarmos para passar os valores dos argumentos. No nosso caso, somente temos um. #2. Um último comando getresultlist, ao final de todo o comando, retorna uma coleção do tipo List<Object[]>, com cada posição do array interno de objetos trazendo o valor de retorno de uma propriedade na ordem em que aparecem na cláusula select. 6. A query em si deve ser declarada na Entidade, tendo assim sua sintaxe verificada em tempo de inicialização da fábrica de persistência. Figura E NamedQuery em sintaxe JPA-QL #1. Um primeiro objetivo foi trazer, em uma única cláusula, todas as informações do grafo de consulta que precisamos incluindo o Object-Id (identificador interno do Funcionário), o nome e cpf, além do valor de Dias Trabalhados em ProventoDesconto, o total de dependentes e seu salário atual (imaginando, de forma simplificada, que podemos inferir o salário atual como o maior ). Note que funções de agregação, expressões, subqueries e outras técnicas consagradas pelo SQL estão presentes em JPAQL.

10 Capítulo E17 #2. Nossa classe pivô escolhida foi ProventoDesconto, pois dela consegue-se partir para todas as demais! Este é um ponto importante em JPAQL: Se partíssemos de Funcionario não chegaríamos em ProventoDesconto via navegação OO, já que não temos um OneToMany de Funcionario para ProventoDesconto *. Veja o grafo percorrido no diagrama da Figura E17.14, possibilitado pelas setas de navegação. O símbolo de composição sempre indica uma navegação possível, no caso de ProventoDesconto -> Funcionario. Mas não temos seta de Funcionario -> ProventoDesconto. Figura E Grafo percorrido no modelo de classes, por nossa cláusula JPAQL. #3. A navegação (junção com join ) de ProventoDesconto para Funcionario é obrigatória. De fato, pela associação, um ProventoDesconto deve ter no mínimo 1 (um) Funcionario. #4. Já a navegação de funcionário para seus dependentes é explicitamente codificada como left join. Em nosso caso, sabemos que existem funcionários que não possuem dependentes (veja cardinalidade mínima 0!). Portanto, esta é a estratégia correta - deste modo, funcionários que não tenham dependentes também serão recuperados. #5. A navegação de funcionário com seu histórico, por sua vez, é obrigatória novamente já que a multiplicidade mínima é também 1 (um). Importante: Perceba que todas as associações de join são definidas utilizando o alias pd, ou seja, partindo da classe pivô e navegando com notação de pontos pelo grafo de objetos. #6. Na cláusula where utilizamos dois tipos de filtros: - Para a enumeração naturezaproventodesconto, recuperada através da constante DT, podemos simplesmente utilizar valores alfanuméricos dentro de aspas simples, como no SQL (e como se seu tipo fosse um String); - Já para o anomesreferencia será enviado um argumento, nomeado de forma idêntica à propriedade (poderia ser qualquer nome desejado). #7. Como estamos utilizando funções de agregação count e max juntamente com valores não agregados, precisamos colocar as demais propriedades ausentes nas agregações, na cláusula group by, tal como faríamos em SQL. - Aprimorando cláusulas de JPAQL Programação de Persistência II Poderíamos nos dar por satisfeitos com a versão atual de nosso método de DAO: o Ele trata exceção apropriadamente, utilizando logging para arquivo, envio de e exibição de problemas inesperados para usuários. * Também seria possível, a despeito do mapeamento, realizar joins relacionais entre estas classes mas, deste modo, a solução fica mais extensa e menos elegante. Note que um modelo de classes que também traga as roles das associações (propriedades de navegação) explicitadas pode facilitar bastante na confecção das queries. Se informado somente join, o inner join é assumido como default. Se informado left ou right, um outer join é utilizado mudando apenas a direção do outer.

11 Regras de Negócio e Batch o o o Ele reutiliza o gerenciamento de sessões de persistência, transações e pool de conexões de camadas de arquitetura, evitando problemas sérios que podem advir do uso programático, em quaisquer destas áreas. Ele utiliza bem o recurso de JPAQL, procurando trazer em um único comando o maior conjunto de dados úteis possível. Ao evitar o envio de comandos a cada iteração de cálculo, ou minimizá-lo *, otimizamos significantemente a performance. Ele utiliza prepared stament, passando os argumentos via setparameter, ao invés de concatená-los à cláusula JPAQL principal. Isto não somente é mais seguro, como mais performático. Porém, no estágio em que nosso método se encontra, utilizando select f.id, f.cpf, f.nome, pd.valor, count(d.id), max(hp.salario), ele ainda é um péssimo exemplo. O seu uso forçaria cada método cliente (e esperamos que sejam vários, ao longo do tempo) a receber tipos pobres no estilo COBOL ou Cliente/Servidor Relacional, como exemplificado no Código E17.2. // 1 List<Object[]> listacomdtinformadonoperiodo = funcdao.recuperacomdtinformado(anomesreferencia); for (Iterator i = listacomdtinformadonoperiodo.iterator(); i.hasnext();) { // 2. Recebimento do tipo "result set" Object[] resultado = (Object[]) i.next(); Long idfuncionario = (Long) resultado[0]; String cpffuncionario = (String) resultado[1]; String nomefuncionario = (String) resultado[2]; BigDecimal proventodescontodiastrabalhados = (BigDecimal) resultado[3]; Long dependentetotal = Long resultado[4]; BigDecimal salarioatual = (BigDecimal) resultado[5]; Código E17.2. Recebimento de retorno do tipo result set com List<Object[]>. #1. Cláusulas JPAQL que usam select <propriedades> retornam coleções de vetores de objetos, List<Object[]>. #2. O laço que irá percorrer a coleção deve, portanto, fazer o casting apropriado de cada atributo para cada tipo correto (veja que neste pequeno exemplo de JPAQL já temos uma mistura de três tipos distintos). Este padrão não somente é pouco produtivo para quem reutiliza o serviço de dados, mas também sujeito a diversos erros e extremamente inflexível. Uma eventual introdução de novas propriedades na cláusula select pode introduzir erros graves no método cliente, não detectáveis em tempo de compilação e, o que é pior, muitas vezes nem em tempo de execução! Faça uma reflexão: Qual o nível de caos aconteceria se, em uma manutenção futura do método de DAO, introduzíssemos o retorno de um valor adicional com o total de descontos, antes do salário, como select f.id, f.cpf, f.nome, pd.valor, count(d.id), sum(hp.valor), max(hp.salario)? O cenário do Código E17.3 chega a ser ainda pior - e acontecerá na prática se o serviço de dados incentivar, especialmente se forem dezenas de atributos de retorno a serem manipulados. É o que chamamos de manipulação do tipo result set. É lamentável ver um Desenvolvedor Java EE (em tese, OO também) programando regras de negócio com dados estruturados como tabelas relacionais, como no exemplo. List<Object[]> listacomdtinformadonoperiodo = funcdao.recuperacomdtinformado(anomesreferencia); for (Iterator i = listacomdtinformadonoperiodo.iterator(); i.hasnext();) { Object[] resultado = (Object[]) i.next(); * Aliás, como dica geral, deve-se evitar o uso de recuperações de JPAQL dentro de laços, sempre que possível. Em casos de programações batch, como é o nosso caso, vamos ainda utilizar mais uma cláusula durante o cálculo, mas isto é razoável considerando-se que pode não haver memória disponível para se manter tudo em caching, no início dos cálculos.

12 Capítulo E17 BigDecimal salarioliquido = ((BigDecimal)resultado[5]).subtract( ((BigDecimal)resultado[4]).multiply(new BigDecimal(200))); Código E17.3. O pesadelo do COBOL, aplicado ao mundo OO. Faça uma segunda reflexão: Qual o esforço você tem que fazer para entender que a fórmula acima em destaque está subtraindo R$ 200,00 de seu salário base, para cada dependente? Introduzimos este anti-padrão JPAQL retornando Result Set em nosso tutorial apenas para enfatizarmos a importância da utilização de coleções de Grafos de Entidades de Domínio como retorno de JPAQLs, sempre que possível. Vamos refatorar nosso método, então, para retornar valores deste tipo com maior semântica para o negócio. 1. Altere a cláusula select introduzindo um new FuncionarioEntity(<propriedades>) que passa todos os valores retornados em seu construtor. "select new FuncionarioEntity(f.id,f.cpf,f.nome,pd.valor,count(d.id),max(hp.salario))" Código E17.4. Uso de JPAQL retornando objetos do domínio. 2. Neste padrão assumimos o trabalho que cada método cliente teria para fazer casting de Object[] para variáveis com nomes significativos (se fizesse). Assim, como projetistas de serviços para reuso, cuidaremos de acomodar os dados em um modelo de Domínio com maior semântica, livrando os nossos clientes Desenvolvedores deste trabalho e, principalmente, da tentação de escreverem código relacional em Java. Note, portanto, que não haverá aumento de trabalho, apenas fatoração de trabalho que haveria de ser feito de qualquer modo em cada método cliente. public class Funcionario extends AppBaseEntity { // 1. Auxiliares private transient BigDecimal private transient Long private transient BigDecimal salarioatual; // 2. Somente getters gerados. public BigDecimal getdiastrabalhados() {return diastrabalhados; public Long gettotaldependentes() {return totaldependentes; public BigDecimal getsalarioatual() {return salarioatual; public class FuncionarioEntity extends Funcionario { // 3. Construtor apropriado public FuncionarioEntity(Long id, String cpf, String nome, BigDecimal proventodescontodiastrabalhados,long dependentetotaldependentes, BigDecimal historicoprofissionalsalarioatual) { setid(id); setcpf(cpf); setnome(nome); this.diastrabalhados=proventodescontodiastrabalhados; this.totaldependentes=dependentetotaldependentes; this.salarioatual=historicoprofissionalsalarioatual; // 4. Reconstituição do grafo persistente - apenas exemplo. //sethistoricoprofissional(historicoprofissional); Código E17.5. Uso JPAQL retornando propriedades de Entidades de Domínio. #1. Propriedades transientes são criadas na classe abstrata Funcionario para acomodarem resultados temporários obtidos de seu grafo e serem utilizadas em cálculos do negócio. O padrão é nomear as propriedade transientes de forma a manter a classe de origem de sua informação bem clara utilizando [propriedadeagregacao][propriedade]. #2. Além da visibilidade private provemos somente métodos getters para estas propriedades para garantir o uso seguro, apenas via construtor, das propriedades transientes. #3. Na classe concreta, criamos o construtor que acomoda o result set em propriedades de objetos. Mantendo o construtor na classe concreta, visamos despoluir ao máximo da classe abstrata para que contenha métodos de negócio somente (além dos inevitáveis getters e setters, é claro). #4. Note que, se um select retornasse um objeto ou uma coleção de objetos OneToMany (Ex.: select new FuncionarioEntity(f.id, f.cpf, f.nome, f.historicoprofissional) ) o correto seria

13 Regras de Negócio e Batch recompor a agregação e não utilizar propriedades novas. O mesmo vale para objetos ManyToOne. 3. Agora assim, podemos indicar que nosso método retorna List<Funcionario>, alterando sua assinatura para public List<Funcionario> recuperacomdtinformado(date anomesreferencia). 4. Nosso método cliente agora pode trabalhar de uma forma bem mais elegante, compreensível e estável ao longo do tempo. Compare o Código E17.2 e o Código E17.3 com o Código E17.6. List<FuncionarioEntity> listacomdtinformadonoperiodo = fdao.recuperacomdtinformado(anomesreferencia); for (Iterator i = listacomdtinformadonoperiodo.iterator(); i.hasnext();) { FuncionarioEntity funcionario = (FuncionarioEntity) i.next(); BigDecimal salarioliquido = funcionario.getsalarioatual().subtract( funcionario.gettotaldependentes().multiply(new BigDecimal(200)); Código E17.6. Exemplo de chamada OO. - Externando cláusulas JPAQL em NamedQueries Programação de Persistência III As vantagens das NamedQueries como a que criamos são muitas.vamos rever seu mecanismo: 1. Cláusula do método de DAO para a parte query fica declarada em alguma das entidades envolvidas (poderíamos também optar query="select new FuncionarioEntity(f.id,f.cpf,f.nome,pd.valor,count(d.id),max(hp.salario))" + " from ProventoDescontoEntity pd" + " join pd.funcionario f" + " left join pd.funcionario.dependente d" + " join pd.funcionario.historicoprofissional hp" + " where pd.naturezaproventodesconto='diastrab' and pd.anomesreferencia=:anomesreferencia" + " group by f.id,f.cpf,f.nome,pd.valor") ) public class ProventoDescontoEntity extends ProventoDesconto { Código E17.7. NamedQuery ProventoDescontoEntity.recuperaComDTInformado. 2. O método de DAO recupera a cláusula nomeada usando createnamedquery e informando o nome da NamedQuery em lugar da cláusula JPAQL em si. return em.createnamedquery("proventodescontoentity.recuperacomdtinformado").setparameter("anomesreferencia", anomesreferencia).getresultlist(); Código E17.8. Comando de classe DAO, agora utilizando JPAQL externo em NamedQuery. As vantagens de externar cláusulas JPAQL são muitas: o o Sintaxes de NamedQueries são analisadas em tempo de entrada da aplicação - e erros impedem a configuração da fábrica de persistência. Deste modo, não se corre o risco de entrar em produção com cláusulas cancelando na mão de usuários finais! Metadados (NamedQueries) * que dizem respeito a uma Agregação de Entidades ficam encapsulados na sua classe Raiz. Note que todos os dados recuperados em nossa cláusula * NamedQueries anotadas em Entidades, ao contrário do que uma análise superficial pode sugerir, não acoplam Entidades do negócio a mecanismos de persistência! Na verdade, são como as próprias anotações de mapeamento nas propriedades: informações de metadados (configuração). Nesta categoria, elas nem sequer precisam ser utilizadas pelas classes que as contêm - como, de fato, não o serão.

14 Capítulo E17 de exemplo participam da agregação de Funcionario - deste modo, mantendo um ponto único e intuitivo para análise de impacto e reuso. o o o A facilidade para se editar e conferir construtores associados a cláusulas JPAQL é maior por estarem ambos no mesmo artefato. As cláusulas JPAQL que percorrem diversos grafos de objetos são as únicas que não devem ficar externadas em nenhuma agregação. Deste modo, segmenta-se claramente esta diferente categoria de cláusulas de varredura (ou de relatórios ) das encapsuláveis no escopo de uma Agregação de Entidades. Ao passarmos a nomear cláusulas e desacoplá-las de métodos tornamos possível categorizálas em padrões de nível de arquitetura, reutilizando-as em programações genéricas, como faz o jcompany, gerando e utilizando NamedQueries com as seguintes convenções padronizadas: [Entidade].querySel[Complemento] : Utilizada como padrão para Colaborações plcselecao. É possível definir mais de uma opção com sufixos diferenciados após o querysel (Ex.: querysel2 ou queryseltodos ) e indicar, para uma Colaboração específica, qual delas utilizar. [Entidade].queryEdita : Utilizada como padrão para Colaborações de manutenção de uma Agregação por vez, no momento da edição. Se não encontrada, o jcompany usa from [Entidade] obj como default. [Entidade].querySelLookup : Utilizada como padrão para recuperação da Entidade quando vinculada ao grafo de manutenção de outra Agregação (ou seja, referenciada, mas não mantidade). Neste caso, a cláusula JPAQL evita trazer muitas propriedades, mas somente as utilizadas no método tostring definidas como lookup durante o Assistente de Criação de mapeamento O-R. Além disso, esta cláusula espera um argumento de Object-Id na parte where, por recuperar um objeto por vez - ao contrário da querysel, utilizada em lógicas de QBE (Query By Example), onde a where é montada dinamicamente e pode permitir retorno de vários objetos. [Entidade]. naodeveexistir[complemento] : Cláusulas JPAQL utilizadas para verificação de restrições de integridade referenciais e de existência para melhorar o tratamento de mensagens de erro do SGBD ou em situações onde não se possa confiar somente nas restrições declarativas em seu nível. - Entendendo o mecanimos OO para classes DAO Programação de Persistência IV A herança de PlcBaseJpaDAO já trouxe simplicidade para o nosso DAO, nos permitindo herdar uma classe de log e obter o EntityManager em POJOs facilmente. Podemos ser ainda mais sucintos com a sintaxe que codificamos, trazendo o "getentitymanager" para a mesma linha da query e também retirando a cláusula que redispara "PlcException" no tratamento de exceção gerado, pois sabemos que não haverá esta possibilidade em nossa chamada. Vamos verificar o quão simples então ficou o método @PlcQueryService public class FuncionarioDAO extends PlcBaseJpaDAO { () public List<Funcionario> recuperacomdtinformado(date anomesreferencia) { try { return getentitymanager(context).createnamedquery("proventodescontoentity.recuperacomdtinformado") Como exemplo de que estes metadados não trazem sequelas para estas classes, basta removê-los e perceber que nenhum comportamento interno destas Entidades é afetado. Por outro lado, assim utilizados, aprimoram a organização.

15 Regras de Negócio e Batch.setParameter("anoMesReferencia", anomesreferencia).getresultlist(); catch (Exception e) { throw new PlcException("FuncionarioDAO", "recuperacomdtinformado",e, log, ""); Código E17.9. Classe de DAO completa com método típico, utilizando herança direta do jcompany para exemplo. - Utilizando CDI em classes de cálculos de negócio Agora que finalizamos a nossa implementação da classe de persistência, deixando-a tão simples quanto possível, vamos ajustar nossa classe de cálculo para reconhecê-la. Altere a classe CalculoFolha para receber o serviço de persistência via Injeção de Dependência do CDI, como abaixo. public class CalculoFolha private FuncionarioDAO funcionariodao; protected Long calculafolha(date anomesreferencia) throws CalculoFolhaException { Código E Chamada de AS para DAO via CDI com amarração automática via padrão de nomenclatura. - Criando serviços adicionais em FuncionarioDAO Programação de Persistência V Analisando nossa especificação, vemos que ainda restam informações a serem recuperadas via serviços de persistência, como os totais gerais de descontos e proventos para um Funcionário, em um período. Decidimos, hipoteticamente, por não recuperar todos estes totais inicialmente, como fizemos para a maior parte dos dados de funcionário para que nosso exemplo fique mais próximo das restrições que encontramos no mundo real. Em geral, sempre que possível, será muito mais performático recuperar todos os dados envolvidos em uma transação batch em um único comando JPAQL inicial - e depois varrermos o resultado em memória. Mas muitas vezes isso não é possível por restrições de memória disponível. No mundo prático dos projetos corporativos, uma das grandes complexidades de programação é ter de lidar com imperfeições advindas de limitações tecnológicas. Restrições típicas são memória disponível, capacidade de comunicação via rede (throughput) e de processamento. Precisamos, portanto, de recuperar o saldo de Proventos e Descontos com naturezas PA e DG para cada funcionário/período. Este é um serviço que, basicamente, irá acessar a entidade ProventoDesconto mas, em nosso caso, ficará acomodado na mesma classe de implementação FuncionarioDAO Mas será que o correto não seria definir um ProventoDescontoDAO? Poderia ser, se não tivéssemos modelado ProventoDesconto como parte da Agregação de Funcionario (uma composição, na verdade), como pode ser conferido na Figura E17.14, pelo símbolo UML de losango preto entre ProventoDesconto e Funcionario *. Existem duas outras hipóteses de modelagem que nos induziria a utilizar um ProventoDescontoDAO : o Se houvéssemos optado por utilizar uma agregação compartilhada (losango claro) estaríamos definindo que não somente Funcionario, mas outras Entidades Raízes poderão se relacionar com ProventoDesconto. * Note que, apesar de termos realizado esta especificação para o modelo de Domínio, é uma boa prática utilizar estes mesmos critérios para o modelo de classes de Persistência quando possuir correlação.

16 Capítulo E17 o Se houvéssemos modelado ProventoDesconto como plcraiz também exporíamos esta Entidade de uma forma direta para fora da agregação de Funcionario. Agora que já justificamos o encapsulamento que iremos seguir e que já conhecemos a arquitetura básica de classes DAO sugerida pelo jcompany vamos acelerar nosso tutorial: 1. Defina o método recuperasaldogeralporfuncionario em nossa classe FuncionarioDAO. /** anomesreferencia Período de referência (MM/yyyy) BigDecimal, contendo o saldo de proventos e descontos gerais, para o funcionário, no * período. */ public BigDecimal recuperasaldogeralporfuncionario(date anomesreferencia,funcionario funcionario) { Código E Novos métodos para recuperar saldo de ProventoDesconto. 2. Implemente o método em FuncionarioDAO utilizando a mesma organização que já discutimos anteriormente, com a NamedQuery em ProventoDescontoEntity. public BigDecimal recuperasaldogeralporfuncionario(date anomesreferencia,funcionario funcionario) throws PlcException { return (BigDecimal) getentitymanager(context).createnamedquery( "ProventoDescontoEntity.recuperaSaldoGeralPorFuncionario").setParameter("anoMesReferencia", anomesreferencia).setparameter("funcionario", funcionario).getsingleresult(); Código E Novos métodos para recuperar saldo de ProventoDesconto. 3. Declare a cláusula JPAQL em ProventoDescontoEntity. Note que agora utilizamos dois argumentos, inclusive com um deles sendo uma Entidade e a agregação sum para somar débitos e créditos que estão representados pelos tipos PA e DG em nossos proventos e descontos. Esta soma simples funciona porque, no momento dos lançamentos, transformamos os valores de débito em query="select sum(pd.valor) as saldo" + " from ProventoDescontoEntity pd" + " where pd.anomesreferencia = :anomesreferencia and pd.funcionario=:funcionario" + " and (pd.naturezaproventodesconto='provento' or pd.naturezaproventodesconto='desconto')") ) public class ProventoDescontoEntity extends ProventoDesconto { Código E NamedQuery em ProventoDescontoEntity. - Delegando cálculos do negócio para Entidades Programação de Domínio II 1. Retornando ao nosso algoritmo principal em CalculoFolha vamos implementar agora o método de cálculo individual calculafolhaumfuncionario. Implemente-o como orientado pelo Código E // 3. Constantes externadas public static final int TAXA_IR = 15; public static final BigDecimal DESCONTO_DEPENDENTE = BigDecimal.valueOf(200); /** * Calcula salário e impostos, para um Funcionário anomesreferencia Período de referência funcionario Funcionário a ser utilizado */ private void calculafolhafuncionario(date anomesreferencia,funcionario funcionario) throws PlcException,CalculoFolhaFuncionarioException { // 1. Saldo de proventos e descontos gerais para funcionario BigDecimal saldoproventosdescontosgerais = funcionariodao.recuperasaldogeralporfuncionario(anomesreferencia,funcionario); // 2. Calcula salário Bruto BigDecimal salariobruto = funcionario.calculasalariobruto(saldoproventosdescontosgerais);

17 Regras de Negócio e Batch // 3. Calcula IR, passando taxa para manter flexibilidade BigDecimal ir = funcionario.calculair(salariobruto,taxa_ir,desconto_dependente); // 4. Calcula Salário Líquido BigDecimal salarioliquidofinal = funcionario.calculasalarioliquido(salariobruto,ir); // Grava Código E Método calculafolhaumfuncionario em CalculoFolhaAS. #1. Perceba que, para cada funcionário, estamos recuperando o saldo de Proventos e Descontos gerais - para depois delegar para a Entidade Funcionario a realização dos cálculos em si. #2. 3, e 4. Como dissemos, classes de Cálculo não devem realizar cálculos ou operações de negócio atômicos, mas se concentrar no controle de todo o algoritmo. Note que fizemos três chamadas distintas a Funcionario a partir de nosso CalculoFolha. Se não precisássemos dos valores de IR e Salário Líquido ao final para gravarmos entradas em ProventoDesconto, uma única delegação ao Funcionario seria suficiente. Obs.: Note também o uso de constantes em escopo do cálculo, em lugar de valores literais, como boa prática. 2. Vamos implementar agora os três métodos na classe abstrata de Domínio Funcionario. Implemente o método calculasalariobruto testando as pré-condições e pós-condições, conforme estabelecidas na especificação. public abstract class Funcionario extends AppBaseEntity { // 1 public static final int TOTAL_DIAS_MES_REFERENCIA = 22; // 2 public BigDecimal calculasalariobruto(bigdecimal saldoproventosdescontosgerais) throws CalculoFolhaFuncionarioException { // 3. Pré-condição para o cálculo. Exemplo I18n if (getdiastrabalhados().compareto(bigdecimal.valueof(total_dias_mes_referencia))<0) throw new CalculoFolhaFuncionarioException("rhtutorial.erro.calculo.dias.trabalhados",getNome(),getCpf()); // 4. Cálculo BigDecimal salariobruto = getsalarioatual().divide(bigdecimal.valueof(total_dias_mes_referencia)).multiply(getdiastrabalhados()); // 5. Pós-condição para o cálculo. Exemplo português - iniciando com token '#' if (salariobruto.compareto(bigdecimal.valueof(0))<0) throw new CalculoFolhaFuncionarioException( "#Cálculo de salário negativo para funcionário ["+getnome()+" - "+getcpf()+"]", getnome(),getcpf()); return salariobruto; Código E Método calculasalariobruto em Funcionario. #1. Constante com valor 22 para dias totais do mês criada para evitar proliferação de uso literal. #2. Nunca é pouco lembrar: os métodos de negócio, especialmente, devem possuir comentários Javadoc bem elaborados. #3. Pré-condição especificada, com exemplo de tratamento utilizando uma exceção customizada e enviando mensagem internacionalizada com argumentos em separado. #4. O cálculo em si reside nesta linha. Utilizamos recursos da classe java.math.bigdecimal para fazer uma regra de três entre os dias totais e os efetivamente trabalhados. #5. Pós-condição especificada, com exemplo de exceção disparada agora sem internacionalizar, para variar o exemplo somente. O uso do token #, no início da mensagem, indica para o jcompany não tentar traduzir este texto. 3. Implemente agora os métodos calculair e "calculasalarioliquido", que dispensam maiores explicações:

18 Capítulo E17 public BigDecimal calculair(bigdecimal salariobruto,int taxair, BigDecimal valordescontopordependente) throws PlcException { // Calcula descontos, multiplicando valor de desconto por número de dependentes BigDecimal descontos = valordescontopordependente.multiply(bigdecimal.valueof(gettotaldependentes())); // Calcula taxa, retirando percentual de IR informado (em escala taxair/100) return salariobruto.subtract(descontos).multiply(bigdecimal.valueof(taxair,2)); public BigDecimal calculasalarioliquido(bigdecimal salariobruto, BigDecimal ir) { return salariobruto.subtract(ir); Código E Métodos calculair e "calculasalarioliquido" em Funcionario. 4. E finalmente os métodos auxiliares que obtêem informações da agregação de Funcionario: /** pressupõe que registros estão ordenados ascendente pela data de início do cargo */ private BigDecimal getsalarioatual() { return gethistoricoprofissional().get(gethistoricoprofissional().size()-1).getsalario(); /** total de dias de referencia. Simplificado para exemplo. */ private BigDecimal getdiastrabalhados() { return BigDecimal.valueOf(TOTAL_DIAS_MES_REFERENCIA); /** total de dependentes */ private long gettotaldependentes() { if (getdependente()==null) return 0; else return getdependente().size(); Código E Métodos auxiliares que pegam informações da agregação de Funcionario. - Realizando manutenções programaticamente Programação de Persistência VI Até agora implementamos classes de DAO apenas para recuperar dados. A partir deste tópico, aprenderemos como persistir objetos para gravação dos cálculos. 1. Defina um terceiro método em FuncionarioDAO conforme o Código E /** * Recebe valores discretos e inclui um novo ProventoDesconto, com "batch" como usuário da última * alteração. */ public void incluiproventodesconto(funcionario funcionario, Date anomesreferencia, NaturezaProventoDesconto naturezaproventodesconto, BigDecimal valor) { Código E Nova cláusula de contrato com a persistência, para incluir objetos ProventoDesconto. 2. Implemente agora o método explicado em Código E public void incluiproventodesconto(funcionario funcionario, Date anomesreferencia, NaturezaProventoDesconto naturezaproventodesconto, BigDecimal valor) { // 1 ProventoDescontoEntity proventodescontoentity = new ProventoDescontoEntity(); // 2 proventodescontoentity.setfuncionario(funcionario); proventodescontoentity.setanomesreferencia(anomesreferencia); proventodescontoentity.setnaturezaproventodesconto(naturezaproventodesconto); proventodescontoentity.setvalor(valor); // 3 proventodescontoentity.setusuarioultalteracao("batch"); proventodescontoentity.setdataultalteracao(new Date()); proventodescontoentity.setdescricao("executando cálculo folha");

19 Regras de Negócio e Batch // 4 insert(context,proventodescontoentity); Código E Método que realiza inclusões programaticamente. #1. O método inicia criando uma nova instância da classe a ser persistida. #2. Em seguida, os valores recebidos como parâmetros são incluídos na classe (um outro modo mais sucinto poderia ser criar um construtor especial na classe, para este fim). #3. Valores obrigatórios e não informados são preenchidos. O usuário da auditoria pauta mínima deve ser incluído manualmente, em programações batch. #4. É possível se chamar o comando de persistência do JPA EntityManager diretamente (em.persist), mas o insert do jcompany já o encapsula e deve ser chamado preferencialmente. Importante: o método insert chama o "em.persist" internamente, que apenas registra o objeto em memória para ser persistido - mas não emite nenhum SQL para o SGBD! Os SQLs em si ficam em caching no escopo da sessão de persistência, até que explicitamente se envie um comando para descarregar todos eles (Ex.: flush ) ou um commit, que também descarrega todo o cache antes de confirmar a transação. Em nosso caso, é uma boa idéia deixar que todos os INSERTs sejam gerados em conjunto, de 100 em 100 registros, no mesmo momento do commit, pois deste modo nossa Unidade Lógica de Transação dura menos tempo. Por isso, em nosso exemplo, bastará implementarmos o método pendente encerratransacao(). Vamos no entanto, para efeitos didáticos, implementar os dois serviços no DAO: o Um que simplesmente descarrega o buffer de persistência enviando para o SGBD todos os SQLs em caching desde o último envio (somente para exemplo); o E outro que realiza um fechamento de transação com commit que implicitamente também envia os comandos pendentes (o que utilizaremos efetivamente). 3. Defina mais dois métodos em FuncionarioDAO, conforme o Código E public class FuncionarioDAO extends PlcBaseJpaDAO { /** * Sinaliza para o despacho imediato de comandos de persistencia. Somente necessário para * controle manual de transações (Ex.: batch) */ public void enviacomandos() { /** * Sinaliza para finalização definitiva da transação, com confirmação de dados. * Somente necessário para controle manual de transações (Ex.: batch). * Obs.: Se a operação "enviacomandos" não foi chamada, dispara todos os comandos em *caching, neste momento. */ public void encerratransacao() { Código E Cláusulas típicas para gerenciamento manual de transações. 4. Implemente os métodos acima conforme o Código E public class FuncionarioDAO extends PlcBaseJpaDAO { public void encerratransacao(){ super.commit(); public void enviacomandos(){ super.sendflush(context); Código E Implementação com reúso em FuncionarioDAO.

20 Capítulo E17 5. Troque agora o nosso esboço inicial de fechamento de transação, em CalculoFolha, para usar o serviço DAO. for (Funcionario funcionario : listacomdtinformadonoperiodo) { try { calculafolhafuncionario(anomesreferencia, (FuncionarioEntity) funcionario); calculadook++; catch (CalculoFolhaFuncionarioException fe) { felista.add(fe); if (calculadook==100) funcionariodao.encerratransacao(); funcionariodao.encerratransacao(); if (felista.size()>0) Código E Uso de fechamento de transação manual. 6. E, finalmente, inclua no cálculo individual as linhas finais para inclusão de salário e IR, em CalculoFolha. private void calculafolhafuncionario(date anomesreferencia,funcionario funcionario) throws PlcException,CalculoFolhaFuncionarioException { // Calcula Salário Líquido BigDecimal salarioliquidofinal = funcionario.calculasalarioliquido(salariobruto,ir); // Grava Salário Liquido e IR calculados, como Proventos e Descontos funcionariodao.incluiproventodesconto(funcionario,anomesreferencia, NaturezaProventoDesconto.IR,ir); funcionariodao.incluiproventodesconto(funcionario,anomesreferencia, NaturezaProventoDesconto.SALARIO,salarioLiquidoFinal); Código E Chamada para geração de novos objetos ProventoDesconto. - Utilizando subqueries Programação de Persistência VII Para finalizar as partes pendentes do nosso método calculafolha de CalculoFolhas, precisamos somente finalizar o método que chamamos verificafechamento. Este método deverá verificar se todos os funcionários ativos já tiveram seu salário calculado para um período e, se for o caso, encerrar o período, gravando a data de fechamento em FolhaPagamento. 1. Crie o último método que precisaremos em FuncionarioDAO, conforme o Código E public class FuncionarioDAO extends PlcBaseJpaDAO { /** * Conta o total de funcionários sem salário calculado, no período */ public Long contafuncionariosemsalario(date anomesreferencia) { Código E Última cláusula de persistência de nosso exemplo atual. 2. Implemente em FuncionarioDAO. public Long contafuncionariosemsalario(date anomesreferencia) { return (Long) getentitymanager(context).createnamedquery( "FuncionarioEntity.contaFuncionarioSemSalario").setParameter("anoMesReferencia", anomesreferencia).getsingleresult(); Código E Implementação da última cláusula de persistência.

21 Regras de Negócio e Batch 3. Declare a NamedQuery em FuncionarioEntity. Perceba que agora estamos utilizando um recurso de subquery bastante poderoso, também disponível em JPAQL. Outro detalhe importante é o teste f.sithistoricoplc= A Lembra-se que funcionários são excluídos apenas query="select count(*) from FuncionarioEntity f where f.sithistoricoplc='a' and f.id not in" + " (select pd.funcionario.id from ProventoDescontoEntity pd" + " where pd.anomesreferencia = :anomesreferencia and pd.naturezaproventodesconto='salario')") ) public class FuncionarioEntity extends Funcionario { Código E Cláusula JPAQL que utiliza função de agregação count e subquery. 4. Agora podemos implementar o método que falta em CalculoFolha, conforme o Código E private void verificafechamento(date anomesreferencia) throws PlcException { Long totalcalculado = funcionariodao.contafuncionariosemsalario(anomesreferencia); if (totalcalculado==0) funcionariodao.incluifechamento(anomesreferencia); funcionariodao.encerratransacao(); Código E Método que testa se é para gerar fechamento de folha. Colocaremso o método "incluifechamento" no mesmo FuncionarioDAO. Como sugerido no modelo, estamos compreendendo FolhaPagamento como parte da agregação de FuncionarioDAO. Figura E FolhaPagamento participante da agregação de Funcionario. O uso de mais uma transação, como sugerido, é também necessário já que não estamos mais no laço principal e realizamos mais uma gravação! A implementação deste método pode ser vista no Código E public void incluifechamento(date anomesreferencia) { FolhaPagamento folhapagamento = new FolhaPagamentoEntity(); folhapagamento.setanomesultimofechamento(anomesreferencia); folhapagamento.setdataultalteracao(new Date()); folhapagamento.setusuarioultalteracao("batch"); insert(context,folhapagamento); Código E Método de inclusão de registro de Folha de Pagamento em FuncionarioDAO. - Realizando escalonamentos temporais básicos Programação Batch I Vamos agora tratar da temporalidade de nossa especificação, definindo uma rotina que irá disparar nosso cálculo, para o mês passado, todo dia 3. É uma especificação muito simplista, mas que servirá para nos introduzir nas possibilidades embutidas na linguagem Java para este fim.

Figura C13.1. Diagrama de Casos de Uso para UC004 Registrar Proventos e Descontos!.

Figura C13.1. Diagrama de Casos de Uso para UC004 Registrar Proventos e Descontos!. A6Implementando o Padrão "Manter Coleção" Capítulo 13 Implementação o Caso de Uso UC004 Registrar Proventos e Descontos! - Analisando a Especificação Analisando o estereótipo do Caso de Uso da especificação

Leia mais

Como já foi muito bem detalhado no Capítulo IV, o jcompany Developer Suite pode ser

Como já foi muito bem detalhado no Capítulo IV, o jcompany Developer Suite pode ser A1Criando um módulo de negócio Capítulo 27 Aplicação dividida em módulos - Introdução Como já foi muito bem detalhado no Capítulo IV, o jcompany Developer Suite pode ser compreendido como uma solução de

Leia mais

Aula 5. Carlos Eduardo de Carvalho Dantas (carloseduardocarvalhodantas@gmail.com)

Aula 5. Carlos Eduardo de Carvalho Dantas (carloseduardocarvalhodantas@gmail.com) Persistência com JDBC e JPA Aula 5 Carlos Eduardo de Carvalho Dantas (carloseduardocarvalhodantas@gmail.com) Quem é sábio procura aprender, mas os tolos estão satisfeitos com a sua própria ignorância..

Leia mais

UFG - Instituto de Informática

UFG - Instituto de Informática UFG - Instituto de Informática Curso: Engenharia de Software Arquitetura de Software Prof.: Fabrízzio A A M N Soares professor.fabrizzio@gmail.com Aula 12 Consultas JPQL Consultas JPQL Consultas em JPQL

Leia mais

O uso de exceções permite separar a detecção da ocorrência de uma situação excepcional do seu tratamento, ao se programar um método em Java.

O uso de exceções permite separar a detecção da ocorrência de uma situação excepcional do seu tratamento, ao se programar um método em Java. Exceções em Java Miguel Jonathan DCC/IM/UFRJ (rev. abril de 2011) Resumo dos conceitos e regras gerais do uso de exceções em Java O uso de exceções permite separar a detecção da ocorrência de uma situação

Leia mais

Engenharia de Softwares e Sistema IF682 (2012.1) Bruno Medeiros(bmo@cin.ufpe.br)

Engenharia de Softwares e Sistema IF682 (2012.1) Bruno Medeiros(bmo@cin.ufpe.br) Engenharia de Softwares e Sistema IF682 (2012.1) Bruno Medeiros(bmo@cin.ufpe.br) Algumas definições Engenharia de Software conjunto de tecnologias e práticas usadas para construir software de qualidade

Leia mais

ARQUITETURA SISGRAD. Manual de Utilização. Versão: 2.0. Criação: 05 de julho de 2007 Autor: André Penteado

ARQUITETURA SISGRAD. Manual de Utilização. Versão: 2.0. Criação: 05 de julho de 2007 Autor: André Penteado ARQUITETURA SISGRAD Manual de Utilização Versão: 2.0 Criação: 05 de julho de 2007 Autor: André Penteado Última Revisão: 09 de outubro de 2009 Autor: Alessandro Moraes Controle Acadêmico - Arquitetura SISGRAD

Leia mais

Desenvolvendo Aplicações Web com NetBeans

Desenvolvendo Aplicações Web com NetBeans Desenvolvendo Aplicações Web com NetBeans Aula 3 Cap. 4 Trabalhando com Banco de Dados Prof.: Marcelo Ferreira Ortega Introdução O trabalho com banco de dados utilizando o NetBeans se desenvolveu ao longo

Leia mais

Módulo 5 JPATransaction Camadas Turma Turma TurmaBC .business @BusinessController TurmaBC TurmaBC TurmaBC

Módulo 5 JPATransaction Camadas Turma Turma TurmaBC .business @BusinessController TurmaBC TurmaBC TurmaBC Módulo 5 No módulo anterior adaptamos nosso projeto para persistir as informações no banco de dados utilizando as facilidades da extensão demoiselle-jpa. Experimentamos o controle transacional do Framework

Leia mais

Hibernate. Mapeamento O/R Marcio Aguiar Ribeiro aguiar.marcio@gmail.com

Hibernate. Mapeamento O/R Marcio Aguiar Ribeiro aguiar.marcio@gmail.com Hibernate Mapeamento O/R Marcio Aguiar Ribeiro aguiar.marcio@gmail.com Hibernate O que é? Ferramenta para mapeamento O/R em Java Uma das mais difundidas Transparência Independência quanto ao tipo de base

Leia mais

Estudo de Caso Sistema de Caixa Automático

Estudo de Caso Sistema de Caixa Automático Estudo de Caso Sistema de Caixa Automático Curso de Especialização DEINF - UFMA Desenvolvimento Orientado a Objetos Prof. Geraldo Braz Junior Referências: Notas de Aula Ulrich Schiel Notas de Aula Ariadne

Leia mais

Padrão "Arquivo Anexado"

Padrão Arquivo Anexado 6Implementando a Inclusão Padrão "Arquivo Anexado" Capítulo 9 - Prosseguindo na Implementação de UC002 Manter Funcionário! - Introdução No capítulo anterior, implementamos a manutenção de toda a Agregação

Leia mais

Persistência de Dados em Java com JPA e Toplink

Persistência de Dados em Java com JPA e Toplink Persistência de Dados em Java com JPA e Toplink Vinicius Teixeira Dallacqua Curso de Tecnologia em Sistemas para Internet Instituto Federal de Educação, Ciência e Tecnologia - IFTO AE 310 Sul, Avenida

Leia mais

Histórico de revisões

Histórico de revisões Apostila 3 Histórico de revisões Data Versão Descrição Autor 30/09/2011 1.0 Criação da primeira versão HEngholmJr CONTEÚDO Exclusão de registros Consultas por Dados de Resumo Group by / Having Funções

Leia mais

Lidando de Forma Eficiente com Validações Locais de Objetos

Lidando de Forma Eficiente com Validações Locais de Objetos Lidando de Forma Eficiente com Validações Locais de Objetos Aprenda a construir um mini-framework para validar objetos locais sem afetar a complexidade do código. Autor Paulo César M. N. A. Coutinho (pcmnac@gmail.com):

Leia mais

Conectando Bancos de Dados Microsoft Access no BrOffice.org Base. fornecido pelo Projeto de Documentação do BrOffice.org

Conectando Bancos de Dados Microsoft Access no BrOffice.org Base. fornecido pelo Projeto de Documentação do BrOffice.org Conectando Bancos de Dados Microsoft Access no BrOffice.org Base fornecido pelo Projeto de Documentação do BrOffice.org Índice 1 Introdução...2 1.1 Versão... 2 1.2 Licenciamento...2 1.3 Mensagem do Projeto

Leia mais

Conteúdo. Disciplina: INF 02810 Engenharia de Software. Monalessa Perini Barcellos. Centro Tecnológico. Universidade Federal do Espírito Santo

Conteúdo. Disciplina: INF 02810 Engenharia de Software. Monalessa Perini Barcellos. Centro Tecnológico. Universidade Federal do Espírito Santo Universidade Federal do Espírito Santo Centro Tecnológico Departamento de Informática Disciplina: INF 02810 Prof.: (monalessa@inf.ufes.br) Conteúdo 1. Introdução 2. Processo de Software 3. Gerência de

Leia mais

NOVIDADES DO JAVA PARA PROGRAMADORES C

NOVIDADES DO JAVA PARA PROGRAMADORES C PROGRAMAÇÃO SERVIDOR EM SISTEMAS WEB NOVIDADES DO JAVA PARA PROGRAMADORES C Prof. Dr. Daniel Caetano 2012-1 Objetivos Apresentar o Conceito de Classes e Objetos Capacitar para a criação de objetos simples

Leia mais

DESENVOLVIMENTO DE SOFTWARE

DESENVOLVIMENTO DE SOFTWARE VARIAÁ VEL Antes de iniciarmos os comandos referentes a Banco de Dados, precisamos de uma breve descrição técnica sobre Variáveis que serão uma constante em programação seja qual for sua forma de leitura.

Leia mais

UFG - Instituto de Informática

UFG - Instituto de Informática UFG - Instituto de Informática Especialização em Desenvolvimento de Aplicações Web com Interfaces Ricas EJB 3.0 Prof.: Fabrízzio A A M N Soares professor.fabrizzio@gmail.com Aula 10 Persistência de Dados

Leia mais

Persistindo dados com TopLink no NetBeans

Persistindo dados com TopLink no NetBeans Persistindo dados com TopLink no NetBeans O que é TopLink? O TopLink é uma ferramenta de mapeamento objeto/relacional para Java. Ela transforma os dados tabulares de um banco de dados em um grafo de objetos

Leia mais

JPA: Persistência padronizada em Java

JPA: Persistência padronizada em Java JPA: Persistência padronizada em Java FLÁVIO HENRIQUE CURTE Bacharel em Engenharia de Computação flaviocurte.java@gmail.com Programação Orientada a Objetos X Banco de Dados Relacionais = Paradigmas diferentes

Leia mais

1.6. Tratamento de Exceções

1.6. Tratamento de Exceções Paradigmas de Linguagens I 1 1.6. Tratamento de Exceções Uma exceção denota um comportamento anormal, indesejado, que ocorre raramente e requer alguma ação imediata em uma parte do programa [GHE 97, DER

Leia mais

Há várias práticas e abordagens que facilitam a separação de responsabilidades, como veremos nos próximos tópicos.

Há várias práticas e abordagens que facilitam a separação de responsabilidades, como veremos nos próximos tópicos. Há várias práticas e abordagens que facilitam a separação de responsabilidades, como veremos nos próximos tópicos. 4.2. Gerencie suas dependências através de injeção Mesmo com o baixo acoplamento haverá

Leia mais

PHP Profissional. Alexandre Altair de Melo Mauricio G. F. Nascimento

PHP Profissional. Alexandre Altair de Melo Mauricio G. F. Nascimento PHP Profissional APRENDA A DESENVOLVER SISTEMAS PROFISSIONAIS ORIENTADOS A OBJETOS COM PADRÕES DE PROJETO Alexandre Altair de Melo Mauricio G. F. Nascimento Novatec Sumário Agradecimentos...13 Sobre os

Leia mais

No artigo anterior explicamos. Desenvolvimento de Software Dirigido por Caso de Uso. Parte II: Especificando Caso de Uso

No artigo anterior explicamos. Desenvolvimento de Software Dirigido por Caso de Uso. Parte II: Especificando Caso de Uso Desenvolvimento de Software Dirigido por Caso de Uso Parte II: Especificando Caso de Uso Vinicius Lourenço de Sousa viniciuslsousa@gmail.com Atua no ramo de desenvolvimento de software há mais de 10 anos,

Leia mais

Autor: Ricardo Francisco Minzé Júnior - ricardominze@yahoo.com.br Desenvolvendo aplicações em camadas com PHP 5.

Autor: Ricardo Francisco Minzé Júnior - ricardominze@yahoo.com.br Desenvolvendo aplicações em camadas com PHP 5. Desenvolvendo aplicações em camadas com PHP 5. Talvez a primeira vista você ache estranha a palavra Camada em programação, mas o que vem a ser Camada? Segundo o dicionário: Camada 1 - Qualquer matéria

Leia mais

Tutorial para atividades do Trabalho Prático da disciplina DCC 603 Engenharia de Software

Tutorial para atividades do Trabalho Prático da disciplina DCC 603 Engenharia de Software Tutorial para atividades do Trabalho Prático da disciplina DCC 603 Engenharia de Software Antes de iniciar o tutorial, baixar os seguintes arquivos da página do Prof. Wilson: Plataforma reutilizável: http://homepages.dcc.ufmg.br/~wilson/praxis/3.0/praxis.zip

Leia mais

Evolução do Design através de Testes e o TDD

Evolução do Design através de Testes e o TDD c a p a Lucas Souza (lucas.souza@caelum.com.br): é bacharel em Engenharia da Computação pela Universidade de Ribeirão Preto, possui a certificação SCJP e trabalha com Java há 4 anos. Atualmente é desenvolvedor

Leia mais

Engenharia de Software I

Engenharia de Software I Engenharia de Software I Rogério Eduardo Garcia (rogerio@fct.unesp.br) Bacharelado em Ciência da Computação Aula 05 Material preparado por Fernanda Madeiral Delfim Tópicos Aula 5 Contextualização UML Astah

Leia mais

Capítulo 13. Encapsulamento. Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Capítulo 13. Encapsulamento. Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Capítulo 13 Encapsulamento Objetivos do Capítulo Indicar a importância do mecanismo de encapsulamento no contexto do desenvolvimento de software utilizando a programação orientada a objetos. Apresentar

Leia mais

CONCURSO PÚBLICO EDITAL N o 135/2011 FUNÇÃO: ANALISTA DE INFORMÁTICA ÁREA DE DESENVOLVIMENTO DE SISTEMAS (NOME COMPLETO EM LETRA DE FORMA) INSTRUÇÕES

CONCURSO PÚBLICO EDITAL N o 135/2011 FUNÇÃO: ANALISTA DE INFORMÁTICA ÁREA DE DESENVOLVIMENTO DE SISTEMAS (NOME COMPLETO EM LETRA DE FORMA) INSTRUÇÕES UNIVERSIDADE ESTADUAL DE PONTA GROSSA COMISSÃO PERMANENTE DE SELEÇÃO CONCURSO PÚBLICO EDITAL N o 135/2011 FUNÇÃO: ANALISTA DE INFORMÁTICA ÁREA DE DESENVOLVIMENTO DE SISTEMAS (NOME COMPLETO EM LETRA DE

Leia mais

Classes de Entidades Persistentes JDB

Classes de Entidades Persistentes JDB Classes de Entidades Persistentes JDB Brasil, Natal-RN, 07 de setembro de 2011 Welbson Siqueira Costa www.jdbframework.com Nota de Retificação: em 11/12/2011 a Listagem 3 desse tutorial sofreu uma pequena

Leia mais

Universidade Federal de Viçosa CPD - Central de Processamento de Dados Divisão de Desenvolvimento de Sistemas

Universidade Federal de Viçosa CPD - Central de Processamento de Dados Divisão de Desenvolvimento de Sistemas Universidade Federal de Viçosa CPD - Central de Processamento de Dados Divisão de Desenvolvimento de Sistemas Manual de padrões e convenções para desenvolvimento de sistemas PHP Versão Conteúdo 1.

Leia mais

Documentação Usando o Javadoc

Documentação Usando o Javadoc Documentação Usando o Javadoc Prof. MSc. João Carlos Pinheiro jcpinheiro@cefet-ma.br Versão 2.1 Última Atualização: 04/2005 1 Comentários e Documentação Comentários em Java Existem três tipos de comentários

Leia mais

Tópicos em Engenharia de Computação

Tópicos em Engenharia de Computação Tópicos em Engenharia de Computação Introdução / Revisão UML e POO (JAVA) Prof. Ivan Prof. Zagari UML Linguagem Unificada. Não é metodologia, processo ou método. Versão atual 2.0 3 categorias de Diagramas

Leia mais

Framework utilizando reflexão e aspectos para persistência de objetos em java

Framework utilizando reflexão e aspectos para persistência de objetos em java Framework utilizando reflexão e aspectos para persistência de objetos em java Antonio Carlos Rolloff (UNIPAR) acrolloff@gmail.com Arthur Cattaneo Zavadski (UNIPAR) arthur@datacoper.com.br Maria Aparecida

Leia mais

Reuso com Herança a e Composiçã

Reuso com Herança a e Composiçã Java 2 Standard Edition Reuso com Herança a e Composiçã ção Helder da Rocha www.argonavis.com.br 1 Como aumentar as chances de reuso Separar as partes que podem mudar das partes que não mudam. Exemplo:

Leia mais

ruirossi@ruirossi.pro.br

ruirossi@ruirossi.pro.br Persistência Com JPA & Hibernate Rui Rossi dos Santos ruirossi@ruirossi.pro.br Mediador: Rui Rossi dos Santos Slide 1 Mapeamento Objeto-Relacional Contexto: Linguagem de programação orientada a objetos

Leia mais

ENGENHARIA DE SOFTWARE Prof. Ricardo Rodrigues Barcelar http://www.ricardobarcelar.com.br

ENGENHARIA DE SOFTWARE Prof. Ricardo Rodrigues Barcelar http://www.ricardobarcelar.com.br - MÓDULO 3 - MODELAGEM DE SISTEMAS ORIENTADA A OBJETOS COM UML 1. INTRODUÇÃO A partir de 1980, diversos métodos de desenvolvimento de sistemas surgiram para apoiar o paradigma orientado a objetos com uma

Leia mais

Unidade 9: Middleware JDBC para Criação de Beans

Unidade 9: Middleware JDBC para Criação de Beans Programação Servidor para Sistemas Web 1 Unidade 9: Middleware JDBC para Criação de Beans Implementando MVC Nível 1 Prof. Daniel Caetano Objetivo: Preparar o aluno para construir classes de entidade com

Leia mais

Exercícios de Revisão Java Básico

Exercícios de Revisão Java Básico Exercícios de Revisão Java Básico (i) Programação básica (estruturada) 1) Faça um programa para calcular o valor das seguintes expressões: S 1 = 1 1 3 2 5 3 7 99... 4 50 S 2 = 21 50 22 49 23 48...250 1

Leia mais

Padrões de Contagem de Pontos de Função

Padrões de Contagem de Pontos de Função Padrões de Contagem de Pontos de Função Contexto Versão: 1.0.0 Objetivo O propósito deste documento é apresentar os padrões estabelecidos para utilização da técnica de Análise de Pontos de Função no ambiente

Leia mais

CURSO DESENVOLVEDOR JAVA WEB E FLEX Setembro de 2010 à Janeiro de 2011

CURSO DESENVOLVEDOR JAVA WEB E FLEX Setembro de 2010 à Janeiro de 2011 CURSO DESENVOLVEDOR JAVA WEB E FLEX Setembro de 2010 à Janeiro de 2011 O curso foi especialmente planejado para os profissionais que desejam trabalhar com desenvolvimento de sistemas seguindo o paradigma

Leia mais

Java e Banco de Dados: JDBC, Hibernate e JPA

Java e Banco de Dados: JDBC, Hibernate e JPA Java e Banco de Dados: JDBC, Hibernate e JPA 1 Objetivos Apresentar de forma progressiva as diversas alternativas de persistência de dados que foram evoluindo na tecnologia Java, desde o JDBC, passando

Leia mais

Unified Modeling Language UML

Unified Modeling Language UML Unified Modeling Language UML Classe e Objeto Atributo Operação Associações (Delegações [SANTOS, 2003]) Dependência Simples: multiplicidade, papel, navegabilidade Com valor semântico adicional: agregação

Leia mais

CURSO DESENVOLVEDOR JAVA Edição 2009

CURSO DESENVOLVEDOR JAVA Edição 2009 CURSO DESENVOLVEDOR JAVA Edição 2009 O curso foi especialmente planejado para os profissionais que desejam trabalhar com desenvolvimento de sistemas seguindo o paradigma Orientado a Objetos e com o uso

Leia mais

DEFINIÇÃO DE MÉTODOS

DEFINIÇÃO DE MÉTODOS Cursos: Análise, Ciência da Computação e Sistemas de Informação Programação I - Prof. Aníbal Notas de aula 2 DEFINIÇÃO DE MÉTODOS Todo o processamento que um programa Java faz está definido dentro dos

Leia mais

CURSO DESENVOLVEDOR JAVA Edição Intensiva de Férias

CURSO DESENVOLVEDOR JAVA Edição Intensiva de Férias CURSO DESENVOLVEDOR JAVA Edição Intensiva de Férias O curso foi especialmente planejado para os profissionais que desejam trabalhar com desenvolvimento de sistemas seguindo o paradigma Orientado a Objetos

Leia mais

Padrão J2EE Data Access Object (DAO)

Padrão J2EE Data Access Object (DAO) Introdução CRUD DAO Exemplo Padrão J2EE Data Access Object (DAO) Prof. Enzo Seraphim Motivação para usar Componentes precisam acessar e armazenar informações em armazenamento persistente As APIs de armazenamento

Leia mais

É uma forma do engenheiro de requisitos especificar os limites e as funcionalidades do sistema.

É uma forma do engenheiro de requisitos especificar os limites e as funcionalidades do sistema. Definindo o Escopo: Modelo de Caso de Uso Agradei-me, particularmente, da possibilidade de que Joshua estivesse tão preso ao seu modo clássico de pensar que me permitisse realizar o incrível feito de chegar

Leia mais

Prof. Esp. Adriano Carvalho

Prof. Esp. Adriano Carvalho Prof. Esp. Adriano Carvalho Um arquivo contendo uma sequência de comandos em uma linguagem de programação especifica Esses comandosrespeitam regras de como serem escritos e quais são as palavras que podem

Leia mais

Guia de Fatores de Qualidade de OO e Java

Guia de Fatores de Qualidade de OO e Java Qualiti Software Processes Guia de Fatores de Qualidade de OO e Java Versã o 1.0 Este documento só pode ser utilizado para fins educacionais, no Centro de Informática da Universidade Federal de Pernambuco.

Leia mais

3. PARADIGMA ORIENTADO A OBJETOS

3. PARADIGMA ORIENTADO A OBJETOS Paradigmas de Linguagens I 1 3. PARADIGMA ORIENTADO A OBJETOS Este paradigma é o que mais reflete os problemas atuais. Linguagens orientada a objetos (OO) são projetadas para implementar diretamente a

Leia mais

Gabarito - Banco de Dados SQL - 30/07/2013 AULA 01

Gabarito - Banco de Dados SQL - 30/07/2013 AULA 01 Gabarito - Banco de Dados SQL - 30/07/2013 AULA 01 1 1- Bancos de dados compreendem desde agendas telefônicas até sistemas computadorizados. (Sim) 2- Só podemos instalar o SQL Server Express se tivermos

Leia mais

15 Conceitos de Bancos de Dados com o LibreOffice Base

15 Conceitos de Bancos de Dados com o LibreOffice Base Introdução a Informática - 1º semestre AULA 14 Prof. André Moraes Objetivos desta aula: Explorar as propriedades na criação de bancos de dados no LibreOffice Base; Criar e explorar tabelas; Criar e explorar

Leia mais

Especialização em desenvolvimento para web com interfaces ricas. Tratamento de exceções em Java Prof. Fabrízzio A. A. M. N. Soares

Especialização em desenvolvimento para web com interfaces ricas. Tratamento de exceções em Java Prof. Fabrízzio A. A. M. N. Soares Especialização em desenvolvimento para web com interfaces ricas Tratamento de exceções em Java Prof. Fabrízzio A. A. M. N. Soares Objetivos Conceito de exceções Tratar exceções pelo uso de try, catch e

Leia mais

Modelagem OO com UML. Vítor E. Silva Souza (vitorsouza@inf.ufes.br) http://www.inf.ufes.br/ ~ vitorsouza

Modelagem OO com UML. Vítor E. Silva Souza (vitorsouza@inf.ufes.br) http://www.inf.ufes.br/ ~ vitorsouza Modelagem OO com UML Vítor E. Silva Souza (vitorsouza@inf.ufes.br) http://www.inf.ufes.br/ ~ vitorsouza Departamento de Informática Centro Tecnológico Universidade Federal do Espírito Santo Modelos Maneira

Leia mais

A linguagem UML. UML e Diagramas de Casos de Uso e Classes. Por que usar UML? O que é modelagem?

A linguagem UML. UML e Diagramas de Casos de Uso e Classes. Por que usar UML? O que é modelagem? UML e Diagramas de Casos de Uso e Classes Prof. Ms. Luiz Alberto Contato: lasf.bel@gmail.com A linguagem UML UML (Unified Modeling Language) Linguagem de Modelagem Unificada É uma linguagem de modelagem

Leia mais

Pré-requisitos : FIS Implantada, Folha do Mês Finalizada Passo 1 Implantação da FIS

Pré-requisitos : FIS Implantada, Folha do Mês Finalizada Passo 1 Implantação da FIS GEO Pré-requisitos : FIS Implantada, Folha do Mês Finalizada Passo 1 Implantação da FIS FIS Significa Ficha de Implantação de Serviços, e nela podemos inserir de forma bem objetiva os dados do serviço

Leia mais

Projeto de Software Orientado a Objeto

Projeto de Software Orientado a Objeto Projeto de Software Orientado a Objeto Ciclo de Vida de Produto de Software (PLC) Analisando um problema e modelando uma solução Prof. Gilberto B. Oliveira Estágios do Ciclo de Vida de Produto de Software

Leia mais

UML 2.0 Diagrama de casos de uso

UML 2.0 Diagrama de casos de uso Definição UML 2.0 Diagrama de casos de uso Prof. Cesar Augusto Tacla Comunicação entre clientes, usuários e desenvolvedores Funcionalidades oferecidas pelo sistema Exemplo Elementos do diagrama Atores

Leia mais

Dois clientes com a mesma data de pagamento não podem compartilhar instâncias

Dois clientes com a mesma data de pagamento não podem compartilhar instâncias Capítulo 3. Tópicos de Orientação a Objetos correr o risco de cair na armadilha da quebra de encapsulamento e alto acoplamento. Repare que, desta forma, o acoplamento é bem menor, nenhuma das classes precisa

Leia mais

Criando documentação com javadoc

Criando documentação com javadoc H Criando documentação com javadoc H.1 Introdução Neste apêndice, fornecemos uma introdução a javadoc ferramenta utilizada para criar arquivos HTML que documentam o código Java. Essa ferramenta é usada

Leia mais

Aplicações, durante a execução, podem incorrer em muitas espécies de erros de vários graus de severidade Quando métodos são invocados sobre um objeto:

Aplicações, durante a execução, podem incorrer em muitas espécies de erros de vários graus de severidade Quando métodos são invocados sobre um objeto: Tratamento de Exceções Prof. Bruno Gomes bruno.gomes@ifrn.edu.br Programação Orientada a Objetos Exceções Aplicações, durante a execução, podem incorrer em muitas espécies de erros de vários graus de severidade

Leia mais

Manter Agregação Simples

Manter Agregação Simples 6Implementando o Padrão Manter Agregação Simples Capítulo 7 Implementando UC001.2 Manter Unidade Organizacional- - Analisando a especificação A segunda especificação de Caso de Uso que iremos implementar

Leia mais

Banco de Dados. Sérgio Luiz Ruivace Cerqueira sergioruivace@gmail.com

Banco de Dados. Sérgio Luiz Ruivace Cerqueira sergioruivace@gmail.com Banco de Dados Sérgio Luiz Ruivace Cerqueira sergioruivace@gmail.com Roteiro Mapeamento de objetos para modelo relacional Estratégias de persistência Persistência JDBC Mapeando Objetos para o Modelo Relacional

Leia mais

PROJETO DA DISCIPLINA. PES II Processo de Engenharia de Software II

PROJETO DA DISCIPLINA. PES II Processo de Engenharia de Software II UNIOESTE - Universidade Estadual do Oeste do Paraná CCET - Centro de Ciências Exatas e Tecnológicas Colegiado de Informática Curso de Bacharelado em Informática PROJETO DA DISCIPLINA PES II Processo de

Leia mais

Unified Modeling Language UML - Notações

Unified Modeling Language UML - Notações Unified Modeling Language UML - Notações Prof. Ms. Elvio Gilberto da Silva elvio@fmr.edu.br UML Ponto de Vista É gerada com propósito geral de uma linguagem de modelagem visual usada para especificar,

Leia mais

Guia de Modelagem de Casos de Uso

Guia de Modelagem de Casos de Uso Guia de Modelagem de Casos de Uso Sistema de e-commerce de Ações Versão 1.1 1 Histórico da Revisão. Data Versão Descrição Autor 13 de Setembro de 2008 1.0 Criação do documento Antonio Marques 28 de Setembro

Leia mais

sobre rogério gonçalves gerente de projetos > digitale agência digital rogerio@digitale.com.br h7p://www.digitale.com.br h7p://leveme.

sobre rogério gonçalves gerente de projetos > digitale agência digital rogerio@digitale.com.br h7p://www.digitale.com.br h7p://leveme. sobre rogério gonçalves gerente de projetos > digitale agência digital rogerio@digitale.com.br h7p://www.digitale.com.br h7p://leveme.la/rogerio definição - é uma forma de programar e organizar um sistema

Leia mais

INDICE 3.APLICAÇÕES QUE PODEM SER DESENVOLVIDAS COM O USO DO SAXES

INDICE 3.APLICAÇÕES QUE PODEM SER DESENVOLVIDAS COM O USO DO SAXES w w w. i d e a l o g i c. c o m. b r INDICE 1.APRESENTAÇÃO 2.ESPECIFICAÇÃO DOS RECURSOS DO SOFTWARE SAXES 2.1. Funcionalidades comuns a outras ferramentas similares 2.2. Funcionalidades próprias do software

Leia mais

ADMINISTRAÇÃO DE BANCO DE DADOS

ADMINISTRAÇÃO DE BANCO DE DADOS ADMINISTRAÇÃO DE BANCO DE DADOS ARTEFATO 03 AT03 Diversos II Page 1 of 25 Indice EXEMPLOS COM GROUP BY E COM A CLÁUSULA HAVING - TOTALIZANDO DADOS... 3 GROUP BY... 3 Cláusula HAVING com GROUP BY... 5 ENTENDENDO

Leia mais

Orientação a Objetos

Orientação a Objetos 1. Domínio e Aplicação Orientação a Objetos Um domínio é composto pelas entidades, informações e processos relacionados a um determinado contexto. Uma aplicação pode ser desenvolvida para automatizar ou

Leia mais

4 Criação de macros e introdução à linguagem VBA

4 Criação de macros e introdução à linguagem VBA 4 Criação de macros e introdução à linguagem VBA Vinicius A. de Souza va.vinicius@gmail.com São José dos Campos, 2011. 1 Sumário Tópicos em Microsoft Excel 2007 Introdução à criação de macros...3 Gravação

Leia mais

INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DE ALAGOAS CURSO TECNICO EM INFORMATICA DISCIPLINA:

INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DE ALAGOAS CURSO TECNICO EM INFORMATICA DISCIPLINA: INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DE ALAGOAS CURSO TECNICO EM INFORMATICA DISCIPLINA: PROGRAMAÇÃO ORIENTADA A OBJETOS PROFESSOR: REINALDO GOMES ASSUNTO: REVISÃO DA INTRODUÇÃO A ORIENTAÇÃO

Leia mais

ANÁLISE DE PONTOS DE FUNÇÃO. Análise de Pontos de Função (APF) Análise de Pontos de Função (APF) @ribeirord @RIBEIRORD

ANÁLISE DE PONTOS DE FUNÇÃO. Análise de Pontos de Função (APF) Análise de Pontos de Função (APF) @ribeirord @RIBEIRORD ANÁLISE DE PONTOS DE FUNÇÃO @RIBEIRORD Análise de Pontos de Função (APF) É uma técnica de medição das funcionalidades fornecidas por um software do ponto de vista de seus usuários. Ponto de função (PF)

Leia mais

Curso Java Starter. www.t2ti.com 1

Curso Java Starter. www.t2ti.com 1 1 Apresentação O Curso Java Starter foi projetado com o objetivo de ajudar àquelas pessoas que têm uma base de lógica de programação e desejam entrar no mercado de trabalho sabendo Java, A estrutura do

Leia mais

RELACIONAMENTOS ENTRE OS OBJETOS NO FRAMEWORK HIBERNATE Elio Lovisi Filho 1 Ronney Moreira de Castro 2 RESUMO

RELACIONAMENTOS ENTRE OS OBJETOS NO FRAMEWORK HIBERNATE Elio Lovisi Filho 1 Ronney Moreira de Castro 2 RESUMO Revista Eletrônica da Faculdade Metodista Granbery http://re.granbery.edu.br - ISSN 1981 0377 Curso de Sistemas de Informação - N. 10, JAN/JUN 2011 RELACIONAMENTOS ENTRE OS OBJETOS NO FRAMEWORK HIBERNATE

Leia mais

Programação Orientada a Objetos Prof. Rone Ilídio UFSJ/CAP

Programação Orientada a Objetos Prof. Rone Ilídio UFSJ/CAP Programação Orientada a Objetos Prof. Rone Ilídio UFSJ/CAP 1) Introdução Programação Orientada a Objetos é um paradigma de programação bastante antigo. Entretanto somente nos últimos anos foi aceito realmente

Leia mais

MANUAL DE IMPLANTAÇÃO SISTEMA E.R.P. BUSINESS MILLENNIUM SOFTWARE DE CONTROLE GERENCIAL E FINANCEIRO

MANUAL DE IMPLANTAÇÃO SISTEMA E.R.P. BUSINESS MILLENNIUM SOFTWARE DE CONTROLE GERENCIAL E FINANCEIRO 1 MANUAL DE IMPLANTAÇÃO SISTEMA E.R.P. BUSINESS MILLENNIUM SOFTWARE DE CONTROLE GERENCIAL E FINANCEIRO Versão Janeiro /2009 Nossa Missão: Inovar e Criar para superar as expectativas do nosso cliente, com

Leia mais

Web-Services com JAX-WS. Capítulo. Introdução aos Web-Services via JAX-WS. - Um breve histórico sobre Web-Services. - SOAP x REST. Provendo um Serviço

Web-Services com JAX-WS. Capítulo. Introdução aos Web-Services via JAX-WS. - Um breve histórico sobre Web-Services. - SOAP x REST. Provendo um Serviço A1Provendo e Consumindo Web-Services com JAX-WS Capítulo 22 Introdução aos Web-Services via JAX-WS - Um breve histórico sobre Web-Services Os Web-Services são uma tecnologia popular para apoiar iniciativas

Leia mais

A Linguagem Java. Alberto Costa Neto DComp - UFS

A Linguagem Java. Alberto Costa Neto DComp - UFS A Linguagem Java Alberto Costa Neto DComp - UFS 1 Roteiro Comentários Variáveis Tipos Primitivos de Dados Casting Comandos de Entrada e Saída Operadores Constantes 2 Comentários /** Classe para impressão

Leia mais

SISTEMAS DE BANCO DE DADOS. Prof. Adriano Pereira Maranhão

SISTEMAS DE BANCO DE DADOS. Prof. Adriano Pereira Maranhão SISTEMAS DE BANCO DE DADOS Prof. Adriano Pereira Maranhão 1 REVISÃO BANCO DE DADOS I O que é banco de dados? Ou seja afinal o que é um SGBD? REVISÃO BD I REVISÃO DE BD I Um Sistema de Gerenciamento de

Leia mais

8VDQGR5HSRUW0DQDJHUFRP&ODULRQH3RVWJUH64/ -XOLR&HVDU3HGURVR 8VDQGRSDUkPHWURV

8VDQGR5HSRUW0DQDJHUFRP&ODULRQH3RVWJUH64/ -XOLR&HVDU3HGURVR 8VDQGRSDUkPHWURV 8VDQGRSDUkPHWURV O envio de parâmetros para um relatório é uma das funções mais úteis do Report Manager, com eles você pode: Permitir que o usuário final altere palavras ou sentenças de um relatório; Atribuir

Leia mais

Diagramas de Casos de Uso

Diagramas de Casos de Uso Diagramas de Casos de Uso Não diga pouco em muitas palavras, mas sim, muito em poucas. Pitágoras Casos de uso O modelo de casos de uso modela os requisitos funcionais do sistema. É uma técnica de modelagem

Leia mais

PROGRAMAÇÃO ORIENTADA A OBJETOS -TRATAMENTO DE EXCEÇÕES. Prof. Angelo Augusto Frozza, M.Sc. frozza@ifc-camboriu.edu.br

PROGRAMAÇÃO ORIENTADA A OBJETOS -TRATAMENTO DE EXCEÇÕES. Prof. Angelo Augusto Frozza, M.Sc. frozza@ifc-camboriu.edu.br PROGRAMAÇÃO ORIENTADA A OBJETOS -TRATAMENTO DE EXCEÇÕES Prof. Angelo Augusto Frozza, M.Sc. frozza@ifc-camboriu.edu.br ROTEIRO 5. Tratamento de Exceções Introdução e conceitos Capturando exceção usando

Leia mais

NOVO PROCESSO DE CENTRO DE CUSTO DO WINTHOR

NOVO PROCESSO DE CENTRO DE CUSTO DO WINTHOR NOVO PROCESSO DE CENTRO DE CUSTO DO WINTHOR Todos os direitos reservados. PC Sistemas 1.0 - Data: 28/08/2012 Página 1 de 47 Sumário Apresentação... 4 1. PROCEDIMENTOS INICIAIS... 5 1.1. Realizar Atualizações...

Leia mais

PROJETO PEDAGÓGICO DE CURSOS

PROJETO PEDAGÓGICO DE CURSOS 1 de 6 PROJETO PEDAGÓGICO DE CURSOS BURITREINAMENTOS MANAUS-AM MARÇO / 2015 2 de 6 PACOTES DE TREINAMENTOS BURITECH A Buritech desenvolveu um grupo de pacotes de treinamentos, aqui chamados de BuriPacks,

Leia mais

Como criar um EJB. Criando um projeto EJB com um cliente WEB no Eclipse

Como criar um EJB. Criando um projeto EJB com um cliente WEB no Eclipse Como criar um EJB Criando um projeto EJB com um cliente WEB no Eclipse Gabriel Novais Amorim Abril/2014 Este tutorial apresenta o passo a passo para se criar um projeto EJB no Eclipse com um cliente web

Leia mais

Faculdade Lourenço Filho - ENADE 2011-1

Faculdade Lourenço Filho - ENADE 2011-1 1. Quando se constrói um banco de dados, define-se o modelo de entidade e relacionamento (MER), que é a representação abstrata das estruturas de dados do banco e seus relacionamentos. Cada entidade pode

Leia mais

Java Persistence API. Entity Entity Campos e Propriedades Entity Chaves Primárias Entity Associações

Java Persistence API. Entity Entity Campos e Propriedades Entity Chaves Primárias Entity Associações Java Persistence API Entity Entity Campos e Propriedades Entity Chaves Primárias Entity Associações Entity Manager Entity Manager API Java Persistence Query Language (JPQL) Persistence Units 1 Java Persistence

Leia mais

(UFF) JDBC (I) TEPIS II

(UFF) JDBC (I) TEPIS II Aula 20: JDBC (I) Diego Passos Universidade Federal Fluminense Técnicas de Projeto e Implementação de Sistemas II Diego Passos (UFF) JDBC (I) TEPIS II 1 / 33 JDBC: Introdução Especificação que provê acesso

Leia mais

Modelagem e Implementação (Incremental de um Software para Controle) de Aquário de Peixes

Modelagem e Implementação (Incremental de um Software para Controle) de Aquário de Peixes Modelagem e Implementação de Aquário de Peixes- por Jorge Fernandes - Página 1 Modelagem e Implementação (Incremental de um Software para Controle) de Aquário de Peixes Jorge Fernandes Natal, Agosto de

Leia mais

UML Aspectos de projetos em Diagramas de classes

UML Aspectos de projetos em Diagramas de classes UML Aspectos de projetos em Diagramas de classes Após ser definido o contexto da aplicação a ser gerada. Devemos pensar em detalhar o Diagrama de Classes com informações visando uma implementação Orientada

Leia mais

Princípios de Análise e Projeto de Sistemas com UML

Princípios de Análise e Projeto de Sistemas com UML Princípios de Análise e Projeto de Sistemas com UML 2ª edição Eduardo Bezerra Editora Campus/Elsevier Capítulo 7 Modelagem de Interações Somente após a construção de diagramas de interação para os cenários

Leia mais