Aula 3: Desacoplamento 2ª. Parte
|
|
|
- Marcelo Fortunato de Paiva
- 10 Há anos
- Visualizações:
Transcrição
1 Aula 3: Desacoplamento 2ª. Parte Na última aula, nós falamos a respeito da importância das dependências entre as partes do programa em um projeto de software. Uma boa linguagem de programação permite a você expressar as dependências entre as partes, além de controlá-las prevenindo o surgimento de dependências não planejadas. Nesta aula, nós vamos demonstrar os aspectos do Java que podem ser utilizados para expressar e controlar dependências. Vamos estudar também uma variedade de soluções para um problema simples de programação, ilustrando com ênfase o papel das interfaces. 3.1 Revisão: Diagrama de Dependências Modular Vamos começar com uma breve revisão do diagrama de dependência modular (MDD) da última aula. Um MDD mostra dois tipos de partes de programas: partes de implementação (classes em Java) exibidas como retângulos com uma única faixa no topo, e as partes de especificação exibidas como retângulos com faixas tanto no topo quanto na parte de baixo. A organização das partes em agrupamentos (tal como packages 1, ou pacotes, em Java) pode ser expressa no MDD através de contornos englobando as partes do programa. Assim como definido pelo estilo de diagrama denominado Venn-diagramstyle. UmaflechaplanacomapontaabertaconectaumapartedeimplementaçãoA com uma parte de especificação S, e expressa que o significado de A depende do significado de S. Isto, pois a especificação S não pode, por si só, ter um significado dependente de outras partes, o que garante que o significado de uma parte pode ser determinado a partir da própria parte e da especificação da qual ela depende, não sendo necessário quaisquer outras informações. Uma flecha pontilhada de A para S significa uma dependência fraca; ela expressa que A depende apenas da existência de uma parte que satisfaça à especificação S, mas que, na verdade, não possui dependência de nenhum detalhe de S. Uma flecha com a ponta fechada de uma parte de implementação A para uma parte de especificação S expressa que A satisfaz S; seu significado está em conformidade com o significado de S. Graças ao fato de que as especificações são tão essenciais, nós iremos sempre assumir que elas estão presentes. Na maioria das vezes, nós não iremos desenhar partes de especificação explicitamente, portanto, uma flecha de dependência entre duas partes A e B deve ser interpretada como uma dependência de A para a especificação de B, e como uma flecha de conformidade de B para sua especificação. Nós iremos demonstrar as interfaces do Java como partes de especificação explicitamente. 1 O termo package será utilizado como sinônimo de pacote com a intenção de se criar familiaridade com os termos da linguagem Java. 30
2 3.2 Java Namespace Como qualquer grande trabalho escrito, um programa se beneficia de uma organização estrutural hierárquica. Quando se tenta compreender uma grande estrutura, é sempre útil observá-la de baixo para cima, iniciando-se com os níveis mais grosseiros da estrutura e procedendo-se para níveis mais e mais detalhados. O sistema de nomes do Java suporta esta estrutura hierárquica. E promove também um outro importante benefício. Componentes diferentes podem usar os mesmos nomes para seus subcomponentes, com distintos significados locais. No contexto do sistema como um todo, os subcomponentes terão nomes que são determinados pelos componentes dos quais eles pertencem, evitando confusões. Isto é vital, pois permite aos desenvolvedores trabalharem independentemente sem se preocupar com conflitos de nomes. Agora apresentaremos como o sistema de nomes do Java funciona. Os componentes principais são as classes e as interfaces, que possuem designações de nomes de métodos e de nomes de campos. Variáveis locais (dentro de métodos) e argumentos de métodos também são designados. Cada nome em um programa Java possui um escopo, ou abrangência: uma porção do texto do programa dentro da qual aquele nome é válido e atado àquele componente. Argumentos de métodos, por exemplo, têm o escopo do método; campos têm o escopo da classe, e às vezes um escopo ainda maior. O mesmo nome pode ser usado para referenciar coisas diferentes quando não há ambigüidade. Por exemplo, é possível utilizar-se o mesmo nome para um campo, um método e uma classe; consulte a especificação (spec) da linguagem Java para obter exemplos. Um programa Java é organizado em packages, ou pacotes. Cada classe ou interface possui seu próprio arquivo (desconsiderando-se inner classes, ou classes internas, que não serão discutidas). Os packages refletem a estrutura de diretórios. Da mesma forma que diretórios, packages podem ser aninhados em estruturas de profundidades arbitrárias. Para organizar seu código em packages, você deve fazer duas coisas: primeiro, você indica no topo de cada arquivo a quais packages esta classe ou interface pertence e, segundo, você organiza os arquivos fisicamente em uma estrutura de diretórios de forma que eles estejam de acordo com a estrutura dos packages. Por exemplo, a classe dnj.browser.protocol seria um arquivo chamado Protocol.java no diretório dnj/browser. Pode-se demonstrar esta estrutura no nosso diagrama de dependências. As classes e interfaces formam as partes entre as quais as dependências são esquematizadas. Packages são mostrados como contornos englobando estas classes e interfaces. Às vezes é conveniente esconder as dependências exatas entre as partes de diferentes packages e apenas mostrar um arco de dependência no nível dos packages. Uma dependência de um package significa que alguma classe ou interface (podem ser várias) daquele package possui uma dependência; uma dependência sobre um package significa 31
3 uma dependência de uma classe ou interface (podem ser várias também) que pertence àquele package. 3.3 Controle de Acesso Os controles de acesso do Java permitem que se controlem as dependências. No texto de uma classe, é possível indicar quais outras classes podem ter dependências sobre ela, desta forma, é possível, até certo grau, controlar a natureza das dependências. Uma classe declarada como public pode ser referenciada por quaisquer outras classes; do contrário, ela só pode ser referenciada por classes dentro do mesmo package. Portanto, através deste modificador podemos evitar dependências de qualquer outra classe que pertença a outro package. Membros de uma classe isto é, seus campos e métodos podem ser marcados como public, private ou protected. Um membro public pode ser acessado de qualquer lugar. Um membro private só pode ser acessado de dentro da classe onde é declarado. Um membro protected pode ser acessado de dentro do package, ou de fora do package por uma subclasse 2 da classe onde o membro é declarado criando, portanto, um efeito há muito conhecido de que um membro protected émais acessível, ao invés de menos acessível, como a idéia de proteção presume. Recorde-se que uma dependência de A sobre B significa uma dependência de A sobre a especificação de B. O uso de métodos modificadores entre os membros de B nos permitem controlar a natureza das dependências ao alterar-se quais membros pertencem à especificação de B. O controle do acesso aos campos de B é uma ajuda para se alcançar independência de representação, mas nem sempre uma garantia (como veremos adiante no curso). 2 O termo subclasse, utilizado no decorrer do texto, refere-se à prática de derivação de classes da programação orientada a objetos. 32
4 3.4 Linguagens Seguras Uma propriedade chave de um programa é a de que uma parte só deveria depender de outra se o fizermos explicitamente referenciando a outra parte através de seu nome. Isto parece óbvio, mas, de fato, esta é uma característica válida apenas para as chamadas linguagens de programação seguras. Em linguagens não seguras, o texto em uma parte pode afetar o comportamento de outra sem que nomes sejam compartilhados. Isto nos leva aos chamados bugs traiçoeiros que são dificílimos de se detectar, e que podem ocasionar efeitos desastrosos e imprevisíveis. Veja como eles surgem. Considere um programa escrito em C no qual um módulo (em C é apenas um arquivo) faz a atualização de um array. Uma tentativa de se definir o valor de um elemento de um array além de seus limites às vezes irá falhar, pois causa uma violação de memória, atingindo uma área de memória além daquela definido para o processo. Mas, infelizmente, na maioria das vezes isso irá funcionar, e o resultado será a escrita de um pedaço arbitrário de memória arbitrário, pois o programador não sabe como o compilador alocou a memória do programa, e não pode predizer quais outras estruturas de dados foram afetadas. Como resultado, uma atualização do array a pode afetar o valor de uma estrutura de dados com o nome d, por exemplo, que é declarada em um módulo diferente e que nem mesmo possui um tipo em comum com a. Linguagens seguras controlam estes efeitos através de diversas técnicas combinadas. Checagem dinâmica de limites de arrays previnem o tipo de atualização que acabamos de mencionar; em Java uma exceção seria lançada. O gerenciamento automático de memória garante que a memória não seja liberada e em seguida, erroneamente, utilizada. Ambas as técnicas baseiam-se na idéia fundamental de tipagem forte, que garante que um acesso declarado como sendo um valor de um tipo t no programa texto será sempre um acesso a uma valor do tipo t em tempo de execução. Não há risco de que código projetado para ser utilizado sobre arrays seja aplicado a uma string ou a um inteiro. Linguagens seguras surgiram em Algumas famosas linguagens seguras incluem Algol-60, Pascal, Modula, LISP, CLU, Ada, ML, e agora Java. É interessante notar que por muitos anos a indústria reclamou que os custos da segurança destas linguagens eram muito altos, e que era inviável migrar de linguagens não seguras (como C++) para linguagens seguras (como Java). Java se beneficiou de muita publicidade a respeito de applets, e agora que a linguagem é largamente utilizada, muitas bibliotecas estão disponíveis e existem muitos programadores que conhecem Java, muitas companhias deram o braço a torcer e estão reconhecendo os benefícios de uma linguagem segura. Algumas linguagens seguras garantem a correção de tipagem em tempo de compilação através de tipagem estática. Outras, como Scheme e LISP, realizam sua checagem de tipo em tempo de execução, sendo que seus sistemas de tipagem apenas distinguem os tipos primitivos. Veremos rapidamente como um sistema de tipagem mais expressivo também pode ajudar no 33
5 controle das dependências. Se a confiabilidade é importante, é sábio utilizar uma linguagem segura. Na aula 1 eu contei uma estória sobre o uso de linguagens não seguras em um sistema de raios-x. 3.5 Interfaces Em linguagens com tipagem estática, podem-se controlar dependências através da escolha de tipos. Pode-se dizer que uma classe que menciona apenas objetos do tipo T não pode ter uma dependência de uma classe que possui objetos de um tipo T diferente. Em outras palavras, pode-se deduzir, a partir dos tipos de uma classe, de quais outras classes esta classe depende. No entanto, em linguagens com subtipos (tipos derivados), uma coisa interessante é possível. Suponha que a classe A mencione apenas a classe B. Isto não significa que apenas métodos criados a partir da classe B possam ser chamados. Em Java, os objetos instanciados a partir de uma subclasse C de B são tidos como tendo também o tipo B, assim, mesmo que A não possa criar objetos da classe C diretamente, ela pode acessá-los por intermédio de outra classe. O tipo C édito serumsubtipodotipob, pois um objeto C pode ser utilizado quando um objeto B é aguardado. Isto é chamado substituibilidade, ou seja, a possibilidade de substituir. Na verdade, a prática de se criar subclasses funde dois princípios distintos. Um é a subtipagem: que define que objetos de uma classe C são tidos como tendo tipo compatível com B, por exemplo. O outro é a herança: que define que o código da classe C pode reutilizar o código de B. Mais adiante neste curso iremos discutir algumas das conseqüências infortúnias de se fundir estes dois princípios, e veremos como a substituibilidade nem sempre funciona, como é de se esperar. Por enquanto, iremos focar no mecanismo de subtipagem apenas, pois é o que importa na nossa discussão. O Java provê uma noção de interfaces que proporciona mais flexibilidade na prática da subtipagem do que o uso de subclasses. Uma interface Java é, na nossa terminologia, uma parte de especificação pura. Ela não contém código executável, é utilizada apenas para se alcançar desacoplamento. Veja como funciona. Ao invés de se ter uma classe A dependente de uma classe B, introduz-se uma classe I. Agora, A menciona I ao invés de B, eb deve satisfazer a especificação de I. É claro que o compilador Java não trabalha com especificações comportamentais: ele apenas checa se os tipos dos métodos de B são compatíveis com os tipos declarados em I. Em tempo de execução, toda vez que A estiver aguardando um objeto do tipo I, umobjetodotipob também é aceito. Por exemplo, na biblioteca Java, há uma classe chamada java.util.linkedlist que implementa listas encadeadas. Se você estiver escrevendo código que exige apenas que um objeto seja uma lista, e não necessariamente que seja uma lista encadeada, deve-se utilizar o tipo java.util.list no seu código, o que é uma interface implementada por java.util.linkedlist. Existem outras classes como ArrayList e Vector que implementam esta interface. Desde que seu código refira-se apenas à interface, ele irá funcionar com qualquer uma destas classes de implementação. 34
6 Várias classes podem implementar a mesma interface, e uma classe pode implementar várias interfaces. Pelo contrário, uma classe pode herdar no máximo uma classe. Por causa disso, algumas pessoas utilizam o termo herança de múltipla especificação para descrever a funcionalidade das interfaces do Java, ao contrário da verdadeira herança múltipla na qual pode-se reutilizar código de múltiplas superclasses. Inicialmente, as interfaces trazem dois benefícios. Primeiro, elas permitem que se expressem partes de pura especificação no código, de forma que seja possível garantir que o uso da classe B por uma classe A envolve apenas uma dependência de A para a especificação S, e não em outros detalhes de B. Segundo, as interfaces permitem criar várias partes de implementação que estejam em conformidade com uma única especificação, sendo que a seleção de qual parte de implementação será usada ocorrerá em tempo de execução. 3.6 Exemplo: Instrumentação de um Programa No restante da aula, iremos estudar alguns mecanismos de desacoplamento no contexto de um exemplo que é pequeno, mas que é representativo de uma importante classe de problemas. Suponha que se queiram reportar os passos incrementais de um programa no decorrer de sua execução, exibindo seu progresso linha por linha. Por exemplo, em um compilador com suas diversas etapas, pode-se desejar exibir uma mensagem quando cada etapa começa e termina. Em um cliente de , podemos exibir cada um dos passos envolvidos na tarefa de se fazer o download dos s a partir de um servidor. Este tipo de mecanismo de acompanhamento da execução é útil quando os passos individuais podem levar um longo tempo de execução ou quando são propensos à falha (de forma que o usuário possa cancelar o comando que originou a execução). Barras de progresso são muitas vezes utilizadas neste contexto, mas elas introduzem complicações adicionais com as quais não iremos nos preocupar. Como um exemplo concreto, considere um cliente de que possua um package principal (core) contendo uma classe Session com código projetado para estabelecer uma sessão de comunicação com um servidor e para fazer o download de mensagens, uma classe Folder para os objetos que modelam pastas e seu conteúdo, e uma classe Compactor que contém o código para compactar a representação das pastas no disco. Assuma que há chamadas de Session para Folder e de Folder para Compactor, assuma ainda que as intensas atividades de recursos computacionais que queremos instrumentar ocorrem apenas em Session e Compactor, enãoemfolder. O módulo diagrama de dependência mostra que Session depende de Folder, que possui uma dependência mútua de Compactor. 35
7 Iremos analisar uma variedade de meios para implementar nosso mecanismo de instrumentação, e iremos estudar as vantagens e desvantagens de cada. Começando pelo mais simples, mais ingênuo projeto possível, podemos distribuir sentenças como System.out.println ( Iniciando download ); ao longo do programa Abstração por parametrização O problema com este esquema é óbvio. Quando rodamos o programa em modo batch, podemos redirecionar a saída de dados padrão do programa para um arquivo. Percebemos, então, que isto seria útil para gerar mensagens acrescidas da informação do momento quando elas ocorreram, de maneira que poderíamos mais tarde, quando lermos o arquivo de mensagens, saber quanto tempo durou cada um dos vários passos executados. Desejamos que nossas sentenças sejam da forma System.out.println ( Iniciando download em: + new Date ()); O que deveria ser fácil, mas não é. Temos que procurar todas as sentenças presentes em nosso código (e distinguí-las de outras chamadas a System.out.println destinadas a outros propósitos), e alterar cada uma delas separadamente. É claro, o que deveríamos ter feito é definir um procedimento para encapsular esta funcionalidade. Em Java, seria feito através de um método estático: public class StandardOutReporter { public static void report (String msg) { System.out.println (msg); Agora, a alteração pode ser realizada em um único local no código. Apenas modificamos o 36
8 procedimento para public class StandardOutReporter { public static void report (String msg) { System.out.println (msg + at: + new Date ()); Matthias Felleisen chama isso de princípio do ponto de controle individual. O mecanismo neste caso é um com o qual você deve estar familiar: o curso 6001 o chama de abstração por parametrização, pois cada chamada ao procedimento, tal como StandardOutReporter.report ( Iniciando download ); é uma instância da descrição genérica, com o parametrizador msg atado a um valor particular. Podemos ilustrar o ponto de controle individual em um diagrama de dependência modular. Introduzimos uma única classe da qual as classes que utilizam o mecanismo de instrumentação dependem: StandardOutReporter. Perceba que não há dependência de Folder para StandardOutReporter, pois o código de Folder não faz chamadas para esta outra classe Desacoplamento com Interfaces No entanto, este esquema está bem longe da perfeição. Automatizar a funcionalidade em uma única classe foi uma boa idéia, mas o código ainda possui uma dependência na noção de escrita para a saída de dados padrão. Se quiséssemos criar uma nova versão do nosso sistema com uma interface gráfica de usuário (GUI), precisaríamos substituir esta classe com uma outra contendo o código apropriado para a GUI. Isto significaria alterar todas as referências no package core para uma classe diferente, ou alterar o código da própria classe, e ter que manipular duas versões incompatíveis da 37
9 classe com o mesmo nome. Nenhuma das duas é uma boa opção. De fato, o problema é pior do que isso. Em um programa que utiliza GUI, escreve-se para a GUI através de uma chamada a um método de um objeto que representa parte da interface gráfica: um painel de texto, ou um campo de mensagem. Em Swing, o toolkit de interfaces de usuário do Java, as subclasses de JTextComponent possuem um método settext. Dado um componente JTextComponent representado pela variável outputarea, por exemplo, a sentença de exibição poderia ser: outputarea.settext (msg) Como vamos passar a referência para o componente na posição de chamada (na nova classe StandardOutReporter)? E como vamos fazê-lo sem introduzir código específico do Swing na classe responsável por reportar os progressos da execução do programa? As interfaces Java provêm a solução. Criamos uma interface com um único método para reportar os progressos de execução que será chamado para exibição dos resultados. public interface Reporter { void report (String msg); Agora, acrescentamos a cada método do nosso sistema um argumento deste tipo. A classe Session, por exemplo, pode ter um método download: void download (Reporter r, ) { r.report ( Iniciando download ); Agora definimos uma classe que irá implementar o comportamento do método report. Iremos utilizar a saída de dados padrão como nosso exemplo, por razões de simplicidade: public class StandardOutReporter implements Reporter { public void report (String msg) { System.out.println (msg + at: + new Date ()); 38
10 Esta classe não é a mesma classe que a anterior, e que possuía o mesmo nome. O método não é mais estático, de maneira que podemos instanciar um objeto da classe e chamar o método a partir dele. Além do mais, indicamos que esta classe é uma implementação da interface Reporter. Éclaro, para a saída de dados padrão esta solução não parece ser muito boa, e a criação do objeto implica em um custo computacional. Mas, para o caso da GUI, iremos fazer algo mais elaborado e criar um objeto que esteja atado ao mecanismo JTextComponent em particular. public class JTextComponentReporter implements Reporter { JTextComponent comp; public JTextComponentReporter (JTextComponent c) {comp = c; public void report (String msg) { comp.settext (msg + at: + new Date ()); No topo do programa, iremos criar um objeto e passá-lo: s.download (new StandardOutReporter (), ); Onde s representa uma instância da parte (ou classe) Session. Agora, alcançamos algo interessante. A chamada ao método report executa, em tempo de execução, código que invoca System.out. Mas métodos como o download da classe Session dependem apenas da interface Reporter, que não faz referência a nenhum mecanismo de saída de dados específico. Conseguimos, com sucesso, desacoplar o mecanismo de saída de dados e o programa, quebrando a dependência do núcleo do programa de seus dispositivos de saída de dados (seu I/O). Observe o diagrama de dependência modular. Recorde-se que uma flecha com a cabeça fechada de A para B é lida como A satisfaz B. B pode ser uma classe ou uma interface; o relacionamento em Java pode ser de implementação ou de extensão. Aqui, a classe StandardOutReporter satisfaz a interface Reporter. A propriedade chave do esquema é que não há mais uma dependência de nenhuma classe do package núcleo (core) sobre uma classe do package gui. Todas as dependências apontam (pelo menos logicamente!) de gui para core. Para alterar a saída de dados do programa para um mecanismo GUI, ao invés da saída de dados padrão, teríamos apenas que substituir a classe StandardOutReporter pela classe JTextComponentReporter, e modificar o código da classe principal do package GUI para chamar seu construtor nas classes que contém código de I/O concreto. Este idioma, esta maneira de se fazer as coisas, talvez seja o uso mais popular das 39
11 interfaces, sendo muito valioso seu aprendizado e domínio. Lembre-se que as flechas pontilhadas são dependências fracas. Uma dependência fraca de A para B significa que A referencia os nomes de B, mas não referencia o nome de nenhum de seus membros. Em outras palavras, A sabe que a classe ou interface B existe, e refere-se a variáveis daquele tipo, mas não faz chamadas a nenhum método de B, e nem acessa qualquer campo de B. A dependência fraca de Main sobre Reporter simplesmente indica que a classe Main pode incluir código que manipula um objeto do tipo Reporter genérico; não se trata de um problema. A dependência fraca de Folder sobre Reporter, no entanto, é um problema: o objeto do tipo Reporter deve ser passado através de métodos de Folder para métodos de Compactor. Todo método da cadeia de chamadas que alcança um método instrumentado deve receber um Reporter como argumento. O que é um incomodo, e que pode tornar doloroso um processo posterior de aperfeiçoamento deste esquema Interfaces vs. Classes Abstratas Você deve estar se perguntando se poderíamos ter utilizado uma classe abstrata ao invés de uma interface. Uma classe abstrata é uma classe que não está completamente implementada; ela não pode ser instanciada, ela deve ser estendida através de uma subclasse que a completa. Classes abstratas são úteis quando se deseja produzir código comum a várias classes. Suponha que quiséssemos exibir uma mensagem dizendo quanto tempo cada passo da execução levou. Nós 40
12 podemos implementar uma classe Reporter cujos objetos mantém o estado no qual estavam quando da última chamada ao método report, calculando, então, a diferença de tempo entre a chamada corrente e a última chamada. Ao tornar esta classe abstrata, poderíamos reutilizar o código em cada uma das subclasses concretas StandardOutReporter, JTextComponentReporter, etc. Por que não fazer com que o argumento do método download da classe Session tenha esta classe abstrata como seu tipo, ao invés de uma interface? Há duas razões. A primeira é que desejamos que a dependência sobre o código de Reporter seja a mais fraca possível. A interface não possui código nenhum; ela expressa a especificação mínima do que é necessário. A segunda razão é que não há herança múltipla em Java: uma classe pode estender no máximo uma única outra classe. Portanto, quando você estiver projetando o núcleo do programa, você não quer utilizar sua única oportunidade de utilizar o recurso de subclasses prematuramente. Uma classe pode implementar qualquer número de interfaces, ou seja, ao escolher uma interface, você deixa por conta do projetista das classes Reporter a questão de como elas serão implementadas Campos Estáticos A desvantagem clara do esquema discutido na seção é que o objeto Reporter deve ser inserido por todo o núcleo do programa. Se toda a saída de dados for exibida em um único componente de texto, parece ser não muito bom ter que passar uma referência a este objeto pra lá e pra cá dentro do código. Em termos de dependência, todo método possui, no mínimo, uma dependência fraca sobre a interface Reporter Variáveis globais, ou campos estáticos em Java, provêm uma solução para este problema. Para eliminar muitas destas dependências, nós podemos manter o objeto do tipo Reporter como um campo estático de uma classe: public class StaticReporter { static Reporter r; static void setreporter (Reporter r) { this.r = r; static void report (String msg) { r.report (msg); Agora, tudo que precisamos fazer é definir o objeto Reporter estático no início: 41
13 StaticReporter.setReporter (new StandardOutReporter ()); E podemos fazer chamadas para ele sem a necessidade de uma referência para um objeto: void download ( ) { StaticReporter.report ( Iniciando download ); No diagrama de dependência modular, o efeito desta alteração é que agora apenas as classes que realmente utilizam o objeto do tipo Reporter são dependentes dela: Perceba agora que a dependência fraca de Folder não existe mais. Nós já vimos este conceito antes, é claro, no nosso segundo esquema no qual a classe StandardOutReporter possuía um método estático. Este esquema combina o aspecto estático com o desacoplamento que as interfaces providenciam. As referências globais são cômodas, pois lhe permitem alterar o comportamento de métodos em níveis bem baixos da hierarquia de chamadas sem a necessidade de alteração do código que os envoca. Mas as variáveis globais são perigosas. Elas podem tornar o código extremamente difícil de ser compreendido. Para se determinar o efeito de uma chamada a StaticReporter.report, por exemplo, é necessário saber como o campo estático r está definido. Pode haver uma chamada ao método setreporter em qualquer lugar no código, e para se definir qual efeito ela tem, é necessário traçar o fluxo da execução para se determinar quando o método é executado em relação ao código de interesse. 42
14 Outro problema com relação às variáveis globais é que elas apenas funcionam bem quando realmente há um objeto que possui significado persistente. A saída padrão de dados é um destes casos. Mas componentes de texto em uma GUI não são. Nós podemos, muito bem, desejar que diferentes partes de nosso programa reportem seu progresso a diferentes painéis da nossa GUI. No esquema em que os objetos do tipo Reporter são passados de uma parte para outra do código, nós podemos criar diferentes objetos e passá-los a diferentes partes do código. Na versão estática, teremos que criar métodos diferentes, o que começa a degenerar a elegância do código. Concorrências também ocasionam dúvidas na idéia de se usar um único objeto. Suponha que façamos o upgrade de nosso cliente de para que seja capaz de fazer o download das mensagens a partir de diversos servidores de forma concorrente, isto é, ao mesmo tempo. Nós não gostaríamos que as mensagens de progresso de todas as sessões de download fossem intercaladas em uma única saída de dados. Uma boa prática é ser cuidadoso com variáveis globais. Pergunte a você mesmo se é possível utilizar um mesmo objeto. Normalmente, você irá encontrar amplas razões para ter mais do que um objeto no decorrer de seu programa. Este esquema é denominado Singleton na literatura, pois a classe possui um único objeto. 43
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
EXERCÍCIOS SOBRE ORIENTAÇÃO A OBJETOS
Campus Cachoeiro de Itapemirim Curso Técnico em Informática Disciplina: Análise e Projeto de Sistemas Professor: Rafael Vargas Mesquita Este exercício deve ser manuscrito e entregue na próxima aula; Valor
Análise e Desenvolvimento de Sistemas ADS Programação Orientada a Obejeto POO 3º Semestre AULA 03 - INTRODUÇÃO À PROGRAMAÇÃO ORIENTADA A OBJETO (POO)
Análise e Desenvolvimento de Sistemas ADS Programação Orientada a Obejeto POO 3º Semestre AULA 03 - INTRODUÇÃO À PROGRAMAÇÃO ORIENTADA A OBJETO (POO) Parte: 1 Prof. Cristóvão Cunha Objetivos de aprendizagem
PROGRAMAÇÃO ORIENTADA A OBJETOS -TRATAMENTO DE EXCEÇÕES. Prof. Angelo Augusto Frozza, M.Sc. [email protected]
PROGRAMAÇÃO ORIENTADA A OBJETOS -TRATAMENTO DE EXCEÇÕES Prof. Angelo Augusto Frozza, M.Sc. [email protected] ROTEIRO 5. Tratamento de Exceções Introdução e conceitos Capturando exceção usando
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:
Prototype, um Design Patterns de Criação
Prototype, um Design Patterns de Criação José Anízio Pantoja Maia Este artigo tem como finalidade compreender o funcionamento do padrão de projeto prototype, serão abordados os participantes que compõe
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
Feature-Driven Development
FDD Feature-Driven Development Descrição dos Processos Requisitos Concepção e Planejamento Mais forma que conteúdo Desenvolver um Modelo Abrangente Construir a Lista de Features Planejar por
Programação de Computadores - I. Profª Beatriz Profº Israel
Programação de Computadores - I Profª Beatriz Profº Israel Ambiente de Desenvolvimento Orientação a Objetos É uma técnica de desenvolvimento de softwares que consiste em representar os elementos do mundo
CURSO DE PROGRAMAÇÃO EM JAVA
CURSO DE PROGRAMAÇÃO EM JAVA Introdução para Iniciantes Prof. M.Sc. Daniel Calife Índice 1 - A programação e a Linguagem Java. 1.1 1.2 1.3 1.4 Linguagens de Programação Java JDK IDE 2 - Criando o primeiro
Entendendo como funciona o NAT
Entendendo como funciona o NAT Vamos inicialmente entender exatamente qual a função do NAT e em que situações ele é indicado. O NAT surgiu como uma alternativa real para o problema de falta de endereços
Programação Estruturada e Orientada a Objetos. Fundamentos Orientação a Objetos
Programação Estruturada e Orientada a Objetos Fundamentos Orientação a Objetos 2013 O que veremos hoje? Introdução aos fundamentos de Orientação a Objetos Transparências baseadas no material do Prof. Jailton
ATRIBUTOS PRIVADOS 6. ENCAPSULAMENTO MÉTODOS PRIVADOS MÉTODOS PRIVADOS
ATRIBUTOS PRIVADOS Podemos usar o modificador private, para tornar um atributo privado, obtendo um controle centralizado Definimos métodos para implementar todas as lógicas que utilizam ou modificam o
Slide 1 Deitel/Deitel, 8e. Java Como programar Copyright 2010 Pearson Education
Java Como Programar, 8/E Slide 1 Slide 2 Slide 3 Métodos genéricos e classes genéricas (e interfaces) permitem especificar, com uma única declaração de método, um conjunto de métodos relacionados ou, com
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
PROGRAMAÇÃO ESTRUTURADA. CC 2º Período
PROGRAMAÇÃO ESTRUTURADA CC 2º Período PROGRAMAÇÃO ESTRUTURADA Aula 07: Funções O comando return Protótipo de funções O tipo void Arquivos-cabeçalho Escopo de variáveis Passagem de parâmetros por valor
UNIVERSIDADE FEDERAL DO PARANÁ UFPR Bacharelado em Ciência da Computação
SOFT DISCIPLINA: Engenharia de Software AULA NÚMERO: 10 DATA: / / PROFESSOR: Andrey APRESENTAÇÃO O objetivo desta aula é apresentar e discutir os conceitos de coesão e acoplamento. DESENVOLVIMENTO Projetar
Tabela de Símbolos. Análise Semântica A Tabela de Símbolos. Principais Operações. Estrutura da Tabela de Símbolos. Declarações 11/6/2008
Tabela de Símbolos Análise Semântica A Tabela de Símbolos Fabiano Baldo Após a árvore de derivação, a tabela de símbolos é o principal atributo herdado em um compilador. É possível, mas não necessário,
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
Linguagem de Programação III
Linguagem de Programação III Aula-3 Criando Classes em Java Prof. Esbel Tomás Valero Orellana Da Aula Anterior Classes em Java, sintaxe básica Tipos básicos de dados em Java, como escolher o tipo apropriado
Banco de Dados Aula 1 Introdução a Banco de Dados Introdução Sistema Gerenciador de Banco de Dados
Banco de Dados Aula 1 Introdução a Banco de Dados Introdução Um Sistema Gerenciador de Banco de Dados (SGBD) é constituído por um conjunto de dados associados a um conjunto de programas para acesso a esses
LP II Estrutura de Dados. Introdução e Linguagem C. Prof. José Honorato F. Nunes [email protected]
LP II Estrutura de Dados Introdução e Linguagem C Prof. José Honorato F. Nunes [email protected] Resumo da aula Considerações Gerais Introdução a Linguagem C Variáveis e C Tipos de
ISO/IEC 12207: Gerência de Configuração
ISO/IEC 12207: Gerência de Configuração Durante o processo de desenvolvimento de um software, é produzida uma grande quantidade de itens de informação que podem ser alterados durante o processo Para que
Módulo 07 Características Avançadas de Classes
Módulo 07 Características Avançadas de Classes Última Atualização: 15/06/2010 1 Objetivos Descrever variáveis, métodos e iniciadores static Descrever a semântica do modificador final em classes, métodos
Resolução da lista de exercícios de casos de uso
Resolução da lista de exercícios de casos de uso 1. Explique quando são criados e utilizados os diagramas de casos de uso no processo de desenvolvimento incremental e iterativo. Na fase de concepção se
IFPE. Disciplina: Sistemas Operacionais. Prof. Anderson Luiz Moreira
IFPE Disciplina: Sistemas Operacionais Prof. Anderson Luiz Moreira SERVIÇOS OFERECIDOS PELOS SOS 1 Introdução O SO é formado por um conjunto de rotinas (procedimentos) que oferecem serviços aos usuários
ARRAYS. Um array é um OBJETO que referencia (aponta) mais de um objeto ou armazena mais de um dado primitivo.
Cursos: Análise, Ciência da Computação e Sistemas de Informação Programação I - Prof. Aníbal Notas de aula 8 ARRAYS Introdução Até agora, utilizamos variáveis individuais. Significa que uma variável objeto
Lista de Contas: Assinatura. Lista de Contas. Listas de Contas: Descrição. Listas de Contas: Descrição. Listas de Contas: Descrição
Lista de Contas Lista de Contas: Assinatura null Quais são os métodos necessários? class ListaDeContas { void inserir (Conta c) { void retirar (Conta c) { Conta procurar (String num) { Listas de Contas:
Planejando o aplicativo
Um aplicativo do Visual FoxPro geralmente inclui um ou mais bancos de dados, um programa principal que configura o ambiente de sistema do aplicativo, além de uma interface com os usuários composta por
Algoritmos e Programação (Prática) Profa. Andreza Leite [email protected]
(Prática) Profa. Andreza Leite [email protected] Introdução O computador como ferramenta indispensável: Faz parte das nossas vidas; Por si só não faz nada de útil; Grande capacidade de resolução
Profº. Enrique Pimentel Leite de Oliveira
Profº. Enrique Pimentel Leite de Oliveira O termo orientação a objetos significa organizar o mundo real como uma coleção de objetos que incorporam estrutura de dados e um conjunto de operações que manipulam
INTRODUÇÃO ÀS LINGUAGENS DE PROGRAMAÇÃO
Capítulo 1 INTRODUÇÃO ÀS LINGUAGENS DE PROGRAMAÇÃO 1.1 Histórico de Linguagens de Programação Para um computador executar uma dada tarefa é necessário que se informe a ele, de uma maneira clara, como ele
Implementando uma Classe e Criando Objetos a partir dela
Análise e Desenvolvimento de Sistemas ADS Programação Orientada a Obejeto POO 3º Semestre AULA 04 - INTRODUÇÃO À PROGRAMAÇÃO ORIENTADA A OBJETO (POO) Parte: 2 Prof. Cristóvão Cunha Implementando uma Classe
Hardware (Nível 0) Organização. Interface de Máquina (IM) Interface Interna de Microprogramação (IIMP)
Hardware (Nível 0) Organização O AS/400 isola os usuários das características do hardware através de uma arquitetura de camadas. Vários modelos da família AS/400 de computadores de médio porte estão disponíveis,
AULA 4 VISÃO BÁSICA DE CLASSES EM PHP
AULA 4 VISÃO BÁSICA DE CLASSES EM PHP Antes de mais nada, vamos conhecer alguns conceitos, que serão importantes para o entendimento mais efetivos dos assuntos que trataremos durante a leitura desta apostila.
Esta dissertação apresentou duas abordagens para integração entre a linguagem Lua e o Common Language Runtime. O objetivo principal da integração foi
5 Conclusão Esta dissertação apresentou duas abordagens para integração entre a linguagem Lua e o Common Language Runtime. O objetivo principal da integração foi permitir que scripts Lua instanciem e usem
SISTEMAS OPERACIONAIS ABERTOS Prof. Ricardo Rodrigues Barcelar http://www.ricardobarcelar.com
- Aula 2-1. PRINCÍPIOS DE SOFTWARE DE ENTRADA E SAÍDA (E/S) As metas gerais do software de entrada e saída é organizar o software como uma série de camadas, com as mais baixas preocupadas em esconder as
Sistemas de Banco de Dados Aspectos Gerais de Banco de Dados
Sistemas de Banco de Dados Aspectos Gerais de Banco de Dados 1. Conceitos Básicos No contexto de sistemas de banco de dados as palavras dado e informação possuem o mesmo significado, representando uma
CAPÍTULO 3 - TIPOS DE DADOS E IDENTIFICADORES
CAPÍTULO 3 - TIPOS DE DADOS E IDENTIFICADORES 3.1 - IDENTIFICADORES Os objetos que usamos no nosso algoritmo são uma representação simbólica de um valor de dado. Assim, quando executamos a seguinte instrução:
PROGRAMAÇÃO AVANÇADA -CONCEITOS DE ORIENTAÇÃO A OBJETOS. Prof. Angelo Augusto Frozza, M.Sc. [email protected]
PROGRAMAÇÃO AVANÇADA -CONCEITOS DE ORIENTAÇÃO A OBJETOS Prof. Angelo Augusto Frozza, M.Sc. [email protected] ROTEIRO 1. Conceitos de Orientação a Objetos Introdução O paradigma da POO Classes
Introdução a Java. Hélder Nunes
Introdução a Java Hélder Nunes 2 Exercício de Fixação Os 4 elementos básicos da OO são os objetos, as classes, os atributos e os métodos. A orientação a objetos consiste em considerar os sistemas computacionais
Programação Orientada a Objetos em Java. Herança
Universidade Federal do Amazonas Departamento de Ciência da Computação IEC481 Projeto de Programas Programação Orientada a Objetos em Java Herança Professor: César Melo Slides baseados em materiais preparados
Sistemas Distribuídos
Sistemas Distribuídos Modelo Cliente-Servidor: Introdução aos tipos de servidores e clientes Prof. MSc. Hugo Souza Iniciando o módulo 03 da primeira unidade, iremos abordar sobre o Modelo Cliente-Servidor
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.: ([email protected]) Conteúdo 1. Introdução 2. Processo de Software 3. Gerência de
Engenharia de Software III
Engenharia de Software III Casos de uso http://dl.dropbox.com/u/3025380/es3/aula6.pdf ([email protected]) 09/09/2010 O que são casos de uso? Um caso de uso procura documentar as ações necessárias,
Curso de Aprendizado Industrial Desenvolvedor WEB
Curso de Aprendizado Industrial Desenvolvedor WEB Disciplina: Programação Orientada a Objetos II Professor: Cheli dos S. Mendes da Costa Servidor de Aplicações WEB Tomcat Servidor Tomcat Foi desenvolvido
Notas da Aula 17 - Fundamentos de Sistemas Operacionais
Notas da Aula 17 - Fundamentos de Sistemas Operacionais 1. Gerenciamento de Memória: Introdução O gerenciamento de memória é provavelmente a tarefa mais complexa de um sistema operacional multiprogramado.
Subtipos e Subclasses
Subtipos e Subclasses Aula 15 do curso 6.170 15 de outubro de 2001 Sumário 1Subtipos 32 2 Exemplo: Bicicletas 33 3 Exemplo: Quadrado e retângulo 37 4 Princípio de substituição 38 5 Subclasses e subtipos
Importância da normalização para as Micro e Pequenas Empresas 1. Normas só são importantes para as grandes empresas...
APRESENTAÇÃO O incremento da competitividade é um fator decisivo para a maior inserção das Micro e Pequenas Empresas (MPE), em mercados externos cada vez mais globalizados. Internamente, as MPE estão inseridas
04/08/2012 MODELAGEM DE DADOS. PROF. RAFAEL DIAS RIBEIRO, M.Sc. @ribeirord MODELAGEM DE DADOS. Aula 2. Prof. Rafael Dias Ribeiro. M.Sc.
MODELAGEM DE DADOS PROF. RAFAEL DIAS RIBEIRO, M.Sc. @ribeirord MODELAGEM DE DADOS Aula 2 Prof. Rafael Dias Ribeiro. M.Sc. @ribeirord 1 Objetivos: Revisão sobre Banco de Dados e SGBDs Aprender as principais
5 Mecanismo de seleção de componentes
Mecanismo de seleção de componentes 50 5 Mecanismo de seleção de componentes O Kaluana Original, apresentado em detalhes no capítulo 3 deste trabalho, é um middleware que facilita a construção de aplicações
Para construção dos modelos físicos, será estudado o modelo Relacional como originalmente proposto por Codd.
Apresentação Este curso tem como objetivo, oferecer uma noção geral sobre a construção de sistemas de banco de dados. Para isto, é necessário estudar modelos para a construção de projetos lógicos de bancos
ESTUDO DE CASO WINDOWS VISTA
ESTUDO DE CASO WINDOWS VISTA História Os sistemas operacionais da Microsoft para PCs desktop e portáteis e para servidores podem ser divididos em 3 famílias: MS-DOS Windows baseado em MS-DOS Windows baseado
Programação Orientada a Objetos e Java - Introdução. Carlos Lopes
Programação Orientada a Objetos e Java - Introdução Carlos Lopes POO e Java Objetivo: proporcionar uma visão dos conceitos de POO e do seu uso na estruturação dos programas em Java. Classes e objetos em
1. Apresentação. 1.1. Objetivos
1.1. Objetivos 1. Apresentação Neste capítulo estão descritos os objetivos gerais do livro, os requisitos desejáveis do estudante para que possa utilizá-lo eficientemente, e os recursos necessários em
Especificação do 3º Trabalho
Especificação do 3º Trabalho I. Introdução O objetivo deste trabalho é abordar a prática da programação orientada a objetos usando a linguagem Java envolvendo os conceitos de classe, objeto, associação,
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
ALESSANDRO RODRIGO FRANCO FERNANDO MARTINS RAFAEL ALMEIDA DE OLIVEIRA
ALESSANDRO RODRIGO FRANCO FERNANDO MARTINS RAFAEL ALMEIDA DE OLIVEIRA INTRODUÇÃO O projeto de um banco de dados é realizado sob um processo sistemático denominado metodologia de projeto. O processo do
Curso de PHP. FATEC - Jundiaí. A programação orientada a objetos (object-oriented oriented programming
Curso de PHP FATEC - Jundiaí A programação orientada a objetos (object-oriented oriented programming OOP) é um conjunto de técnicas t para organizar o código c em torno de entidades ou objetos representados
3.1 Definições Uma classe é a descrição de um tipo de objeto.
Unified Modeling Language (UML) Universidade Federal do Maranhão UFMA Pós Graduação de Engenharia de Eletricidade Grupo de Computação Assunto: Diagrama de Classes Autoria:Aristófanes Corrêa Silva Adaptação:
Diagrama de Classes. Um diagrama de classes descreve a visão estática do sistema em termos de classes e relacionamentos entre as classes.
1 Diagrama de Classes Um diagrama de classes descreve a visão estática do sistema em termos de classes e relacionamentos entre as classes. Um dos objetivos do diagrama de classes é definir a base para
Começando com Ruby on Rails @gibsongabriel
Começando com Ruby on Rails @gibsongabriel Yukiriho 'Matz' Matsumoto http://ruby-lang.org/pt/ Ruby é uma linguagem de programação interpretada, com tipagem forte e dinâmica, que tem como foco a simplicidade
UNIVERSIDADE FEDERAL DE SANTA MARIA CENTRO DE TECNOLOGIA AULA 14 PROFª BRUNO CALEGARO
UNIVERSIDADE FEDERAL DE SANTA MARIA CENTRO DE TECNOLOGIA AULA 14 PROFª BRUNO CALEGARO Santa Maria, 01 de Novembro de 2013. Revisão aula passada Projeto de Arquitetura Decisões de projeto de Arquitetura
Especificação do Trabalho Prático
Especificação do Trabalho Prático O professor Thomas é um homem muito ocupado. Tem, em sua agenda, uma série de compromissos que ele deve atender em 2009. De tantos compromissos que tem, resolveu contratar
Programação Orientada a Objetos em Java
Programação Orientada a Objetos em Java Rone Ilídio da Silva Universidade Federal de São João del-rei Campus Alto Paraopeba 1:14 1 Objetivo Apresentar os principais conceitos de Programção Orientada a
ArpPrintServer. Sistema de Gerenciamento de Impressão By Netsource www.netsource.com.br Rev: 02
ArpPrintServer Sistema de Gerenciamento de Impressão By Netsource www.netsource.com.br Rev: 02 1 Sumário INTRODUÇÃO... 3 CARACTERÍSTICAS PRINCIPAIS DO SISTEMA... 3 REQUISITOS DE SISTEMA... 4 INSTALAÇÃO
Lógica de Programação
Lógica de Programação Softblue Logic IDE Guia de Instalação www.softblue.com.br Sumário 1 O Ensino da Lógica de Programação... 1 2 A Ferramenta... 1 3 Funcionalidades... 2 4 Instalação... 3 4.1 Windows...
Linguagens de Programação Aula 10
Linguagens de Programação Aula 10 Celso Olivete Júnior [email protected] Na aula passada As sentenças de controle das LP imperativas ocorrem em diversas categorias: seleção, seleção múltipla, iteração
Sistemas Operacionais
Sistemas Operacionais Sistemas Operacionais Prof. Marcelo Sabaris Carballo Pinto Gerenciamento de Dispositivos Gerenciamento de Dispositivos de E/S Introdução Gerenciador de Dispositivos Todos os dispositivos
ARCO - Associação Recreativa dos Correios. Sistema para Gerenciamento de Associações Recreativas Plano de Desenvolvimento de Software Versão <1.
ARCO - Associação Recreativa dos Correios Sistema para Gerenciamento de Associações Recreativas Versão Histórico da Revisão Data Versão Descrição Autor Página
O Rational Unified Process (RUP) é um processo de desenvolvimento de software inspirado no
1.1 RATIONAL UNIFIED PROCESS (RUP) O Rational Unified Process (RUP) é um processo de desenvolvimento de software inspirado no processo que atende pelo nome de Processo Unificado (ou UP do inglês Unified
Introdução à Linguagem Java
Introdução à Linguagem Java Histórico: Início da década de 90. Pequeno grupo de projetos da Sun Microsystems, denominado Green. Criar uma nova geração de computadores portáveis, capazes de se comunicar
Trabalho Interdisciplinar. MS Project
Aula Prática: Introdução ao Microsoft Project Professional MS Project Como vimos em nossas aulas, a EAP Estrutura Analítica do Projeto é o primeiro passo para criar um cronograma de um projeto estruturado.
MANUAL C R M ÍNDICE. Sobre o módulo de CRM... 2. 1 Definindo a Campanha... 3
ÍNDICE Sobre o módulo de CRM... 2 1 Definindo a Campanha... 3 1.1 Incluir uma campanha... 3 1.2 Alterar uma campanha... 4 1.3 Excluir... 4 1.4 Procurar... 4 2 Definindo os clientes para a campanha... 4
Parte I. Demoiselle Mail
Parte I. Demoiselle Mail Para o envio e recebimento de e-s em aplicativos Java, a solução mais natural é usar a API JavaMail [http:// www.oracle.com/technetwork/java/java/index.html]. Ela provê um framework
MÓDULO 8 ARQUITETURA DOS SISTEMAS DE BANCO DE DADOS
MÓDULO 8 ARQUITETURA DOS SISTEMAS DE BANCO DE DADOS Quando falamos em arquitetura, normalmente utilizamos esse termo para referenciar a forma como os aplicativos computacionais são estruturados e os hardwares
Barra de ferramentas padrão. Barra de formatação. Barra de desenho Painel de Tarefas
Microsoft Power Point 2003 No Microsoft PowerPoint 2003, você cria sua apresentação usando apenas um arquivo, ele contém tudo o que você precisa uma estrutura para sua apresentação, os slides, o material
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.
Prevayler. Perola. André Luís Sales de Moraes Juliana Keiko Yamaguchi Tatiana Yuka Takaki
Prevayler Perola André Luís Sales de Moraes Juliana Keiko Yamaguchi Tatiana Yuka Takaki Prevayler Prevayler é a implementação em Java do conceito de Prevalência. É um framework que prega uma JVM invulnerável
Figura 01 Kernel de um Sistema Operacional
01 INTRODUÇÃO 1.5 ESTRUTURA DOS SISTEMAS OPERACIONAIS O Sistema Operacional é formado por um Conjunto de rotinas (denominado de núcleo do sistema ou kernel) que oferece serviços aos usuários e suas aplicações
Análise e Projeto Orientados por Objetos
Análise e Projeto Orientados por Objetos Aula 02 Análise e Projeto OO Edirlei Soares de Lima Análise A análise modela o problema e consiste das atividades necessárias para entender
02 - Usando o SiteMaster - Informações importantes
01 - Apresentação do SiteMaster - News Edition O SiteMaster foi desenvolvido para ser um sistema simples de gerenciamento de notícias, instalado em seu próprio computador e com configuração simplificada,
Fundamentos de Sistemas Computacionais Introdução
Fundamentos de Sistemas Computacionais Introdução Prof. Eduardo Alchieri Sistema Computacional Hardware Software Usuários Um ou mais processadores, memória, discos, impressoras, teclado, mouse, monitor,
Curso de Java. Orientação a objetos e a Linguagem JAVA. TodososdireitosreservadosKlais
Curso de Java Orientação a objetos e a Linguagem JAVA Roteiro A linguagem Java e a máquina virtual Objetos e Classes Encapsulamento, Herança e Polimorfismo Primeiro Exemplo A Linguagem JAVA Principais
Construção Páginas de Internet
Construção Páginas de Internet Definir um Site no Frontpage Objectivos da sessão: No final da sessão os formandos deverão ser capazes de: Saber o que são os metadados do Frontpage; Distinguir entre Sites
Eduardo Bezerra. Editora Campus/Elsevier
Princípios de Análise e Projeto de Sistemas com UML 2ª edição Eduardo Bezerra Editora Campus/Elsevier Capítulo 11 Arquitetura do sistema Nada que é visto, é visto de uma vez e por completo. --EUCLIDES
Possui como idéia central a divisão de um universo de dados a ser organizado em subconjuntos mais gerenciáveis.
3. Tabelas de Hash As tabelas de hash são um tipo de estruturação para o armazenamento de informação, de uma forma extremamente simples, fácil de se implementar e intuitiva de se organizar grandes quantidades
Polimorfismo. Prof. Leonardo Barreto Campos 1
Polimorfismo Prof. Leonardo Barreto Campos 1 Sumário Introdução; Polimorfismo; Polimorfismo Java; Métodos Abstratos Java Classes Abstratas Java Exercício - Java Polimorfismo C++ Classe Abstrata C++; Funções
Na disciplina de Cálculo Numérico, vamos trabalhar com a linguagem C++ e o compilador que vamos usar é o Dev C++.
Data: 14/8 Página 1 de 9 Primeiros passos Introdução Na disciplina de Cálculo Numérico, vamos trabalhar com a linguagem C++ e o compilador que vamos usar é o Dev C++. No tutorial anterior, mostramos como
Histórico da Revisão. Versão Descrição Autor. 1.0 Versão Inicial
1 of 14 27/01/2014 17:33 Sistema de Paginação de Esportes Universitários Documento de Arquitetura de Software Versão 1.0 Histórico da Revisão Data 30 de novembro de 1999 Versão Descrição Autor 1.0 Versão
3 SCS: Sistema de Componentes de Software
3 SCS: Sistema de Componentes de Software O mecanismo para acompanhamento das chamadas remotas se baseia em informações coletadas durante a execução da aplicação. Para a coleta dessas informações é necessário
Kerio Exchange Migration Tool
Kerio Exchange Migration Tool Versão: 7.3 2012 Kerio Technologies, Inc. Todos os direitos reservados. 1 Introdução Documento fornece orientações para a migração de contas de usuário e as pastas públicas
SISTEMAS OPERACIONAIS
SISTEMAS OPERACIONAIS Arquitetura Sistemas Operacionais Andreza Leite [email protected] Plano de Aula Sistemas monolíticos Sistemas em camadas Sistemas micro-núcleo Modelo Cliente-Servidor Máquinas
Padrões de Projeto. Singleton
Padrões de Projeto Padrões de Criação Singleton Singleton Assegura que uma classe tenha apenas uma instância e provê um ponto de acesso global a ela 2 Livro Texto: Design Pattern - Elements 1 Motivação
04/08/2012 MODELAGEM DE DADOS. PROF. RAFAEL DIAS RIBEIRO, M.Sc. @ribeirord MODELAGEM DE DADOS. Aula 1. Prof. Rafael Dias Ribeiro. M.Sc.
MODELAGEM DE DADOS PROF. RAFAEL DIAS RIBEIRO, M.Sc. @ribeirord MODELAGEM DE DADOS Aula 1 Prof. Rafael Dias Ribeiro. M.Sc. @ribeirord 1 Objetivos: Apresenta a diferença entre dado e informação e a importância
ÍNDICE. 1. Introdução...2. 2. O que é o Sistema Mo Porã...2. 3. Como acessar o Site Mo Porã...3. 4. Cadastro do Sistema Mo Porã...
ÍNDICE 1. Introdução...2 2. O que é o Sistema Mo Porã...2 3. Como acessar o Site Mo Porã...3 4. Cadastro do Sistema Mo Porã...4 5. Navegando no Site Mo Porã...6 5. 1 Manual de ajuda do sistema Mo Porã...7
Programação para Dispositivos Móveis
Programação para Dispositivos Móveis Fatec Ipiranga Análise e Desenvolvimento de Sistemas Aula 04 Anatomia de uma aplicação Android Dalton Martins [email protected] São Paulo, Fevereiro, 2012 24/02/12
LINGUAGEM DE BANCO DE DADOS
LINGUAGEM DE BANCO DE DADOS Gabriela Trevisan Bacharel em Sistemas de Informação Universidade Federal do Rio Grande Pós-Graduanda Formação Pedagógica de Professores (FAQI) Conceito de BD Um banco de dados
CAPÍTULO 35 Como utilizar os componentes ColdFusion
CAPÍTULO 35 Como utilizar os componentes ColdFusion Os componentes ColdFusion (CFC) permitem ao usuário encapsular lógicas de aplicação e de negócios (business logic) em unidades auto-controladas reutilizáveis.
