Programação por Contrato na Disciplina de Introdução à Programação
|
|
- Regina Domingues Dinis
- 8 Há anos
- Visualizações:
Transcrição
1 Programação por Contrato na Disciplina de Introdução à Programação Sebenta de apoio Departamento de Informática Faculdade de Ciências Universidade de Lisboa Isabel Nunes Novembro 2004
2 Índice Introdução 1 Ocultação da representação 1 Programação por contrato.. 7 Pré e pós-condições. 7 Como exprimir asserções?.10 A linguagem de especificação..11 Construção de contratos.11 Invariantes.15 Correcção de uma classe.16 Monitorização de classes 16 Resumindo e concluindo 18 Alguns passos a seguir na construção de classes e seus contratos:18 Utilização de asserções:..18 Monitorização de asserções em tempo de execução:..19 Bibliografia 19
3 Introdução Esta sebenta pretende dar aos alunos um suporte de estudo para a programação por contrato. Não conhecemos nenhum livro introdutório de programação centrada em objectos, baseado na linguagem Java, que faça uma abordagem cuidada e completa desta filosofia de desenho e programação. Daí esta sebenta. Começamos por motivar a nossa opção de esconder a forma como representamos os objectos. Isso permite-nos introduzir, de uma forma bastante natural, a motivação para o uso da programação por contrato. Ocultação da representação Quando construimos uma classe estamos a implementar um tipo de dados pois escolhemos uma forma específica de representar o estado dos seus elementos uma representação e uma forma específica de implementar o seu comportamento. Existem várias razões para que a representação escolhida para o estado dos objectos os seus atributos seja escondida das classes cliente: 1. minimização das alterações às classes cliente aquando de uma mudança na representação da classe fornecedora; 2. segurança nas alterações aos valores dos atributos. Minimização das alterações: Se as classes cliente não dependerem da representação dos atributos do objecto fornecedor então, quando for necessário alterar essa representação, as classes cliente não terão que ser alteradas; Vamos supor que os atributos x e y da classe Point tinham sido declarados como public: * Uma classe que descreve pontos num plano ortonormado. public class Point { * A abcissa do ponto. public double x; * A ordenada do ponto. public double y; Introdução à Programação 2004/2005 1
4 * A distância deste ponto à origem. public double rho () { return Math.sqrt (x * x + y * y); * O ângulo que a recta que une este ponto à origem * faz com a parte positiva do eixo horizontal. public double theta () { if (iszero(x) && iszero(y)) return 0.0; if (iszero(x)) return x > 0.0? Math.PI / 2 : 3 * Math.PI / 2; return y > 0? Math.atan(y / x) : Math.atan(y / x) + Math.PI; //fim da classe Point Se assim fosse, nada seria escondido; tanto os atributos como os métodos seriam de domínio público. Os atributos x e y representam valores armazenados em memória. Os métodos rho e theta são implementados de forma a devolverem a distância à origem rho e o ângulo que o ponto faz com o eixo dos xx theta; estes valores são calculados a partir dos valores dos atributos x e y. Então, numa qualquer classe cliente da classe Point, por exemplo Rectangle, podemos ter algo do estilo: Point p; System.out.println("Abcissa=" + p.x + " Ordenada=" + p.y); System.out.println("Ordenada na origem=" + p.rho() + " Ângulo com o eixo dos xx=" + p.theta()); Agora imaginemos que decidimos alterar a representação de Point, ou seja, alterar a forma como representamos o seu estado. Porque os nossos clientes utilizam essencialmente rotações, interessa-nos antes armazenar a distância à origem e o ângulo que o ponto faz com o eixo dos xx. Então, a classe Point ficaria: public class Point { * A distância do ponto à origem. public double rho; * O ângulo que a recta que une o ponto à origem * faz com a parte positiva do eixo horizontal. public double theta; 2 Introdução à Programação 2004/2005
5 * A abcissa do ponto. public double x () { return rho * Math.cos(theta); * A ordenada do ponto. public double y () { return rho * Math.sin(theta);. //fim da classe Point Agora rho e theta são valores armazenados em memória e x() e y() são calculados a partir dos valores de rho e theta, ou seja, são métodos. Se voltarmos a olhar para o conjunto de instruções que tínhamos na classe Rectangle, verificamos que deixaram de estar correctas! Esta alteração da classe Point obriga a várias alterações na classe Rectangle, ou seja: Point p; System.out.println("Abcissa=" + p.x() + " Ordenada=" + p.y()); System.out.println("Ordenada na origem=" + p.rho + " Ângulo com o eixo dos xx=" + p.theta); As alterações a fazer aparecem a sublinhado no exemplo. Agora imaginem que a classe Point tinha muitos outros clientes em muitas e diversas aplicações Esta obrigação de alterar as classes cliente é provocada pelo facto de que estas classes dependem da representação escolhida para os objectos da classe Point, ou seja, a representação não foi escondida. A forma ideal de proceder é esconder os atributos e definir funções que revelam o estado, mas sem revelar o tipo de representação escolhido: public class Point { private double x,y; // atributos são privados * A abcissa do ponto. public double x () { return x; * A ordenada do ponto. public double y () { return y; Introdução à Programação 2004/2005 3
6 * A distância deste ponto à origem. public double rho () { return Math.sqrt (x * x + y * y); * O ângulo que a recta que une este ponto à origem * faz com a parte positiva do eixo horizontal. public double theta () { if (iszero(x) && iszero(y)) return 0.0; if (iszero(x)) return x > 0.0? Math.PI / 2 : 3 * Math.PI / 2; return y > 0? Math.atan(y / x) : Math.atan(y / x) + Math.PI;. //fim da classe Point ou: public class Point { * A distância do ponto à origem e o O ângulo que a * recta que une o ponto à origem * faz com a parte positiva do eixo horizontal. private double rho,theta; // atributos são privados * A distância do ponto à origem. public double rho () {return rho; * O ângulo que a recta que une este ponto à origem * faz com a parte positiva do eixo horizontal. public double theta () { return theta; * A abcissa do ponto. public double x () { return rho * Math.cos(theta);. * A ordenada do ponto. public double y () { return rho * Math.sin(theta); 4 Introdução à Programação 2004/2005
7 //fim da classe Point Qualquer classe cliente de Point teria que aceder ao seu estado através das funções postas ao seu dispôr: Point p; System.out.println("Abcissa=" + p.x() + " Ordenada=" + p.y()); System.out.println("Ordenada na origem=" + p.rho() + " Ângulo com o eixo dos xx=" + p.theta()); A classe a que pertence este excerto é um cliente correcto de ambas as classes, ou seja, se tivéssemos a representação cartesiana e a alterássemos para polar, não tínhamos que alterar estas instruções. Segurança nas alterações: Se as classes cliente não tiverem acesso directo aos atributos do objecto fornecedor, não poderão alterar os valores destes de formas não autorizadas; Consideremos agora uma classe que representa uma pessoa: * Uma classe que descreve uma pessoa, seu nome e idade. public class Person { * Nome da pessoa public String name; * A idade da pessoa public int age; * Construtor public Pessoa (String name, int age) { this.name = name; this.age = age;. //fim da classe Person Como os atributos são de acesso público, qualquer objecto do tipo Person pode ver alterada a sua idade para valores não autorizados, p.ex., valores negativos: Person p = new Person ("Miguel", 23); p.age = -10; Introdução à Programação 2004/2005 5
8 Devemos, então, declarar os atributos como sendo de acesso privado e, se for caso disso, fornecer métodos que permitam a sua alteração de forma controlada: public class Person { // Nome da pessoa private String name; // A idade da pessoa private int age; * Construtor public Pessoa (String name, int age) { this.name = name; this.age = age; * Nome da pessoa public String name () { return name; * A idade da pessoa public int age () { return age; * Alterar a idade da pessoa param newage O novo valor para a idade public void setage (int newage) { if (newage >= 0) age = newage; else. // o que fazer?. //fim da classe Person Desta forma, a idade de um objecto do tipo Person só poderá ser alterada para valores maiores ou iguais a zero. Concluindo: ocultamos a representação de todas as classes que criamos declarando os atributos como privados. Para aqueles que queremos dar a conhecer às classes cliente, construimos funções públicas que retornam o seu valor. Para aqueles cuja alteração (controlada) queremos permitir, construimos procedimentos que, dados novos valores para esses atributos, alterem, de forma controlada, os seus valores. 6 Introdução à Programação 2004/2005
9 Programação por contrato No último exemplo da secção anterior, no método setage (int newage), utilizámos aquilo a que se chama programação defensiva. Assim, demos à classe Person, que é a classe fornecedora do método, a responsabilidade de verificar a legalidade da invocação do método. A essa responsabilidade acresce ainda a de decidir o que fazer quando o valor do argumento newage é ilegal (menor que zero). Ora, no âmbito da classe Person não sabemos que classes é que vão usar objectos do tipo Person, para que é que os vão usar, em que contextos é que os vão usar e assim por diante. Ou seja, desconhecemos o que devemos fazer nos casos não autorizados de utilização do método. Se não sabemos como resolver o problema para todos os casos, resolvemo-lo bem apenas para aqueles casos que sabemos. Então, o ideal é que na documentação da classe Person apareça um "aviso" alertando para o facto de que o método setage só pode ser utilizado com argumentos de valor positivo ou zero. É desejável ainda que se informem as classes cliente de qual será o efeito da execução do método nos casos em que é chamado com valores legais para o argumento. Neste exemplo o efeito da execução do método será que a idade do objecto alvo da invocação ficará igual ao valor do argumento. Pré e pós-condições Usamos duas categorias adicionais de documentação associada a um método: précondições (@requires) e pós-condições (@ensures). Chamamos asserções a estas condições. As pré-condições exprimem restrições sob as quais um método funciona adequadamente. As pós-condições exprimem uma propriedade do estado resultante da execução do método (admitindo que foi invocado com a pré-condição satisfeita). public class Person { * Nome da pessoa private String name; * A idade da pessoa private int age; * Construtor public Pessoa (String name, int age) { this.name = name; this.age = age; Introdução à Programação 2004/2005 7
10 * Nome da pessoa public String name () { return name; * A idade da pessoa public int age () { return age; * Alterar a idade da pessoa param newage O novo valor para a idade requires o valor de newage deve ser positivo ou ensures a idade da pessoa tem um valor igual ao de public void setage (int newage) { if (newage >= 0) age = newage; else. // o que fazer?. //fim da classe Person As classes cliente de Person devem então ser responsáveis por chamar esse método unicamente em situações legais se querem obter o efeito desejado. Usando a informação que é fornecida pela pré-condição, só vamos invocar o método para valores do argumento positivos ou zero: Scanner scanner = new Scanner(System.in); Person p = new Person("Miguel", 23); System.out.println("Qual a nova idade para o " + p.name() + "?"); int nova = scanner.nextint(); if (nova >= 0) p.setage(nova); else System.out.println("Idade inválida"); A classe onde se encontram estas instruções é uma classe cliente bem comportada pois só invoca o método quando há a certeza que o pode fazer. É a classe onde se encontra a invocação do método que sabe o que fazer em situações ilegais! Neste caso poderíamos fazer sair uma mensagem no ecrã. Solução bastante diferente é adoptada no caso seguinte: pretende-se usar um objecto do tipo Person para representar a idade "estética" de alguém, idade esta que também deverá ser não negativa. As pessoas são sujeitas a tratamentos que, eventualmente, as rejuvenescem e que vão diminuir a sua idade estética. Se o número de anos que rejuvenesceu for maior que a idade que tem, então pretende-se que a nova idade seja zero - uma solução diferente da anterior que fazia sair uma mensagem no ecrã. 8 Introdução à Programação 2004/2005
11 Scanner scanner = new Scanner(System.in); Person p = new Person("Miguel", 34); System.out.println("Depois do tratamento de rejuvenescimento, + quantos anos acha que " + p.name() + " rejuvenesceu?"); int anos = scanner.nextint(); int nova = p.idade() - anos; // Nova idade "estética" if (nova >= 0) p.setidade(nova); else p.setidade(0); Verificamos por estes exemplos que, realmente, quem sabe o que deve ser feito em casos não autorizados são as classes cliente e não a classe fornecedora. Nesta abordagem verifica-se primeiro se o método pode ser invocado e só depois de ter a confirmação é que é feita a invocação. Como vimos acima, se o cliente é que sabe o que fazer em situações ilegais, então o fornecedor não deve testar no corpo do método se a invocação é legal ou não: Isto leva-nos ao princípio da não-redundância: "Em circunstância alguma deve o corpo do método testar a pré-condição". É esta a chave da programação por contrato. A ideia é que as classes cliente - C - e fornecedor - F - estabelecem um contrato em relação a cada método m i da classe fornecedora: "Se C invoca o método m i num estado que satisfaz a pré-condição de mi, então F garante que o estado obtido com a execução de m i satifaz a pós-condição de m i ". Nos casos em que m i é invocado num estado que não satisfaz a sua pré-condição, a classe fornecedora não se responsabiliza pelo estado que é obtido pela execução de m i. Nos casos em que m i é invocado num estado que satisfaz a sua pré-condição, é esperado que a execução do método leve a um estado que satisfaz a sua pós-condição. Podemos esquematizar estas ideias em termos de direitos e obrigações da seguinte forma: setage(int newage) Obrigações Direitos Cliente Fornecedor Satisfazer pré-condição (Invocar setage com um valor não negativo do argumento) Satisfazer pós-condição (Actualizar a idade) Ver satisfeita a pós-condição (Certeza de que a idade foi alterada como pretendido) Ver satisfeita a pré-condição ou, à falta disso, não ter obrigações (Código mais simples pois não tem que verificar a précondição) Isto leva-nos à regra da violação de asserções: "A violação de uma asserção em tempo de execução é uma manifestação de erro na aplicação" Mais especificamente: Introdução à Programação 2004/2005 9
12 "A violação de uma pré-condição é a manifestação de um erro no cliente; a violação de uma pós-condição é a manifestação de um erro no fornecedor." A metodologia do desenho por contrato estabelece que nunca devemos invocar um método sem termos a certeza que a pré-condição desse método se verifica. Diz-nos ainda que, sempre que invocarmos um método com a sua pré-condição satisfeita, podemos ter a certeza de que, após a execução, obtemos um estado que satisfaz a póscondição de método. Diz ainda que não devemos testar a pré-condição de um método no corpo do próprio método. É óbvio que isto não se deve aplicar a relações utilizador/programa! Não é o facto de dizermos ao utilizador que introduza um valor entre 15 e 50 que faz com que possamos confiar cegamente que o valor introduzido está nesse intervalo. Pelo contrário! Todos os valores solicitados ao utilizador devem ser validados antes de serem trabalhados. Por exemplo: Scanner scanner = new Scanner(System.in); Person p = new Person("Miguel",23); System.out.println("Qual a nova idade para o " + p.nome() + "? (deverá ser um valor entre 0 e 120)"); int nova = scanner.nextint(); p.setidade(nova); Isto seria impensável! Estamos aqui a usar um valor que é suposto representar uma idade sem nos certificarmos de que o utilizador introduziu um valor que possa realmente ser usado como uma idade (por exemplo entre zero e 120). Estamos a confiar cegamente no utilizador. No entanto todos nós sabemos que, mesmo sem intenção, qualquer utilizador se engana inúmeras vezes e deseja que o programa que está a utilizar seja suficientemente robusto para aguentar isso. A classe onde se encontra este conjunto de instruções não é uma boa classe cliente da classe Person pois não segue a metodologia do desenho por contrato: não se certifica que a pré-condição do método setage() é verdadeira antes de o invocar. Como exprimir asserções? Ou seja, como exprimir a especificação? A aplicação destas regras e dos princípios da programação por contrato leva-nos a exigir um muito maior rigor na forma como exprimimos as pré e as pós-condições: 1. Não podem ser ambíguas pois são elas que estabelecem o contrato; 2. Devem estar sempre acessíveis aos autores das classes cliente; 3. A pré-condição deve poder ser testada nas classes cliente; 4. Outras restrições que se prendem com a verificação e monitorização de contratos (mais adiante). A primeira destas restrições resolve-se usando uma linguagem para escrita de asserções que tenha uma sintaxe e uma semântica bem definidas. A segunda restrição obriga a um esforço, que é recompensador, de documentação da classe através da especificação dos contratos para os vários métodos. A terceira restrição resolve-se exprimindo as pré-condições à custa de elementos acessíveis na classe fornecedora (veremos mais adiante o que isto significa). 10 Introdução à Programação 2004/2005
13 A linguagem de especificação Existem várias linguagens de especificação de contratos cada uma com as suas características. Existe até uma linguagem de programação que tem asserções embebidas - a linguagem Eiffel, que é usada no livro do B. Meyer. Queremos uma linguagem para a qual existam ferramentas que permitam monitorizar os contratos em tempo de execução (mais adiante neste texto), o que reduz o conjunto das candidatas. Vamos adoptar a linguagem JML Java Modeling Language ( Nesta linguagem construimos asserções como expressões booleanas do Java com umas poucas extensões. São elas: 1. \result - representa o valor de retorno de uma função; só pode ser usado nas póscondições 2. \old - aplicado a uma expressão, denota o valor que a expressão tinha imediatamente antes do método ser executado; só pode ser usado nas póscondições 3. \implies ou ==> - operador booleano binário de operandos booleanos; o seu resultado é falso quando o primeiro operando (antecedente) é verdadeiro e o segundo operando (consequente) é falso; o resultado é verdadeiro nos outros casos 4. \forall - permite verificar se todos os elementos de um dado conjunto verificam uma determinada condição; 5. \exists - permite verificar se algum elemento de um dado conjunto satisfaz uma determinada condição. Tal como apresentado acima, as asserções colocam-se no cabeçalho (em comentário) imediatamente antes do método a que respeitam e são precedidas pelos * Alterar a idade da pessoa param newage O novo valor para a idade requires newage >= ensures age() == public void setage (int newage) {. Nota: para podermos usar a função age() neste contrato JML temos que a ter declarado como pure, significando que é um método que não altera o estado dos objectos envolvidos. A assinatura de age() deveria então ser: public /*@ int age () Construção de contratos Não incluimos o corpo do método propositadamente. Vamos olhar para o contrato com os olhos do autor de uma classe cliente e esse não conhece, nem deve conhecer, a Introdução à Programação 2004/
14 forma como a classe está implementada (ou seja, não conhece os atributos privados nem o corpo dos métodos). Consideremos a pré-condição como uma expressão boolena que vai ser avaliada no estado em que o método vai iniciar a sua execução; e a pós-condição como uma expressão boolena que vai ser avaliada no estado resultante da execução do método. A pré-condição será verdadeira nos estados em que o valor do parâmetro - newage - é positivo ou zero. A pós-condição será verdadeira nos estados em que o valor retornado pela função age() (que é, como sabemos, o valor da idade do objecto em causa) é igual ao valor do parâmetro. Isto significa que o fornecedor compromete-se a alterar a idade do objecto para o valor dado na invocação do método (se esse valor for não negativo, como é "dito" na pré-condição). O autor da classe cliente tem na pré-condição a informação do teste que deve fazer antes de invocar o método: certificar-se que o valor do argumento na invocação é não negativo. Tem na pós-condição a informação de que, após a execução do método, a função age() retorna, quando invocada, o valor dado como argumento. Então ele sabe que o seguinte excerto de programa está correcto, partindo do princípio que o fornecedor também está correcto: Scanner scanner = new Scanner(System.in); Person p = new Person("Miguel", 23); System.out.println("Qual a nova idade para o " + p.name() + "?"); int nova = scanner.nextint(); if (nova >= 0){ p.setidade(nova); System.out.println("Alteração efectuada com sucesso"); else System.out.println("Idade inválida"); O autor consegue obter estas informações porque sabe o que significam as várias componentes do contrato: o identificador newage é o parâmetro ao qual será atribuído o valor da variável nova aquando da execução de p.setidade(nova); a função age() é uma função pública da classe fornecedora e portanto ele sabe da sua existência e significado. Se num contrato usamos referências a componentes privadas, que o cliente não conhece, nem é suposto ter que conhecer, obtemos um contrato que não é útil para ser usado pelas classes cliente, porque elas não o vão poder usar para controlar a invocação do método e os efeitos dessa invocação. Por exemplo: * Alterar a idade da pessoa param newage O novo valor para a idade requires ensures age() == public void setage (int newage) {. 12 Introdução à Programação 2004/2005
15 * Um dado inteiro é superior ou igual a zero? param n O O inteiro private /*@ boolean checkvalue (int n) {. Repare-se que a função checkvalue(int n) é privada e, como tal, não aparece na documentação oficial da classe. Isto significa que é impossível a qualquer classe cliente perceber a pré-condição do método setage. É também impossível a qualquer classe cliente invocar esse método de forma correcta porque, para além de não entender a pré-condição, também não a consegue testar pois a função checkvalue, sendo privada, é inacessível a qualquer classe cliente. Enunciamos então o princípio da pré-condição razoável: "A pré-condição de cada método deve: i) aparecer na documentação oficial distribuída aos autores das classes cliente; ii) ser justificável em termos da especificação apenas." e ainda a regra da disponibilidade da pré-condição: "As referências que aparecem na pré-condição devem estar todas acessíveis - públicas - para que as classes cliente as possam testar". Isto inclui: funções públicas, argumentos dos métodos, constantes públicas. Não inclui: informação privada e métodos que alterem o estado (que não sejam pure). Voltando ao princípio da não-redundância Um entusiasta da programação defensiva poderá contrapôr: "posso obter o mesmo efeito que a partir das pré-condições fazendo com que o método retorne um código que identifique o (in)sucesso da operação", por exemplo: * Alterar a idade da pessoa se a nova idade for igual * ou superior a zero (usando programação defensiva) param newage O novo valor para a idade return 0 se newage >= 0; 1 caso contrário public int setage (int newage) { if (newage >= 0) { age = newage; return 0; else return 1; As alterações estão em sublinhado. Nas classes cliente apresentadas anteriormente seriam feitas as seguintes modificações: Scanner scanner = new Scanner(System.in); Person p = new Person("Miguel", 23); Introdução à Programação 2004/
16 e System.out.println("Qual a nova idade para o " + p.name() + "?"); int nova = scanner.nextint(); if (p.setage(nova) == 1) System.out.println("Idade inválida"); Scanner scanner = new Scanner(System.in); Person p = new Person("Miguel", 34); System.out.println("Depois do tratamento de rejuvenescimento, + quantos anos acha que " + p.name() + " rejuvenesceu?"); int anos = scanner.nextint(); int nova = p.idade() - anos; // Nova idade "estética" if (p.setage(nova) == 1) p.setidade(0); Lembrar que, sendo agora o método setage uma função, a sua invocação retorna um valor, valor esse que é testado para verificar do insucesso da operação. Ou seja, contrariamente à abordagem anterior, nesta invoca-se primeiro e verifica-se depois se a invocação era válida. Este tipo de abordagem tem vários inconvenientes. i) são feitos, sempre, dois testes à legalidade da execução - um aquando da execução do método invocado e outro para saber se teve sucesso ou não; ii) quanto maior a quantidade de instruções que se têm que escrever, maior é o número potencial de erros; iii) vai contra o princípio de que as funções não devem alterar o estado. O entusiasta da programação defensiva de que falámos atrás pode aceitar estes argumentos e aceitar que a dele não é realmente a melhor solução. Mas também vai dizer: "Mas assim posso construir programas errados e ninguém me avisa!". Claro que foi avisado! No método setage está bem clara a condição sob a qual o método funciona bem Porque é que aceitamos tão bem que a culpa é nossa quando, por exemplo, invocamos a divisão com um divisor nulo? - "Oops, claro que não posso dividir por zero!" Ou quando invocamos a raiz quadrada com um argumento negativo? - "Oops, claro que, no domínio dos reais, não posso calcular a raiz de um número negativo!" Porque é que não aceitamos tão bem que, embora sejamos avisados que o argumento tem que ser positivo ou zero, o método setage possa não funcionar bem quando invocado com um argumento negativo? Temos que ser criadores responsáveis de classes cliente e respeitar os contratos que as classes fornecedoras estabelem connosco. Claro que, até termos uma boa convicção de que as nossas classes estão correctas do ponto de vista do cumprimento dos contratos, devemos ter alguma hipótese de controlar o fluxo de execução de modo a percebermos onde é que os contratos estão a ser violados. Existem ferramentas associadas a algumas linguagens de asserções (nomeadamente o JML) que permitem fazer a monitorização dos nossos programas em tempo de execução detectando assim qualquer violação nos contratos das classes. (mais adiante neste texto). 14 Introdução à Programação 2004/2005
17 Invariantes Pré e pós-condições descrevem propriedades de métodos. Temos também qur ser capazes de exprimir propriedades globais das instâncias das classes. Fazêmo-lo através da invariante da classe * Uma classe que descreve uma pessoa, seu nome e idade. public class Person { invariant name()!= null && age() >= 0 ; * Nome da pessoa private String name; * A idade da pessoa private int age; * Construtor public Pessoa (String name, int age) { this.name = name; this.age = age; * Nome da pessoa public /*@ String name () { return name; * A idade da pessoa public /*@ int age () { return age; * Alterar a idade da pessoa param newage O novo valor para a idade requires newage >= ensures age() == public void setage (int newage) { age = newage. Introdução à Programação 2004/
18 //fim da classe Person Neste caso, a asserção invariante significa: durante toda a "vida" de todas as instâncias da classe Person, a função name() deverá ter um valor diferente de null e a função age() deverá ter um valor não negativo. Todos os métodos não construtores deverão preservar a invariante e os métodos construtores deverão estabelecer a invariante, ou seja, só deverão criar objectos que satisfaçam a invariante. Pela pós-condição do método setage, verificamos que o valor da função age(), ou seja, a idade da pessoa, irá ficar com o valor do parâmetro newage. Então, para que a invariante seja preservada, devemos exigir que o valor de newage seja não negativo: daí a pré-condição ser newage >= 0. Sabendo que o estado de um objecto é o conjunto de valores de todos os seus atributos (e que, portanto, caracteriza o objecto num dado instante da execução do programa), definimos estados estáveis como aqueles nos quais o objecto é visível do exterior. Ou seja, depois da criação da instância e antes e depois de cada invocação sobre a instância partindo do exterior. As invariantes são válidas nos estados estáveis. Permitimos que temporariamente o objecto não verifique a invariante, quando está em vias de executar uma série de tarefas internas. Chamadas qualificadas obj.meth(), executadas por clientes, são as únicas que têm de partir de um estado que verifique a invariante e têm de terminar num estado que satisfaça a invariante. Esta regra não se aplica a chamadas não qualificadas meth(), ou seja, internas à classe. Correcção de uma classe Quando é que uma classe está correcta relativamente à sua especificação, ou seja, às suas asserções? Sabemos que um construtor é sempre invocado num estado em que os atributos do (novo) objecto têm os valores por omissão para os seus tipos. Chamemos a este estado Omissão. Uma classe está correcta relativamente às suas asserções: a) Quando qualquer construtor que seja invocado num estado Omissão que também satisfaz a sua pré-condição resulte, após a sua execução, num estado que satisafaz a sua pós-condição e a invariante. b) Quando qualquer método não construtor público invocado num estado e com uns argumentos que satisfazem a sua pré-condição e a invariante resulte, após a sua execução, num estado que satisfaz a sua pós-condição e a invariante. Monitorização de classes Vimos até agora duas grandes aplicações dos contratos no desenvolvimento de software: criação de documentação de uma classe os contratos descrevem de uma forma concisa e precisa a forma como os métodos de uma classe podem e 16 Introdução à Programação 2004/2005
19 devem ser usados (pré e pós-condições) e as características das instâncias da classe (invariantes); ajuda à implementação dos métodos a que respeitam os contratos definem a semântica ou significado dos métodos, dizendo-nos, portanto, qual deve ser o efeito da sua execução (pós-condição e invariante) a partir de um estado com determinadas propriedades (pré-condições e invariante). Para além deste duplo papel, os contratos ainda nos podem ajudar a verificar se as nossas classes estão correctas relativamente à especificação, ou seja, se a implementação dos métodos está de acordo com a especificação fornecida pelos contratos. Ajudam-nos também a verificar se uma classe cliente é bem comportada, ou seja, se invoca os métodos com as pré-condições satisfeitas. Não vamos aqui referir nenhuma ferramenta que nos permite verificar de facto, e sem sombra de dúvida, se a classe está correcta. Informamos apenas que ferramentas destas existem que, de forma mais ou menos complicada, permitem este tipo de verificação. Referimos aqui outro tipo de ferramentas de monitorização de asserções em tempo de execução que, embora não nos permitam decidir, sem dúvidas, que uma classe está correcta relativamente a uma especificação, permitem-nos, no entanto, testar se os contratos são respeitados pelas classes envolvidas. Isto é feito testando a execução dos programas, verificando, a cada invocação, a validade dos contratos. Existem ferramentas, nomeadamente o JML run-time assertion checker, que funcionam como pré-processadores, gerando código de monitorização e inserindo-o em locais bem definidos das nossas classes. Assim, se usarmos o pré-processador do JML na nossa classe Person, por exemplo, vamos obter uma nova classe Person instrumentalizada ou seja, com instruções Java acrescentadas automaticamente, que verificam as pré-condições e a invariante antes da execução de qualquer método e código que verifica as pós-condições e a invariante no fim da execução de cada método, antes do seu retorno. O método setage(), por exemplo, ficaria assim: * Alterar a idade da pessoa param newage O novo valor para a idade requires newage >= ensures age() == public void setage (int newage) { instruções em Java que verificam: name()!= null && age() >= 0 newage >= 0 age = newage instruções em Java que verificam: age() == newage name()!= null && age() >= 0 // invariante // pré-condição // instruções do método // pós-condição // invariante Introdução à Programação 2004/
20 Estas instruções que verificam o contrato são geradas automaticamente e, portanto, são isentas de erros. De seguida compilamos as nossas classes da forma habitual e executamo-las. Se executarmos o nosso sistema várias vezes, para valores e situações relevantes, ficamos com um pouco mais de confiança na correcção das nossas classes, embora essa confiança não possa ser absoluta, já que se tratam de testes. As instruções geradas automaticamente que verificam os contratos estão feitas de forma a gerarem excepções em tempo de execução sempre que algum contrato é violado. Essas excepções podem ser de vários tipos, como seria de esperar: por exemplo, violação de pré-condição, de pós-condição e de invariante. Indicam ainda o método onde ocorreu a violação do contrato, tornando simples a correcção do erro. Relembre que uma violação de uma pré-condição é um erro na classe cliente e uma violação de uma pós-condição ou de um invariante é um erro na classe fornecedora. Resumindo e concluindo Alguns passos a seguir na construção de classes e seus contratos: 1. Decidir, a partir dos requisitos para a classe a construir, quais as funções que revelam o estado. Estas funções não têm pós-condição, mas, se tiverem algum parâmetro, podem ter pré-condição para controlar os valores desse(s) parâmetro(s); 2. Construir a asserção invariante; 3. Decidir quais os outros métodos que a classe tem que oferecer às suas classes cliente - para cada um decidir se é procedimento ou função, se tem parâmetros e, caso afirmativo, quais e de que tipo; 4. Documentar, escrevendo um cabeçalho javadoc, cada um desses métodos com uma descrição sucinta do que representa e, se tiver parâmetros, uma descrição de cada um deles; 5. Para cada um desses métodos construir o seu contrato e adicioná-lo à sua documentação. Este contrato irá ser, directa ou indirectamente, definido à custa das funções reveladoras do estado identificadas em 1; 6. Não usar atributos nos contratos para que não seja necessário refazê-los em caso de uma mudança na representação. De uma forma mais geral, não usar informação privada nos contratos para que as classes cliente os possam entender e, no caso das pré-condições, os possam testar. 7. Escolher uma representação para a classe através da escolha dos atributos e seus tipos; 8. Finalmente, implementar cada um dos métodos de acordo com a sua póscondição e com a invariante, e sabendo que o estado inicial de execução do método é um estado que satisfaz a invariante e a sua pré-condição. Em particular, nunca testar a pré-condição no corpo do método. Utilização de asserções: Metodologia para escrever software correcto; 18 Introdução à Programação 2004/2005
21 Preparação de documentação: asserções informam os clientes de uma classe sobre os serviços disponibilizados por essa classe, expressos de uma forma concisa e precisa; Dependendo da existência de ferramentas de monitorização das asserções, permitem o teste e depuração das classes. Monitorização de asserções em tempo de execução: P: Porquê monitorização em tempo de execução? R:Trata-se de uma alternativa à prova de correcção de software. P: Qual o efeito das asserções em tempo de execução? R: Depende do programador, baseado em opções de compilação; um efeito pode ser o lançamento de excepções cada vez que ocorre a violação de alguma asserção. P: Quanta monitorização? R: Compromisso entre: a) quão confiamos na correcção do nosso software; b) quão crucial é obter o máximo de eficiência; c) quão sérias são as consequências de erros não detectados. Um bom compromisso pode ser: em tempo de testes, monitorizar todas as asserções; em produção testar apenas as pré-condições. in "V.Vasconcelos, Guião de Programação Imperativa, FCUL, Setembro 2001" Bibliografia B.Meyer, Object-Oriented Software Construction, Prentice Hall 1997, 2a edição, ISBN: V.Vasconcelos, Guião de Programação Imperativa, DI-FCUL, Setembro Introdução à Programação 2004/
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
Leia maisResolução de sistemas lineares
Resolução de sistemas lineares J M Martínez A Friedlander 1 Alguns exemplos Comecemos mostrando alguns exemplos de sistemas lineares: 3x + 2y = 5 x 2y = 1 (1) 045x 1 2x 2 + 6x 3 x 4 = 10 x 2 x 5 = 0 (2)
Leia maisComputação II Orientação a Objetos
Computação II Orientação a Objetos Fabio Mascarenhas - 2014.1 http://www.dcc.ufrj.br/~fabiom/java Introdução Esse não é um curso de Java! O objetivo é aprender os conceitos da programação orientada a objetos,
Leia mais9 Comandos condicionais
9 Comandos condicionais Um comando condicional é uma instrução empregada quando se deseja criar um desvio, isto é, a opção de executar-se ou não um determinado trecho de código, segundo uma condição. Em
Leia maisEstrutura Condicional em Java
Estrutura Condicional em Java Linguagem de Programação 1 O Java contém três tipos de instruções de seleção. A instrução if realiza uma ação se uma condição for verdadeira ou pula a ação se a condição for
Leia maisAula 4 Estatística Conceitos básicos
Aula 4 Estatística Conceitos básicos Plano de Aula Amostra e universo Média Variância / desvio-padrão / erro-padrão Intervalo de confiança Teste de hipótese Amostra e Universo A estatística nos ajuda a
Leia maisAlgoritmos e Programação II. Sobrecarga
Algoritmos e Programação II Baseado no Material do Prof. Júlio Machado Sobrecarga Em várias linguagens é comum encontrarmos rotinas que fazem basicamente a mesma coisa, porém, têm nomes distintos porque
Leia maisAV1 - MA 12-2012. (b) Se o comprador preferir efetuar o pagamento à vista, qual deverá ser o valor desse pagamento único? 1 1, 02 1 1 0, 788 1 0, 980
Questão 1. Uma venda imobiliária envolve o pagamento de 12 prestações mensais iguais a R$ 10.000,00, a primeira no ato da venda, acrescidas de uma parcela final de R$ 100.000,00, 12 meses após a venda.
Leia mais5 - Vetores e Matrizes Linguagem C CAPÍTULO 5 VETORES E MATRIZES
CAPÍTULO 5 5 VETORES E MATRIZES 5.1 Vetores Um vetor armazena uma determinada quantidade de dados de mesmo tipo. Vamos supor o problema de encontrar a média de idade de 4 pessoas. O programa poderia ser:
Leia maisCurvas em coordenadas polares
1 Curvas em coordenadas polares As coordenadas polares nos dão uma maneira alternativa de localizar pontos no plano e são especialmente adequadas para expressar certas situações, como veremos a seguir.
Leia maisResoluçã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
Leia maisExercí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 maisTÉCNICAS DE PROGRAMAÇÃO
TÉCNICAS DE PROGRAMAÇÃO (Adaptado do texto do prof. Adair Santa Catarina) ALGORITMOS COM QUALIDADE MÁXIMAS DE PROGRAMAÇÃO 1) Algoritmos devem ser feitos para serem lidos por seres humanos: Tenha em mente
Leia maisUm jogo de preencher casas
Um jogo de preencher casas 12 de Janeiro de 2015 Resumo Objetivos principais da aula de hoje: resolver um jogo com a ajuda de problemas de divisibilidade. Descrevemos nestas notas um jogo que estudamos
Leia maisESTENDENDO A UML PARA REPRESENTAR RESTRIÇÕES DE INTEGRIDADE
ESTENDENDO A UML PARA REPRESENTAR RESTRIÇÕES DE INTEGRIDADE Fabiana Gomes Marinho Faculdade Lourenço Filho Resumo: Na UML, a modelagem conceitual dos dados é descrita pelo diagrama de classes, que através
Leia maisÍndice. Como aceder ao serviço de Certificação PME? Como efectuar uma operação de renovação da certificação?
Índice Como aceder ao serviço de Certificação PME? Como efectuar uma operação de renovação da certificação? Como efectuar uma operação de confirmação de estimativas? Como aceder ao Serviço de Certificação
Leia maisDesenvolvimento OO com Java Orientação a objetos básica
Desenvolvimento OO com Java Orientação a objetos básica Vítor E. Silva Souza (vitor.souza@ufes.br) http://www.inf.ufes.br/~vitorsouza Departamento de Informática Centro Tecnológico Universidade Federal
Leia maisMODELAGEM VISUAL DE OBJETOS COM UML DIAGRAMA DE CLASSES. lucelia.com@gmail.com
MODELAGEM VISUAL DE OBJETOS COM UML DIAGRAMA DE CLASSES lucelia.com@gmail.com Externamente ao sistema, os atores visualizam resultados de cálculos, relatórios produzidos, confirmações de requisições solicitadas,
Leia maisGráficos de funções em calculadoras e com lápis e papel (*)
Rafael Domingos G Luís Universidade da Madeira/Escola Básica /3 São Roque Departamento de Matemática Gráficos de funções em calculadoras e com lápis e papel (*) A difusão de calculadoras gráficas tem levado
Leia maisAula 3 Desvio Condicional
Aula 3 Desvio Condicional ROTEIRO DA AULA Desvio Condicional Simples Desvio Condicional Composto Desevio Condicional Aninhado Desvio Condicional em JAVA 2 DESVIO CONDICIONAL Um desvio condicional é usado
Leia maisGuia de utilização da notação BPMN
1 Guia de utilização da notação BPMN Agosto 2011 2 Sumário de Informações do Documento Documento: Guia_de_utilização_da_notação_BPMN.odt Número de páginas: 31 Versão Data Mudanças Autor 1.0 15/09/11 Criação
Leia maisMúltiplos Estágios processo com três estágios Inquérito de Satisfação Fase II
O seguinte exercício contempla um processo com três estágios. Baseia-se no Inquérito de Satisfação Fase II, sendo, por isso, essencial compreender primeiro o problema antes de começar o tutorial. 1 1.
Leia maisOrientaçã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 maisLinguagem de Programação JAVA. Técnico em Informática Professora Michelle Nery
Linguagem de Programação JAVA Técnico em Informática Professora Michelle Nery Agenda Regras paravariáveis Identificadores Válidos Convenção de Nomenclatura Palavras-chaves em Java Tipos de Variáveis em
Leia maisExercícios Teóricos Resolvidos
Universidade Federal de Minas Gerais Instituto de Ciências Exatas Departamento de Matemática Exercícios Teóricos Resolvidos O propósito deste texto é tentar mostrar aos alunos várias maneiras de raciocinar
Leia maisLinguagem e Técnicas de Programação I Tipos de dados, variáveis e constantes. Prof. MSc. Hugo Souza Material desenvolvido por: Profa.
Linguagem e Técnicas de Programação I Tipos de dados, variáveis e constantes Prof. MSc. Hugo Souza Material desenvolvido por: Profa. Ameliara Freire Tipos de dados Os programas manipulam dados, armazenando-os
Leia maisJavaScript (ou JScript)
1. Introdução JavaScript (ou JScript) Uma linguagem como o JavaScript permite criar interfaces interativas na web (permite a interação do usuário). Para desenvolver web sites interativos precisamos de
Leia maisConceitos básicos da linguagem C
Conceitos básicos da linguagem C 2 Em 1969 Ken Thompson cria o Unix. O C nasceu logo depois, na década de 70. Dennis Ritchie, implementou-o pela primeira vez usando o sistema operacional UNIX criado por
Leia maisNota prévia. Convenções
Nota prévia O draft de diagrama de componentes, e respectivas interfaces, foi actualizado pela última vez em 07/12/2007. Este draft servirá de base para as implementações do CyberChair. Caso detecte alguma
Leia maisCálculo em Computadores - 2007 - trajectórias 1. Trajectórias Planas. 1 Trajectórias. 4.3 exercícios... 6. 4 Coordenadas polares 5
Cálculo em Computadores - 2007 - trajectórias Trajectórias Planas Índice Trajectórias. exercícios............................................... 2 2 Velocidade, pontos regulares e singulares 2 2. exercícios...............................................
Leia mais4Distribuição de. freqüência
4Distribuição de freqüência O objetivo desta Unidade é partir dos dados brutos, isto é, desorganizados, para uma apresentação formal. Nesse percurso, seção 1, destacaremos a diferença entre tabela primitiva
Leia mais15 a Aula Subprogramação /Subalgoritmos Função e Procedimento
FISP 1/6 15 a Aula Subprogramação /Subalgoritmos Função e Procedimento Objetivo: Simplificação e racionalização na elaboração de algoritmos mais complexos Recursos: Estruturação de algoritmos e modularização
Leia maisO comando switch. c Professores de ALPRO I 04/2012. Faculdade de Informática PUCRS. ALPRO I (FACIN) O comando switch 04/2012 1 / 31
O comando switch c Professores de ALPRO I Faculdade de Informática PUCRS 04/2012 ALPRO I (FACIN) O comando switch 04/2012 1 / 31 Sumário 1 Relembrando... 2 Comando de Seleção (Parte III) Menus e o comando
Leia mais2 Pesquisa de valores em uma lista de dados
2 Pesquisa de valores em uma lista de dados 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...3 Funções PROCV e PROCH...3 PROCV...3
Leia maisNotas sobre a Fórmula de Taylor e o estudo de extremos
Notas sobre a Fórmula de Taylor e o estudo de etremos O Teorema de Taylor estabelece que sob certas condições) uma função pode ser aproimada na proimidade de algum ponto dado) por um polinómio, de modo
Leia maisComandos de repetição while
Programação de Computadores I UFOP DECOM 2014 2 Aula prática 6 Comandos de repetição while Resumo Nesta aula vamos trabalhar com problemas cuja solução envolve realizar um cálculo ou tarefa repetidas vezes,
Leia maisProgramação por Objectos. Java
Programação por Objectos Java Parte 6: Herança e Polimorfismo LEEC@IST Java 1/52 Herança revisão A herança é um mecanismo em que a subclasse constitui uma especialização da superclasse. A superclasse pode
Leia maisComo erguer um piano sem fazer força
A U A UL LA Como erguer um piano sem fazer força Como vimos na aula sobre as leis de Newton, podemos olhar o movimento das coisas sob o ponto de vista da Dinâmica, ou melhor, olhando os motivos que levam
Leia maisSistemas de Apoio à Decisão
Sistemas de Apoio à Decisão Processo de tomada de decisões baseia-se em informação toma em consideração objectivos toma em consideração conhecimento sobre o domínio. Modelar o processo de tomada de decisões
Leia maisARQUITECTURA DE COMPUTADORES CAPÍTULO II AULA X
ARQUITECTURA DE COMPUTADORES CAPÍTULO II AULA X Índice Traduzindo e iniciando uma aplicação Compiladores Assembladores Linkers Loaders DLLs Iniciando um programa em Java Após toda a matéria abordada nesta
Leia maisAná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
Leia maisAlgoritmos Estruturas Seqüenciais. José Gustavo de Souza Paiva
Algoritmos Estruturas Seqüenciais José Gustavo de Souza Paiva 1 Introdução Objetivo básico da computação auxiliar os seres humanos em trabalhos repetitivos e braçais, diminuindo i i d esforços e economizando
Leia maisB2S SISTEMAS DE INFORMAÇÃO, LDA. RUA ARTILHARIA UM, Nº 67 3º FRT. 1250-038 LISBOA TEL: 21 385 01 09 - FAX: 21 012 52 25 E-MAIL B2S@B2S.
Procedimentos Abertura/Fecho Ano Primavera V750 B2S SISTEMAS DE INFORMAÇÃO, LDA. RUA ARTILHARIA UM, Nº 67 3º FRT. 1250-038 LISBOA TEL: 21 385 01 09 - FAX: 21 012 52 25 E-MAIL B2S@B2S.PT MCRC LISBOA 11492
Leia maisTarefa Orientada 18 Procedimentos armazenados
Tarefa Orientada 18 Procedimentos armazenados Objectivos: Criar Procedimentos armazenados Chamar procedimentos armazenados Utilizar parâmetros de entrada e de saída Um procedimento armazenado representa
Leia maisINTRODUÇÃO À LINGUAGEM C++
INTRODUÇÃO À LINGUAGEM C++ 1 - VARIÁVEIS Variáveis espaço de memória reservado para armazenar tipos de dados, com um nome para referenciar seu conteúdo. Observações importantes Todas as variáveis devem
Leia mais5 Apresentando a linguagem C
5 Apresentando a linguagem C O criador da linguagem de programação C foi Dennis Ritchie que, na década de 70, programou-a por meio de um computador DEC PDP-11 rodando sistema operacional Unix. Entretanto,
Leia mais3.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:
Leia mais4.4. UML Diagramas de interacção
Engenharia de Software 4.4. UML Diagramas de interacção Nuno Miguel Gil Fonseca nuno.fonseca@estgoh.ipc.pt Um diagrama de interacção mostra um padrão de interacção entre vários objectos, com objectos e
Leia maisBem-vindo ao tópico sobre administração de listas de preços.
Bem-vindo ao tópico sobre administração de listas de preços. Nesse tópico, você aprenderá a administrar listas de preços no SAP Business One. Sua empresa atualiza múltiplas listas de preços para fornecer
Leia maisAula 12: Funções. Pré-requisitos: Todas as aulas anteriores deste módulo. 1. Aproveitando Códigos no Programa
Aula 12: Funções Nesta aula explicaremos o que são e como usar funções nos seus programas em JavaScript. Você aprenderá como elas podem receber e retornar valores à estrutura que as acionou. Entenderá
Leia maisPROGRAMAÇÃ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
Leia maisIntrodução ao estudo de equações diferenciais
Matemática (AP) - 2008/09 - Introdução ao estudo de equações diferenciais 77 Introdução ao estudo de equações diferenciais Introdução e de nição de equação diferencial Existe uma grande variedade de situações
Leia maisDocumento SGS. PLANO DE TRANSIÇÃO da SGS ICS ISO 9001:2008. PTD3065 - v010-2008-11 Pág 1 de 6
PLANO DE TRANSIÇÃO da SGS ICS ISO 9001:2008 PTD3065 - v010-2008-11 Pág 1 de 6 1 Introdução A ISO 9001:2008 e o Processo de Transição da SGS ICS A International Organization for Standardization (ISO) publicou,
Leia maisInformática de Gestão 1º ano / 1º semestre Ano letivo: 2014/2015. Visual Basic VBA
Informática de Gestão 1º ano / 1º semestre Ano letivo: 2014/2015 Visual Basic VBA Macros Funções Conjunto de instruções que são executadas sempre que se desejar e pela ordem apresentada As funções são
Leia maisAula 4 Conceitos Básicos de Estatística. Aula 4 Conceitos básicos de estatística
Aula 4 Conceitos Básicos de Estatística Aula 4 Conceitos básicos de estatística A Estatística é a ciência de aprendizagem a partir de dados. Trata-se de uma disciplina estratégica, que coleta, analisa
Leia maisPortal do Projeto Tempo de Ser
Sumário Portal do Projeto Tempo de Ser O que é um Wiki?...2 Documentos...2 Localizando documentos...3 Links...3 Criando um Documento...4 Criando um link...4 Editando um Documento...5 Sintaxe Básica...5
Leia maisTrabalho 3: Agenda de Tarefas
INF 1620 Estruturas de Dados Semestre 08.2 Trabalho 3: Agenda de Tarefas O objetivo deste trabalho é a implementação de um conjunto de funções para a manipulação de uma agenda de tarefas diárias, de forma
Leia maisUML (Unified Modelling Language) Diagrama de Classes
UML (Unified Modelling Language) Diagrama de Classes I Classes... 2 II Relações... 3 II. Associações... 3 II.2 Generalização... 9 III Exemplos de Modelos... III. Tabelas de IRS... III.2 Exames...3 III.3
Leia maisSobre o Sistema FiliaWEB
Setembro/2009 SUMÁRIO SOBRE O SISTEMA FILIAWEB... 3 I - PAPÉIS E RESPONSABILIDADES NA NOVA SISTEMÁTICA DAS LISTAS DE FILIAÇÃO PARTIDÁRIA... 4 II CADASTRAMENTO DE USUÁRIO... 5 III REGISTRO DE FILIADOS...
Leia maisREPRESENTAÇÃO DE DADOS EM SISTEMAS DE COMPUTAÇÃO AULA 03 Arquitetura de Computadores Gil Eduardo de Andrade
REPRESENTAÇÃO DE DADOS EM SISTEMAS DE COMPUTAÇÃO AULA 03 Arquitetura de Computadores Gil Eduardo de Andrade O conteúdo deste documento é baseado no livro Princípios Básicos de Arquitetura e Organização
Leia maisA Torre de Hanói e o Princípio da Indução Matemática
A Torre de Hanói e o Princípio da Indução Matemática I. O jogo A Torre de Hanói consiste de uma base com três pinos e um certo número n de discos de diâmetros diferentes, colocados um sobre o outro em
Leia maisLÓGICA DE PROGRAMAÇÃO. Professor Celso Masotti http://ead.celsomasotti.com.br
LÓGICA DE PROGRAMAÇÃO Professor Celso Masotti http://ead.celsomasotti.com.br Ano: 2015 1 HTML & PHP em Ambiente Web PARTE II Sumário I Decisão... 4 Operadores de Comparação... 6 II IF ELSEIF ELSE... 7
Leia maisTRUQUE: DESLIGUE OS AVISOS DE E-MAIL
semelhança de um alerta externo de nova mensagem, terão impacto negativo na profundidade com que mergulha num dado assunto. O caminho para otimizar a focalização passa, pois, e também, por uma boa perceção
Leia maisProcesso de Bolonha. Regime de transição na FCTUC
Processo de Bolonha Regime de transição na FCTUC Aprovado na Comissão Coordenadora do Conselho Pedagógico a 20 de Setembro de 2006, na Comissão Coordenadora do Conselho Científico a 22 de Setembro de 2006,
Leia maisProgramação Estruturada. Programação Estruturada. Idéias Básicas da Programação Estruturada
Programação Estruturada Programação Estruturada Paradigmas de Linguagens de Programação As linguagens desse paradigma são muitas vezes chamadas de linguagens convencionais, procedurais ou imperativas.
Leia maisProgramação: Estruturas de seleção
Programação de Computadores I Aula 07 Programação: Estruturas de seleção José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011-1 1/53 Valores booleanos Os valores booleanos
Leia maisNORMA BRASILEIRA DE CONTABILIDADE NBC TSC 4410, DE 30 DE AGOSTO DE 2013
NORMA BRASILEIRA DE CONTABILIDADE NBC TSC 4410, DE 30 DE AGOSTO DE 2013 Dispõe sobre trabalho de compilação de informações contábeis. O CONSELHO FEDERAL DE CONTABILIDADE, no exercício de suas atribuições
Leia maisLinguagem C Tipos de Dados. void; escalares; sizeof Vectores; strings em C Estruturas Introdução ao pré-processador
Linguagem C Tipos de Dados void; escalares; sizeof Vectores; strings em C Estruturas Introdução ao pré-processador Funções void void pode ser usado em lugar de um tipo, para indicar a ausência de valor
Leia maisCondições de utilização para a MediaPedia. 1 Generalidades/definições. 2 Objecto. 3 Registo, palavra-passe
Condições de utilização para a MediaPedia 1 Generalidades/definições 1. A MediaPedia é um serviço que permite a publicação gratuita na plataforma de informação MediaPedia, bem como o acesso a contribuições
Leia maisProgramação em papel quadriculado
4 NOME DA AULA: Programação em papel quadriculado Tempo de aula: 45 60 minutos Tempo de preparação: 10 minutos Objetivo principal: ajudar os alunos a entender como a codificação funciona. RESUMO Ao "programar"
Leia maisNotas de Cálculo Numérico
Notas de Cálculo Numérico Túlio Carvalho 6 de novembro de 2002 2 Cálculo Numérico Capítulo 1 Elementos sobre erros numéricos Neste primeiro capítulo, vamos falar de uma limitação importante do cálculo
Leia maisEstoque. Como controlar o estoque
Estoque Como controlar o estoque Por que é necessário controlar o estoque? Reduzir custos Se há excesso em estoque A empresa terá custos operacionais para manter o estoque, isto significa capital empatado
Leia maisManual do Gestor da Informação do Sistema
Faculdade de Engenharia da Universidade do Porto Licenciatura Informática e Computação Laboratório de Informática Avançada Automatização de Horários Manual do Gestor da Informação do Sistema João Braga
Leia maisProgramação por Objectos. Java
Programação por Objectos Java Parte 3: Métodos LEEC@IST Java 1/45 Métodos (1) Sintaxe Qualif Tipo Ident ( [ TipoP IdentP [, TipoP IdentP]* ] ) { [ Variável_local Instrução ]* Qualif: qualificador (visibilidade,
Leia maisProgramação Orientada a Objectos - P. Prata, P. Fazendeiro. Cartão de fidelização de clientes das distribuidoras de combustível.
Caso de estudo O cartão fidelidade Cartão de fidelização de clientes das distribuidoras de combustível. Definição em JAVA da classe CartaoFidelidade, que deverá apresentar uma funcionalidade semelhante
Leia maisGestão do Risco e da Qualidade no Desenvolvimento de Software
Gestão do Risco e da Qualidade no Desenvolvimento de Software Questionário Taxinómico do Software Engineering Institute António Miguel 1. Constrangimentos do Projecto Os Constrangimentos ao Projecto referem-se
Leia maisUniversidade da Beira Interior Cursos: Engenharia Informática, Ensino da Informática, Matemática Aplicada e Matemática /Informática
Modelos de Dados 1 - Introdução 2 - Modelo Relacional 2.1. Estrutura de Dados Relacional 2.1.1. Modelo Conceptual de Dados Um modelo conceptual de dados é a representação de um conjunto de objectos e das
Leia maisComputação II - Java Prof. Adriano Joaquim de Oliveira Cruz Aula Prática - Herança, Polimorfismo e Construtores
Computação II - Java Prof. Adriano Joaquim de Oliveira Cruz Aula Prática - Herança, Polimorfismo e Construtores 1 Exercícios Exercício 1: Construtores e Testes Analise a classe Conta.java, mostrada na
Leia maisO Princípio da Complementaridade e o papel do observador na Mecânica Quântica
O Princípio da Complementaridade e o papel do observador na Mecânica Quântica A U L A 3 Metas da aula Descrever a experiência de interferência por uma fenda dupla com elétrons, na qual a trajetória destes
Leia maisComentários à Consulta Pública da CMVM nº 3/2009 sobre Análise Financeira e Certificação da Qualificação Profissional na Intermediação Financeira
Comentários à Consulta Pública da CMVM nº 3/2009 sobre Análise Financeira e Certificação da Qualificação Profissional na Intermediação Financeira I. Art.º 8º (Registo) Na redacção ora proposta para a alínea
Leia maisTrabalho de Desenvolvimento de Sistemas de Software GereComSaber 2ª Fase
Universidade do Minho Departamento de Informática Desenvolvimento de Sistemas de Software Trabalho de Desenvolvimento de Sistemas de Software GereComSaber 2ª Fase Luana Georgia Lopes Telha nº 49379 Luís
Leia maisPROGRAMAÇÃO ESTRUTURADA. CC 2º Período
PROGRAMAÇÃO ESTRUTURADA CC 2º Período PROGRAMAÇÃO ESTRUTURADA Aula 06: Ponteiros Declarando e utilizando ponteiros Ponteiros e vetores Inicializando ponteiros Ponteiros para Ponteiros Cuidados a serem
Leia maisÉtica no exercício da Profissão
Titulo: Ética no exercício da Profissão Caros Colegas, minhas Senhoras e meus Senhores, Dr. António Marques Dias ROC nº 562 A nossa Ordem tem como lema: Integridade. Independência. Competência. Embora
Leia maisBarómetro Regional da Qualidade Avaliação da Satisfação dos Utentes dos Serviços de Saúde
Avaliação da Satisfação dos Utentes dos Serviços de Saúde Entidade Promotora Concepção e Realização Enquadramento Avaliação da Satisfação dos Utentes dos Serviços de Saúde Índice RESUMO EXECUTIVO...
Leia maisIntroduçã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
Leia maisRealização. Conselho Brasileiro de Manejo Florestal FSC Brasil. www.fsc.org.br
C e rtificação gr u p o em Realização Apoio Conselho Brasileiro de Manejo Florestal FSC Brasil www.fsc.org.br 28 01 C er t ifi ca çã o emgrupo em Realização Apoio Conselho Brasileiro de Manejo Florestal
Leia maisResolução eficaz de problemas: quatro exemplos
JFF6-0 Resolução eficaz de problemas: quatro exemplos Em Março participarei no evento Que Matemática para a Sociedade de Informação?, organizado pelo grupo FAST da Universidade do Minho, cujo objectivo
Leia maisPROJETO DE REDES www.projetoderedes.com.br
PROJETO DE REDES www.projetoderedes.com.br Curso de Tecnologia em Redes de Computadores Disciplina: Tópicos Avançados II 5º período Professor: José Maurício S. Pinheiro AULA 3: Políticas e Declaração de
Leia maisIndicamos inicialmente os números de cada item do questionário e, em seguida, apresentamos os dados com os comentários dos alunos.
Os dados e resultados abaixo se referem ao preenchimento do questionário Das Práticas de Ensino na percepção de estudantes de Licenciaturas da UFSJ por dez estudantes do curso de Licenciatura Plena em
Leia maisCondições Gerais Programa de fidelidade O CLUBE FITNESSBOUTIQUE Junho 2011
Condições Gerais Programa de fidelidade O CLUBE FITNESSBOUTIQUE Junho 2011 O programa de fidelidade O Clube Fitnessboutique foi criado pela Sociedade Netquattro SAS, Sociedade anónima com um capital de
Leia maisARRAYS. 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
Leia maisProgramação Orientada a Objeto
Programação Orientada a Objeto Classes, Atributos, Métodos e Objetos Programação de Computadores II Professor: Edwar Saliba Júnior 1) Java é uma linguagem orientada a objetos. Para que possamos fazer uso
Leia mais7. Estrutura de Decisão
7. Estrutura de Decisão Neste tipo de estrutura o fluxo de instruções a ser seguido é escolhido em função do resultado da avaliação de uma ou mais condições. Uma condição é uma expressão lógica. A classificação
Leia maisQUANTIFICADORES. Existem frases declarativas que não há como decidir se são verdadeiras ou falsas. Por exemplo: (a) Ele é um campeão da Fórmula 1.
LIÇÃO 4 QUANTIFICADORES Existem frases declarativas que não há como decidir se são verdadeiras ou falsas. Por exemplo: (a) Ele é um campeão da Fórmula 1. (b) x 2 2x + 1 = 0. (c) x é um país. (d) Ele e
Leia maisEstatística II Antonio Roque Aula 9. Testes de Hipóteses
Testes de Hipóteses Os problemas de inferência estatística tratados nas aulas anteriores podem ser enfocados de um ponto de vista um pouco diferente: ao invés de se construir intervalos de confiança para
Leia maisResolução da Prova de Raciocínio Lógico do TCE/SP, aplicada em 06/12/2015.
de Raciocínio Lógico do TCE/SP, aplicada em 6/12/215. Raciocínio Lógico p/ TCE-SP Na sequência, criada com um padrão lógico-matemático, (1; 2; 1; 4; 2; 12; 6; 48; 24;...) o quociente entre o 16º termo
Leia maisCONCEITOS BÁSICOS PARA A CONSTRUÇÃO DE ALGORITMOS PARA COMPUTADORES. Isac Aguiar isacaguiar.com.br isacaguiar@gmail.com
CONCEITOS BÁSICOS PARA A CONSTRUÇÃO DE ALGORITMOS PARA COMPUTADORES Isac Aguiar isacaguiar.com.br isacaguiar@gmail.com Objetivos Compreender os conceitos de lógica de programação e de algoritmos. Conhecer
Leia maisAutor: Tiago Lone Nível: Básico Criação: 19/12/2005 Última versão: 18/12/2006. PdP. Pesquisa e Desenvolvimento de Produtos
TUTORIAL Barra de LEDs Autor: Tiago Lone Nível: Básico Criação: 19/12/2005 Última versão: 18/12/2006 PdP Pesquisa e Desenvolvimento de Produtos http://www.maxwellbohr.com.br contato@maxwellbohr.com.br
Leia mais