Prévia do material em texto
Introdução a programação utilizando Telis Versão 0.7 Florianópolis − SC Sumário 1 Instalação de Telis p. 3 2 Primeiro programa p. 4 2.1 Desenhos e Telis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 6 3 Criando Modelos e Agendas p. 9 3.1 Criando um modelo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 9 3.2 Criando agendas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 12 3.3 Publicando o programa na internet . . . . . . . . . . . . . . . . . . . . p. 13 4 Criando Agendas Parametrizáveis p. 15 4.1 Desenhando um relógio . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 15 4.2 Ponteiro dos segundos . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 16 4.3 Ponteiro dos minutos . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 19 4.4 Ponteiro das horas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 20 4.5 Colocando o relógio para funcionar . . . . . . . . . . . . . . . . . . . . p. 21 5 Usando Moldes para Remover Duplicação de Código p. 24 5.1 Movendo a agenda para o molde . . . . . . . . . . . . . . . . . . . . . . p. 24 5.2 Subindo a agenda iniciar . . . . . . . . . . . . . . . . . . . . . . . . . . p. 26 6 Comunicação entre atores p. 32 6.1 Separando modelo de visão com estímulos . . . . . . . . . . . . . . . . p. 33 6.2 Separando modelo de visão com comunicação direta . . . . . . . . . . . p. 35 7 Conclusão p. 39 3 Lição 1--Instalação de Telis Para utilizar Telis são necessários os seguintes pré-requisitos mínimos: • Java 1.5 update 4 ou superior • Internet Explorer 5.5 ou Mozilla Firefox 2 ou superior • Plugin Java para o respectivo navegador Para realizar a instalação da plataforma Java, baixe o programa de instalação do úl- timo Java Runtime Environment (JRE) encontrado no sítio: http://java.sun.com/javase/downloads. Escolha um local para salvar o arquivo em sua máquina. A operação de baixar o arquivo pode demorar vários minutos, dependendo da velocidade de sua conexão com a Internet, devido ao tamanho do arquivo. Após terminar de baixar o arquivo, execute-o com um clique duplo. A licença será exi- bida, prosseguindo com a instalação você estará automaticamente aceitando esta licença. Nesta mesma janela selecione a opção Typical Install e clique em Accept. Uma barra de progresso será exibida informando o progresso da instalação. Ao tér- mino, uma tela será exibida informando que a instação foi concluída com êxito. O próximo passo é baixar e instalar o Ambiente Telis. O Ambiente Telis está disponível paraWindows e Linux e pode ser baixado em: http://telis.edugraf.ufsc.br/desenvolvimento/versoes. Escolha o sistema operacional desejado e faça o download da última versão disponível. Em seguida descompacte o arquivo na pasta onde você deseja que o Telis seja instalado. Para executá-lo clique duas vezes no arquivo �Telis.bat� no caso do Windows, ou �Telis.sh� no caso do Linux. http://java.sun.com/javase/downloads http://telis.edugraf.ufsc.br/desenvolvimento/versoes 4 Lição 2--Primeiro programa A linguagem Telis lembra as linguagens usadas em calculadoras eletrônicas de bolso. Há uma "memória"com estrutura de pilha, que armazena os objetos a serem operados. Em uma memória de pilha, o último valor armazenado será o próximo valor a ser acessado. Este comportamento é análogo a uma pilha de pratos, ao colocar um novo prato na pilha, os outros pratos se tornam inacessíveis, o único prato que se pode tirar da pilha é aquele que acabou de ser empilhado. Após este prato ser removido da pilha o que fora colocado antes deste é o único que poderá ser removido e assim por diante. Agora será tomado como exemplo o código Telis mostrado em 2.1. Quando executado o número 2 é colocado na memória. Em seguida o número 4 é colocado sobre o número 2, pois esta memória é uma pilha. Então é executado o operador +. Este operador pega o topo e o subtopo da pilha, 4 e 2 respectivamente, realiza a operação de soma e empilha o resultado na memória. Neste momento a memória que era composta dos números 4 e 2 possui apenas o valor 6. 2 4 + Algoritmo 2.1: Operação de soma em Telis. Primeiro exemplo. A �gura 1 ilustra esta seqüência de operações. Nos passos 1 e 2 os valores são em- pilhados, e a pilha se encontrará no estado mostrado no passo 3. Então é executado o operador + no passo 4 e a pilha chega ao estado mostrado Figura 1: Ilustração passo a passo da memória durante a execução do programa 2 4 +. Vamos agora ver este pequeno programa em ação. Abra o Ambiente de desenvolvi- 5 mento Telis, executando o arquivo telis.bat no Windows ou telis.sh no Linux. Ao abrir o Ambiente de desenvolvimento Telis, você verá uma uma janela no canto superior da tela. Maximize esta esta janela, de forma a visualizar a tela como a da �gura 2. No canto inferior há um campo de texto com um botão ao seu lado direito com o texto �Exe- cutar� e uma legenda ao lado esquerdo com o texto �Comando�, como indicado na �gura 2. Neste campo é possível escrever e executar trechos de comandos Telis. Figura 2: Foto do Ambiente Telis em execução, com o campo de comandos indicado. Dica Sempre utilize a barra de comandos para realizar pequenos testes e experimentar novos comandos. Aliado ao visualizador da pilha, é uma excelente ferramenta para entender o que está ocorrendo. Na barra de comandos, entre com o texto �2 4 +�. Clique em executar. Uma aranha aparecerá no centro da tela para realizar o seu calculo e na pilha está o valor 6. Para visualizar a pilha clique no terceiro botão da esquerda para a direita, isto é, o botão azul da �gura 2. Com isto, uma janela será exibida e o conteúdo atual da pilha poderá ser inpecionado, no caso, apenas o valor 6. O seu primeiro programa em Telis foi feito! 6 2.1 Desenhos e Telis Agora que sabe-se como a memória de pilha de Telis funciona, o próximo passo será desenhar um quadrado na tela. Ao executar o exemplo acima, realizando a soma entre 2 e 4, no centro da tela apareceu uma aranha, símbolo de Telis. Esta aranha é o ícone que representa um ator. Um ator é uma entidade que realiza os cálculos e possui a memória. Ao executar os comandos na barra de comandos do Ambiente, um ator é criado para processar. Telis fornece uma série de comandos para movimentar o ator. Em Telis comandos são chamadas agendas primitivas. Assim como no exemplo da soma, os parâmetros e valores retornados pelas agendas primitivas são consumidos e empilhados na memória de pilha que o ator possui. Para movimentar o ator existe a agenda primitiva frente. Esta agenda faz com que o ator se desloque x unidades para frente, onde x é o valor que se encontra no topo da pilha. Para virar, utiliza-se a agenda primitiva direita, que faz o ator girar x graus para a direita, onde x é o valor que se encontra no topo da pilha. Observe o exemplo 2.2, neste exemplo, o ator primeiro se movimenta para frente 50 unidades, em seguida vira para a direita 90◦ e se movimenta mais 50 unidades para frente. A movimentação do ator é ilustrada na �gura 3. Reproduza esta seqüencia de comandos no ambiente utilizando a caixa de comandos. 50 frente 90 direita 50 frente Algoritmo 2.2: Movimentando o ator. Dica O último botão na barra de ferramentas, botão �parar� em ver- melho, limpa a tela e encerra a execução de todos os atores que estiverem ativos permitindo retornar ao estado inicial. Podemos fazer o ator se movimentar em quadrado de forma a descrever a trajetória de um quadrado. Para que possamos desenhar o quadrado é necessário riscar. O ator pode riscar enquanto se movimenta, a agenda primitiva comRastros faz com que o ator comece a desenhar segmentos de reta entre a posição em que se encontrava e a nova posição alcançada através da agenda frente, por exemplo. De forma análoga, a agenda 7 Figura 3: Ilustração das agendas primitivas frente e direita. primitiva semRastros faz com que o ator pare de desenhar estes segmentos e permite que o ator se reposicione para iniciarnova pintura. Com isso temos todos os elementos para desenhar o quadrado. No exemplo 2.3 é uma pequena variante do exemplo anterior, mas agora os rastros estão ligados antes que o ator comece a se movimentar fazendo com que um quadrado seja desenhado na tela, como na �gura 4. comRastros 50 frente 90 direita 50 frente 90 direita 50 frente 90 direita 50 frente Algoritmo 2.3: Desenhando um quadrado. Figura 4: Resultado do desenho do quadrado. 8 Agora que você conhece alguns comandos básicos e a forma como a pilha funciona pratique. Utilize o ambiente e faça pequenos desenhos. Além das primitivas mostradas aqui existem outras que pode ser utilizadas como as primitivas semRastros, andarPara, gerarAleatório, pintarÁreas, �xarCorDosRastros e mostrar. 9 Lição 3--Criando Modelos e Agendas 3.1 Criando um modelo Agora que já você já criou o seu primeiro programa, enviando comandos ao ator criado pelo Telis vamos melhorar este programa. A primeira coisa que faremos é parar de utilizar a caixa de texto de comandos do ambiente Telis para escrever o programa. Esta caixa foi feita para realizar pequenos experimentos, mas as restrições impostas são muito grandes. O tamanho do campo é pequeno, todos os comandos são executados por um único ator e não é possível salvar o trabalho realizado entre sessões do ambiente. Para contornar estes problemas, Telis oferece um editor mais completo que oferece maior espaço e permite o que o trabalho realizado persista. Para utilizá-lo, devemos entender o conceito de modelo. Um modelo em Telis é um roteiro pré-de�nido que será seguido por um ator. Todo ator está atrelado a um determinado modelo, inclusive aquele criado pelo Ambiente Telis para executar os comandos inseridos na caixa de texto de comandos. É possível criar um ou mais atores a partir de um dado modelo, isto é chamado instanciação. Para se criar um modelo no ambiente Telis devemos abrir o editor, clicando no terceiro ícone da barra de tarefas e será exibida a tela mostrada na �gura 5. Esta janela é organizada em abas, dentre as quais a que nos interessa é a aba Modelo. Dica A primeira aba encontrada na janela do editor contém a documenta- ção de todas as agendas primitivas disponíveis. Esta documentação apresenta uma breve descrição do que a mesma faz, o que ela espera encontrar e o que ela ira retornar para a pilha, e pequenos exemplos de código. Dentro desta aba é possível criar, modi�car e instanciar modelos utilizando um editor 10 Figura 5: Foto do editor do ambiente Telis. O botão destacado é utilizado para abrí-lo. de texto mais elaborado. Para criar o modelo clique no botão �Criar Modelo� localizado na parte inferior esquerda da janela. Será exibido uma caixa para informar o nome do modelo, por exemplo �PintorDeQuadrados�. Após concluída a criação a lista de modelos possuirá o novo modelo, ao selecionálo será possível editar o código fonte. O botão �Ativar� localizado acima do editor instância um ator a partir deste modelo. Clique no botão ativar, e abra o visualizador da pilha. Agora no visualizador você verá que existe na lista de atores ativos um ator do modelo �PintorDeQuadrado� como é possível ver na �gura 6. Dica Escolha nomes para os seus modelos de forma a representar o que eles fazem e o seu papel no sistema. Isso ajuda em vários aspectos como organização e manutenibilidade do seu código. Por conven- ção, em nomes de modelos cada palavra do nome inicia com letra maiúscula, prática chamada CamelCase. O modelo criado agora não possui nenhum código logo os atores instânciados a partir dele não realizam nenhuma ação. Para fazer com que o modelo �PintorDeQuadrado� crie 11 Figura 6: Janela de atores ativos após instanciação de um modelo. atores que realmente pintem quadrados vamos colocar o código mostrado no exemplo 3.1 como o código do modelo. Ao instanciar o modelo iremos ver um quadrado na tela. Modelo: comRastros 50 frente 90 direita 50 frente 90 direita 50 frente 90 direita 50 frente Algoritmo 3.1: Modelo PintorDeQuadrado. Modelos são excelentes formas de organizar o programa, permitindo a de�nição de atores com mesmo comportamento uma única vez, e incentivando a divisão de respo- nabilidades responsabilidades entre estes. A divisão de responsabilidades dentro de um programa é uma das principais tarefas durante o desenvolvimento do programa e afeta diretamente a manutenibilidade do código. Código com muitos atores (e modelos) com responsabilidades muito pequenas tornam o programa muito fragmentado e difícil de en- tender. No caso oposto, poucos atores com muitas responsabilidades, o código dos atores se tornam muito complexos já que possuem muitas responsabilidades. Uma das tarefas do projetista é encontrar um meio termo onde não se tenha uma explosão de modelos e atores, mas não tenhamos modelos muito complexos. 12 3.2 Criando agendas Apesar de ajudar a organizar a estrutura geral do programa dividindo responsabilida- des, o código do modelo pode ser difícil de ser entendido caso não seja possível fragmentar o código do modelo. Além disso, é comum que uma mesma seqüência de ações devam ser realizadas diversas vezes durante a vida de um ator, mas não se deve replicar o código. A duplicação de código deve ser evitada sempre. Código duplicado piora muito a manu- tenibilidade do código pois cada vez um problema for encontrado ou uma alteração for necessária todas os códigos duplicados deverão ser modi�cados. Para contornar estes problemas Telis disponiliza agendas. Agendas são obrigatoria- mente atreladas a modelos, e todo modelo possui no mínimo uma agenda chamada iniciar. Toda agenda possui um nome que será utilizado para invocá-la e um código associado que será executado quando a agenda for invocada. A agenda iniciar é automaticamente executada após um ator ser instanciado. Os códigos executados até aqui, como no exemplo 3.1, está na realidade contido nesta agenda. As outras agendas do modelo só são executadas quando invocadas. Para invocar uma agenda basta escrever o nome da mesma no código, da mesma forma como se faz com uma agenda primitiva. Após o término da execução da agenda o programa continua com o seu �uxo normal. Vamos modi�car o �PintorDeQuadrados� mostrado no exemplo 3.1 e utilizar agendas. Ao invés de utilizar duas primitivas (frente e direita) para desenhar o lado do quadrado, criaremos uma agenda que faça isto e a utilizaremos na agenda iniciar. Para criar uma agenda proceda da mesma forma que para a inclusão de um modelo, mas utilizando o botão �Criar agenda� que se encontra ao lado do botão utilizado para a criação de um modelo. O código resultante é mostrado no exemplo 3.2 Modelo: iniciar: comRastros desenharLado desenharLado desenharLado desenharLado desenharLado: 50 frente 90 direita 13 Algoritmo 3.2: Modelo PintorDeQuadrado. Ao executar este código o ator primeiro executa a primitiva comRastros. Em seguida a agenda desenharLado é executada e o ator passa a executar o código da mesma andando 50 unidades para frente e girando 90 graus. Após o terminar a execução da agenda, o ator retorna a agenda iniciar e executa a agenda desenharLado mais três vezes completando o desenho do quadrado. A �gura 7 mostra esquematicamente como o �uxo de execução do ator se desenrola. Figura 7: Ilustração do �uxo de execução durante a execução do exemplo 3.2. 3.3 Publicando o programa na internet Agora temos um modelo capaz de criar atores que desenham quadrados na tela. Mas não criamos ainda um programa. Em Telis programas são chamados �Apliques�. Um aplique possui um nome, dimensões (altura e largura) e uma lista dizendo os atores que deverão ser disparados e seus respectivos modelos. Para se criar um aplique é utilizada a aba Apliques do editor. Lá preenche-se os dados necessários e pode-se ativar o aplique. Ao ativar um aplique é aberta uma janela e os atores especi�cados são instanciados e iniciam sua execução. O que é mais interessante da criaçãode aplique é a possibilidade de publicá-los. Ao publicar um aplique não é mais necessário o uso do ambiente de desenvolvimento para executá-lo, ao invés dele, utiliza-se o navegador. A publicação pode ser local ou remota. Caso seja local uma página web com o seu programa é criada na pasta que você especi�car, caso seja local o seu programa será publicado na internet nos servidores do Edugraf e 14 disponíveis na url http://telis.edugraf.ufsc.br/apliques/. Dica Ao publicar um aplique você compartilha o código com outros, e todo e qualquer código publicado pode ser utilizado, modi�cado e estudado por você. Para incentivar o estudo e compartilhamento de códigos Telis, o ambiente permite que códigos publicados sejam im- portados da internet para o seu ambiente. Esta função é disponível através do primeiro botão da barra de tarefas do ambiente. 15 Lição 4--Criando Agendas Parametrizáveis Depois dos exemplos e programas relacionados aos quadrados e a introdução de con- ceitos básicos do funcionamento do Telis e de modelos, atores e agendas feitas nas lições anteriores vamos aplicar estes conhecimentos e desenvolver um relógio analógico. O relógio analógico deverá possuir os ponteiros de segundos, minutos e horas, atualizando- se a medida que o tempo passa. Para melhor distribuir as funcionalidades do programa iremos separar o problema em quatro partes distintas: o desenho da parte �xa do relógio, dos ponteiros dos segundos, dos minutos e das horas. Cada uma destas partes será repre- sentada por um ator diferente que quando atuarem em conjunto façam o relógio analógico funcionar. 4.1 Desenhando um relógio Começaremos criando o modelo para o ator que será responsável pelo desenho das partes estáticas do relógio, que é a mais simples. A parte estática do nosso relógio será bastante simples sendo composta apenas por um círculo que delimitará o relógio na tela. Assim, o código básico do relógio consistirá no posicionamento do autor e o desenho de um círculo com o tamanho adequado. O código responsável é mostrado no exemplo 4.1. AroDoRelogio: iniciar: [−105 −105] andarPara [210 210] desenharElipse suicidar Algoritmo 4.1: Modelo da aro do relógio. No exemplo 4.1 existem algumas estruturas e agendas primitivas ainda não vistas. As agendas primitivas andarPara e desenharElipse são bastante intuitivas e não entraremos 16 em maiores detalhes, para maiores informações consulte a referência de primitivas. Os detalhes importantes são os colchetes e a primitiva suicidar. A primitiva suicidar é utilizada para terminar com a vida de um ator. Em Telis um ator é uma entidade autônoma e permanece ativa após terminar a execução da agenda iniciar. Ao invocar a agenda primitiva suicidar o ator é destruído, se o seu ícone estiver visível ele é apagado da tela e o ator sai da lista de atores ativos do ambiente liberando quaisquer recursos que ele possua como a sua pilha por exemplo. Os colchetes são utilizados para denotar listas. Listas podem conter qualquer tipo de dados incluindo números, textos, outras listas e código. No caso [-105 -105], é empilhada uma lista contendo 2 elementos sendo o primeiro elemento -105 e o segundo -105 também. Listas podem ser manipuladas através de primitivas e são a forma básica de estruturar dados em Telis. Na ajuda do ambiente existe uma seção sobre as agendas primitivas que podem ser usadas para manipular estas listas. 4.2 Ponteiro dos segundos Agora que temos como instanciar um ator responsável pelo desenho das partes �xas do relógio iremos criar um modelo para o ator responsável pelo desenho dos ponteiros dos segundos. Este ponteiro deverá ser apagado e redesenhado no ângulo correto de segundo em segundo, isto é deve realizar os seguintes passos: 1. Obter a hora do sistema e extrair as informações dos segundos 2. Calcular o ângulo com o qual o ator deverá se deslocar 3. Pintar o ponteiro 4. Dormir por 1 segundo 5. Apagar o ponteiro 6. Repetir o procedimento a partir do passo 1 A estrutura básica do problema é bastante simples. Telis possui a agenda primitiva obterHora que retorna uma lista contendo as horas, minutos e segundos nesta ordem. Logo para obtermos os segundos basta pegarmos o terceiro elementos da lista que a primitiva obterHora colocar na pilha, o que pode ser realizado com a primitiva obterElemento. 17 O segundo passo é calcular o ângulo com a horizontal do ponteiro dos segundos. Isto pode ser realizado com a expressão 90− (segundos− 360/60). A origem desta expressão pode ser visualizada de forma mais clara na �gura 8. Figura 8: Na �gura, a linha verde indica o ângulo 0o. A duas linhas vermelhas indicam o ângulo feito pelos ponteiros com 0 e 1 segundo. O ângulo entre a linha verde e o ponteiro a 1 segundo é igual ao complemento do ângulo entre as linhas vermelhas que é igual 1x360/60 = 6. Para realizar o terceiro passo, isto é, a pintura do ponteiro vamos posicionar o ator no centro da tela, ajustar o ângulo do ator e fazê-lo andar utilizando a primitiva frente. O quarto passo pode ser realizado com a agenda primitiva descansar. Esta agenda faz com que o ator pare a sua execução por n segundos, onde n é o parâmetro que se encontra no topo da pilha e será consumido. O quinto passo é idêntico ao terceiro, desde que pintemos com a cor de fundo ao invés de pintarmos com a cor do ponteiro. Isso é verdade desde que a suavização de traços esteja desligada. Ao desenhar algo na tela Telis utiliza uma técnica para melhorar a aparência e evitar a sensação de serrilhados, o que acaba fazendo que esta tática não funciona. É possível desligar esta suavização com a primitiva comSerrilhado. Para o último passo precisamos de algo para realizar repetições e de forma in�nita. Para isso utilizaremos a agenda primitiva paraSempre. Esta agenda recebe uma lista com um código, e este código será executado para sempre. Existem várias outras estruturas de repetição em Telis como as agendas vezesRepetir, enquantoVerdadeiro, paraCada. 18 Juntando tudo que foi discutido até aqui podemos chegar ao código mostrado no exemplo 4.2. O código responsável pelo desenho foi colocado em uma agenda separada. PonteiroDosSegundos: iniciar: comSerrilhado [ obterHora 3 obterElemento s associar 90 s 6 ∗ − ang associar {ang=90−(s∗6)} [@ang 9 100 3] mostrarPonteiro 1 descansar [@ang 15 100 3] mostrarPonteiro ] praSempre mostrarPonteiro: [angulo cor tamanho espessura] associar angulo �xarDirecao cor �xarCorDosRastros espessura �xarEspessura comRastros tamanho frente tamanho −1 ∗ frente semRastros Algoritmo 4.2: Modelo da ponteiro dos segundos. No exemplo 4.2 é utilizada a primitiva associar. Esta primitiva é utilizada para associar a um símbolo, um nome um determinado valor que se encontra na pilha. A pilha é ótima para armazenamento de dados temporários durante cálculos. Entretanto para armazenamento de informações que devem persistir durante mais tempo e para evitar a manipulação da pilha pode-se gravar o valor da pilha em em uma variável. O valor da variável será empilhado ao executar o nome informado antes da primitiva associar. No exemplo, o terceiro elemento do hora, isto é, os segundos é armazenado na variável s, sendo este valor posteriormente acessado para o calculo do ângulo. A primitiva associar também permite associar várias variáveis de uma única vez atra- vés de listas. Caso o topo e subtopo da pilha sejam listas, a lista do topo da pilha será utilizada como nome para as variáveis e lista do subtopo da pilha será utilizada para os valores que serão atribuídos. As duas listas devem possuir o mesmo tamanho, caso 19 contrário um erro será gerado. Outro detalhe que aparece neste exemplo é o uso do @. O @ é utilizado dentro de listas com o intuito de inserir na lista que se está criando não o símbolo que se encontra após o mesmo, mas sim o resultado da execução deste símbolo. 4.3 Ponteiro dos minutos O modelo para o ponteiro dos minutos é bastante parecido com o modelo feito parao ponteiros dos segundos. As grandes diferenças são: 1. Leitura dos segundos ao invés dos minutos 2. Tamanho, cor e espessura do ponteiro Adotando essas alterações o código para o modelo do ponteiro dos minutos �ca como no exemplo 4.3. PonteiroDosMinutos: iniciar: comSerrilhado [ obterHora 2 obterElemento m associar 90 m 6 ∗ − ang associar {ang=90−(m∗6)} [@ang 0 80 3] mostrarPonteiro 1 descansar [@ang 15 80 3] mostrarPonteiro ] praSempre mostrarPonteiro: [angulo cor tamanho espessura] associar angulo �xarDirecao cor �xarCorDosRastros espessura �xarEspessura comRastros tamanho frente tamanho −1 ∗ frente semRastros 20 Algoritmo 4.3: Modelo da ponteiro dos minutos. 4.4 Ponteiro das horas O modelo para o ponteiro das horas segue a mesma estrutura básica dos outros dois (segundos e minutos), entretanto o cálculo do ângulo é diferente devido ao ponteiro das horas possuir 12 posições ao invés das 60 posições assumidas pelos ponteiros dos minutos e dos segundos. Adotando essas alterações o código para o modelo do ponteiro das horas �ca como no exemplo 4.4. PonteiroDasHoras: iniciar: comSerrilhado [ obterHora 1 obterElemento h associar 90 h 30 ∗ − ang associar {ang=30−(h∗6)} [@ang 0 50 6] mostrarPonteiro 1 descansar [@ang 15 50 6] mostrarPonteiro ] praSempre mostrarPonteiro: [angulo cor tamanho espessura] associar angulo �xarDirecao cor �xarCorDosRastros espessura �xarEspessura comRastros tamanho frente tamanho −1 ∗ frente semRastros Algoritmo 4.4: Modelo da ponteiro das horas. 21 4.5 Colocando o relógio para funcionar Agora possuímos as 3 partes do relógio funcionando independentemente. Para fazer- mos o relógio funcionar devemos instanciar um ator de cada um dos modelos que criamos. Isso pode ser feito manualmente, mas não é uma solução interessante já que depende de procedimentos manuais para que o relógio funcione adequadamente. Uma solução é a criação de um aplique composto por uma instância de cada um dos 4 modelos. De qualquer forma não é bom depender do aplique para de�nir como o relógio deverá ser montado. Isso limita o uso do relógio fazendo com que qualquer um que queira utilizar um relógio tenha que conhecer todos os componentes de que ele é feito. Para remediar esta situação criaremos um modelo chamado Relogio e nele instanciaremos todos os com- ponentes do mesmo, assim para instanciar um relógio não será necessário conhecimento das partes do mesmo bastando instanciar o relógio mostrado no exemplo 4.5. Relógio: iniciar: AroDoRelogio PonteiroDosSegundos PonteiroDosMinutos PonteiroDasHoras Algoritmo 4.5: Modelo Relógio. A ocultação de detalhes internos é chamado de encapsulamento e é uma característica desejável no paradigma de orientação a objetos. Neste paradigma existem objetos e a computação se desenrola com a criação, destruição e troca de mensagens entre estes objetos. Cada objeto deve encapsular os seus dados e detalhes dentro de si. Telis é uma linguagem multi-paradigma e também utiliza conceitos de orientação a objetos. Objetos são semelhante a atores e os modelos são chamados de classes nas linguagens orientadas a objetos. Chegamos então ao código mostrado no exemplo 4.6 possuindo todos os modelos desenvolvidos até aqui. PonteiroDosSegundos: iniciar: comSerrilhado [ obterHora 3 obterElemento s associar 90 s 6 ∗ − ang associar {ang=90−(s∗6)} 22 [@ang 9 100 3] mostrarPonteiro 1 descansar [@ang 15 100 3] mostrarPonteiro ] praSempre mostrarPonteiro: [angulo cor tamanho espessura] associar angulo �xarDirecao cor �xarCorDosRastros espessura �xarEspessura comRastros tamanho frente tamanho −1 ∗ frente semRastros PonteiroDosMinutos: iniciar: comSerrilhado [ obterHora 2 obterElemento m associar 90 m 6 ∗ − ang associar {ang=90−(m∗6)} [@ang 0 80 3] mostrarPonteiro 1 descansar [@ang 15 80 3] mostrarPonteiro ] praSempre mostrarPonteiro: [angulo cor tamanho espessura] associar angulo �xarDirecao cor �xarCorDosRastros espessura �xarEspessura comRastros tamanho frente tamanho −1 ∗ frente semRastros PonteiroDasHoras: iniciar: 23 comSerrilhado [ obterHora 1 obterElemento h associar 90 h 30 ∗ − ang associar {ang=30−(h∗6)} [@ang 0 50 6] mostrarPonteiro 1 descansar [@ang 15 50 6] mostrarPonteiro ] praSempre mostrarPonteiro: [angulo cor tamanho espessura] associar angulo �xarDirecao cor �xarCorDosRastros espessura �xarEspessura comRastros tamanho frente tamanho −1 ∗ frente semRastros Relógio: iniciar: AroDoRelogio PonteiroDosSegundos PonteiroDosMinutos PonteiroDasHoras Algoritmo 4.6: Exemplo do relógio com agendas parametrizadas. 24 Lição 5--Usando Moldes para Remover Duplicação de Código 5.1 Movendo a agenda para o molde No capítulo anterior criamos um relógio funcional com os ponteiros dos minutos, segundos e horas. Mas ao olharmos mais de perto o código resultante vemos que os três modelos que criamos para representar cada um dos três modelos possuem código em comum. Ao encontrar código em comum em uma agenda, uma saída para evitar a duplicação de código é a utilização de agendas mas se estas agendas estão em modelos diferentes? Como é possível compartilhar código entre diferentes modelos? Telis utiliza um mecanismo chamado Molde para resolver este problema. Um modelo pode ser moldado por quantos moldes forem necessários e quando isto ocorre ele ganha todas as agendas de�nidas pelo molde. Estas agendas são exatamente iguais as agendas de�nidas em um modelo comum, mas como vários modelos podem ser moldados pelo mesmo molde temos um mecanismo para evitar a duplicação e resolver o nosso problema. Para criar um molde utiliza-se o botão de criação de moldes que se encontra abaixo do botão utilizado para criação de modelos, o restante do processo é o mesmo. Os moldes aparecem com uma coloração diferenciada na lista de modelos do editor. A lista de moldes que moldam um modelo encontra-se acima do editor de texto. Esta lista deve conter o nome dos moldes separados por espaços. Há uma opção abaixo da listagem de agendas que permite a visualização de agendas que foram adquiridas de um molde e disponíveis para uso. Depois de criado o molde pode-se criar agendas dentro do mesmo. Assim como mo- delos moldes possuem uma agenda iniciar que será invocada antes da agenda iniciar do 25 modelo. Esta regra é seguida por todo e qualquer agenda do molde, se existir uma agenda com mesmo nome no molde e em quem ele molda a agenda de quem do molde é executada primeiro. Aplicando o conceito de molde no exemplo anterior, criaremos um molde Ponteiro que irá moldar os modelos PonteiroDosSegundos, PonteiroDosMinutos, PonteiroDasHo- ras. Este molde possuirá a agenda mostrarPonteiro comum todos os ponteiros, e os modelos não a possuirão mais. Com estas alterações chegamos ao exemplos 5.1 Molde Ponteiro: mostrarPonteiro: { Agenda mostrarPonteiro. Recebe na pilha o angulo do ponteiro, a cor do ponteiro, o tamanho e espessura. Devolve na pilha: nada. } [espessura tamanho cor angulo] associar angulo �xarDirecao cor �xarCorDosRastros espessura �xarEspessura comRastros tamanho frente tamanho −1 ∗ frente semRastros Modelo PonteiroDosSegundos moldado por Ponteiro: iniciar: comSerrilhado [ obterHora 3 obterElemento s associar 90 s 6 ∗ − ang associar {ang=90−(s∗6)} [@ang 9 100 3] mostrarPonteiro 1 descansar [@ang 15 100 3] mostrarPonteiro ] praSempre Modelo PonteiroDosMinutos moldado por Ponteiro: iniciar: comSerrilhado 26 [ obterHora 2 obterElemento m associar 90 m 6 ∗ − ang associar {ang=90−(m∗6)} [@ang 0 80 3] mostrarPonteiro 1 descansar [@ang 15 80 3] mostrarPonteiro ] praSempre Modelo PonteiroDasHoras moldado por Ponteiro: iniciar: comSerrilhado [ obterHora 1 obterElemento h associar 90 h 30 ∗ − ang associar {ang=30−(h∗6)} [@ang 0 50 6] mostrarPonteiro 1 descansar [@ang 15 50 6] mostrarPonteiro ] praSempre Modelo Relógio: iniciar: AroDoRelogio PonteiroDosSegundos PonteiroDosMinutos PonteiroDasHoras Algoritmo5.1: Exemplo do relógio com uso de molde. 5.2 Subindo a agenda iniciar No exemplo 5.1 conseguimos remover a duplicação existente entre os diversos modelos movendo a agenda desenharPonteiro para um molde. Mas as agendas iniciar dos modelos estão todas muito parecidas. Será que não existe alguma forma de aproveitar melhor o molde e evitar esta potencial duplicação entre os ponteiros? Neste processo de tentar encontra remover a duplicação de algo parecido é deixar os códigos iguais. Vamos adotar esta abordagem aqui. Começaremos criando novas agendas até que a agenda iniciar de todos os modelos estejam iguais, quando conseguirmos isto poderemos subir a agenda para o molde. 27 Molde Ponteiro: mostrarPonteiro: [angulo cor tamanho espessura] associar angulo �xarDirecao cor �xarCorDosRastros espessura �xarEspessura comRastros tamanho frente tamanho −1 ∗ frente semRastros Modelo PonteiroDosSegundos moldado por Ponteiro: iniciar: comSerrilhado [ calcularAngulo angulo associar [@angulo @cor @tamanho @espessura] mostrarPonteiro 1 descansar [@angulo 15 @tamanho @espessura] mostrarPonteiro ] praSempre cor: 9 tamanho: 100 espessura: 3 calcularAngulo: obterHora 3 obterElemento s associar 90 s 6 ∗ − ang associar {ang=90−(s∗6)} Modelo PonteiroDosMinutos moldado por Ponteiro: iniciar: comSerrilhado [ calcularAngulo angulo associar [@angulo @cor @tamanho @espessura] mostrarPonteiro 1 descansar [@angulo 15 @tamanho @espessura] mostrarPonteiro ] praSempre cor: 28 0 tamanho: 80 espessura: 3 calcularAngulo: obterHora 3 obterElemento s associar 90 s 6 ∗ − ang associar {ang=90−(s∗6)} Modelo PonteiroDasHoras moldado por Ponteiro: iniciar: comSerrilhado [ calcularAngulo angulo associar [@angulo @cor @tamanho @espessura] mostrarPonteiro 1 descansar [@angulo 15 @tamanho @espessura] mostrarPonteiro ] praSempre cor: 0 tamanho: 50 espessura: 6 calcularAngulo: obterHora 3 obterElemento s associar 90 s 6 ∗ − ang associar {ang=90−(s∗6)} Modelo Relógio: iniciar: AroDoRelogio PonteiroDosSegundos PonteiroDosMinutos PonteiroDasHoras cor: 9 tamanho: 100 espessura: 3 calcularAngulo: obterHora 3 obterElemento s associar 90 s 6 ∗ − ang associar {ang=90−(s∗6)} 29 Algoritmo 5.2: Tornando métodos iniciar dos ponteiros iguais. No exemplo ?? foram criados quatro novas agendas: uma para retornar a cor, uma para a espessura, uma para o tamanho e uma para o cálculo do ângulo do ponteiro em um determinado instante. Além disso, estas agendas passaram a ser utilizadas na agenda iniciar, fazendo com que a agenda iniciar de todos os métodos se tornem iguais. Logo, podemos subir o método iniciar para o molde Ponteiro obtendo o resultado mostrado no exemplo 5.3. Molde Ponteiro: iniciar: comSerrilhado [ calcularAngulo angulo associar [@angulo @cor @tamanho @espessura] mostrarPonteiro 1 descansar [@angulo 15 @tamanho @espessura] mostrarPonteiro ] praSempre mostrarPonteiro: [angulo cor tamanho espessura] associar angulo �xarDirecao cor �xarCorDosRastros espessura �xarEspessura comRastros tamanho frente tamanho −1 ∗ frente semRastros Modelo PonteiroDosSegundos moldado por Ponteiro: cor: 9 tamanho: 100 espessura: 3 calcularAngulo: obterHora 3 obterElemento s associar 90 s 6 ∗ − ang associar {ang=90−(s∗6)} 30 Modelo PonteiroDosMinutos moldado por Ponteiro: cor: 0 tamanho: 80 espessura: 3 calcularAngulo: obterHora 3 obterElemento s associar 90 s 6 ∗ − ang associar {ang=90−(s∗6)} Modelo PonteiroDasHoras moldado por Ponteiro: cor: 0 tamanho: 50 espessura: 6 calcularAngulo: obterHora 3 obterElemento s associar 90 s 6 ∗ − ang associar {ang=90−(s∗6)} Modelo Relógio: iniciar: AroDoRelogio PonteiroDosSegundos PonteiroDosMinutos PonteiroDasHoras cor: 9 tamanho: 100 espessura: 3 calcularAngulo: obterHora 3 obterElemento s associar 90 s 6 ∗ − ang associar {ang=90−(s∗6)} Algoritmo 5.3: Método iniciar dos ponteiros no molde Ponteiro. A agenda iniciar está no molde, mas as agendas cor, tamanho, espessura e calcula- rAngulo se encontram nos modelos, isso não deveria gerar um erro? A resposta a esta 31 pergunta é depende, este comportamento é dependente da linguagem em que se está pro- gramando. Em Telis e outras linguagens dinâmicas como Ruby, Python por exemplo um erro não é gerado pois em tempo de execução os moldes estão atrelados aos modelos e a agenda que será invocada será a agenda deste modelo. Em linguagens estáticas como Java e C++ um erro ocorre, é necessário a declaração destas agendas no molde. Entretanto, estas linguagens fornecem mecanismos para que a implementação destas agendas sejam postergadas para os modelos obtendo assim o mesmo efeito obtido em Telis. Dica Assim como modelos, moldes também podem ser moldados por outros moldes permitindo a criação de hierarquias mais complexas e permitindo uma maior coerência e facilidade na hora de evitar as duplicações de código. 32 Lição 6--Comunicação entre atores Na lição anterior foi criado um relógio. Cada compoenente lógico do relógio foi asso- ciado a um modelo especí�co responsável por realizar os calculos das posições do relógio e fazer a apresentação, ou seja, desenhar na tela a parte correspondente. Em engenharia de software, existem os chamados padrões de projeto. Padrões foram introduzidos em 1994 e são catálogos que buscam capturar estruturas de organização re- correntes, dando a elas nome, descrição, aplicabilidade, citando vantagens e desvantagens do uso. Um dos padrões é chamado Modelo-Controle-Visão ou MVC. Este padrão diz que o programa deve ser estruturado em 3 partes: Modelo, Controle, Visão. O modelo é responsável por representar os objetos do domínio da aplicação. A visão é responsável por apresentar os dados ao usuário. O controle faz a comunicação observando o que é realizado na visão e manipulando o modelo de acordo. Existem vertententes nas quais a visão pode observar e reagir a mudanças no modelo, em outras a visão não se relaciona com o modelo, quem reage as alterações no modelo é o controle, que por sua vez atualiza a visão. Note que a visão, modelo e controle não correspondem a modelos, esta é uma estrutura geral de organização sendo que cada um destes componentes pode ser composto por vários modelos. O objetivo neste capítulo é separar a visão do controle na aplicação do relógio. O problema em fazer isto é que com o que temos até o momento não é possível realizar comunicação entre atores. Um ator é uma unidade de processamento atômica e indepen- dente que executa a sua agenda iniciar, não fazendo mais nada após o término desta. Telis oferece mecanismos para que atores possam se comunicar, via estímulos e via comunica- ção direta. Iremos modi�car os exemplos anteriores utilizando ambas as abordagens para realizar a comunicação entre modelo e visão. Nestes exemplos iremos suprimir a camada de controle por simplicidade. 33 6.1 Separando modelo de visão com estímulos Para realizar a comunicação entre modelo e visão iremos utilizar estímulos. Estímulos em Telis são �mensagens�� enviadas e recebeidas por atores. Imagine que cada ator se comporte como sendo uma espécie de emissora de rádio: ele emite um estímulo que pode ser recebido (tratado) por todos aqueles que estiverem esperando por um estímulo do mesmo tipo. Um ator pode enviar um estímulo utilizando a primitiva dizer. Esta primitiva busca recebe como parâmetro uma lista, sendo esta lista a mensagem, também conhecida como tupla, a ser enviada pelo ator. Depois de enviada a mensagem pode ser recebida por qualquer outro ator que tenha declarado que está interessado na mesma. É importante salientar que atores não podem tratar estímulos enviados por ele mesmo. Outro detalhe é que estímulos podem ser perdidos por outros atores caso eles estejam tratam outro estimulo. Durante o tratamento de um determinado estímulo o ator �ca surdo, isto é, não é capaz de tratar nenhum outro estímulo. Após o término do tratamento, oator volta a receber e tratar estímulos. Para declarar que está interessado em um determinado em um estímulo utiliza-se a primitiva seDito. Esta primitiva recebe dois parâmetros. O primeiro é uma lista, chamada de �ltro, indicando o tipo de tupla que o ator está interessado em tratar, e o segundo uma lista de comandos indicando o que deverá ser executado quando a mensagem for recebida. Ao receber um estímulo o ator veri�ca quais os tratadores casam com a tupla recebida, para tudo que estiver fazendo no momento e executa o tratador associado. Antes de iniciar o tratador a tupla é colocada na pilha, permitindo a extração de informação da mesma. Após o término de execução do tratador, o ator limpa a pilha, retornando ao mesmo estado encontrado antes da execução e continua a executar do ponto onde ouve a interrupção. Para determinar se uma tupla casa com um determinado �ltro Telis faz o seguinte: 1. Veri�ca se o tamanho da tupla e do �ltro são iguais. 2. Compara elemento a elemento se estes casam. 3. Se condição acima for verdadeira para todos os elementos da tupla e a primeira condição for verdadeira, a tupla e o �ltro casam. Dois elementos casam se são iguais. Telis fornece um mecanismo para especi�car posições na tupla que esperam um determinado tipo de dados, como parâmetros. Isto é conseguido 34 através das palavras-chaves: texto, número, lista. Se o �ltro contiver uma destas palavras chaves e a tupla possuir na mesma posição um elemento do tipo discriminado no �ltro, estes elementos irão casar. Abaixo alguns exemplos: Agora que conhecemos estímulos, vamos usá-los para implementar a visão e o modelo separadamente. Iremos criar um modelo responsável pelo desenho dos ponteiros, um modelo responsável pelo desenho do restante do relógio, e modelos responsáveis pelo cálculo dos ângulos e tempos de descanso de pintura. Quando o ângulo de um ponteiro tiver que ser atualizado um estímulos será enviado e os atores da visão irão se atualizar. Essas alterações podem ser vistas no exemplos 6.1. Modelo VisãoPonteiro: iniciar: [ponteiro cor tamanho espessura] associar 0 angulo associar comSerrilhado [RELOGIO @ponteiro numero] [ [NULO NULO angulo] associar [@angulo 15 @tamanho @espessura] mostrarPonteiro [@angulo @cor @tamanho @espessura] mostrarPonteiro ] seDito mostrarPonteiro: angulo �xarDirecao cor �xarCorDosRastros espessura �xarEspessura comRastros tamanho frente tamanho −1 ∗ frente semRastros Molde Ponteiro: iniciar: [ calcularAngulo angulo associar [RELOGIO @ponteiro @angulo] dizer 1 descansar ] praSempre 35 Modelo PonteiroDosSegundos moldado por Ponteiro: ponteiro: "segundos" calcularAngulo: obterHora 3 obterElemento s associar 90 s 6 ∗ − ang associar {ang=90−(s∗6)} Modelo PonteiroDosMinutos moldado por Ponteiro: ponteiro: "minutos" calcularAngulo: obterHora 3 obterElemento s associar 90 s 6 ∗ − ang associar {ang=90−(s∗6)} Modelo PonteiroDasHoras moldado por Ponteiro: ponteiro: "horas" calcularAngulo: obterHora 3 obterElemento s associar 90 s 6 ∗ − ang associar {ang=90−(s∗6)} Modelo Relógio: iniciar: AroDoRelogio ["segundos" 9 100 3] VisãoDoPonteiro ["minutos" 0 80 3] VisãoDoPonteiro ["horas" 0 50 6] VisãoDoPonteiro PonteiroDosSegundos PonteiroDosMinutos PonteiroDasHoras suicidar Algoritmo 6.1: Relógio com Visão e Controle utilizando estímulos. 6.2 Separando modelo de visão com comunicação di- reta Outra forma de comunicação entre atores disponibilizada pelo Telis é chamada de co- municação direta. Ao contrário da comunicação via estímulos na qual um ator envia um estímulo e um número qualquer de atores reagem ao mesmo de forma assíncrona, a comu- 36 nicação direta ocorre entre 2 atores e de forma síncrona. Um ator envia pede a execução de uma agenda para um segundo ator conhecido, aguarda o término do processamento da requisição e recebe uma resposta. Para realizar a comunicação direta é necessário que o ator que deseja requisitar a execução conheça o outro ator. Isso acontece por meio da identidade. Todo ator possui uma identidade única na execução. O ator pode obter a sua própria identidade através das primitivas euMesmo ou obterIdentidade. Ao instanciar um ator, é empilhado a identidade do novo ator na pilha do ator que o instanciou permitindo assim a comunicação entre ambos. A comunicação direta funciona de forma semelhante a estímulos, no que diz respeito a execução, o ator que recebe um pedido de comunicação direta para o que está fazendo, trata a requisição e retorna ao que estava fazendo. A diferença é que em estímulos, o tratador é atrelado ao �ltro através da primitiva seDito. Na comunicação direta o ator que deseja realizar a comunicação indica o nome de uma agenda do ator alvo. O ator alvo irá executar esta agenda e retornar o que estiver no topo da pilha. Um elemento da pilha do ator que está iniciando a comunicação direta é consumido como parâmetro se necessário. Ao contrário da comunicação utilizando estímulos, não existe perda de comunicação direta. Se um ator estiver tratando uma comunicação direta ou um estímulo quando uma nova requisição de comunicação direta chegar, o ator en�leira as requisições para posterior execução. O ator retoma a sua execução normal apenas depois que todas as requisições tenham sido atendidas. Importante salientar que comunicação direta não interrompe o tratamento de um estímulo, mas um estímulo pode interromper o tratamento de comunicação direta. Estímulos possuem um carater emergencial e prioritário e por isso possuem prioridade sobre comunicação direta. Para realizar a comunicação direta, utiliza-se a notação do ponto. Nesta notação, coloca-se a identidade do ator com o qual se deseja realizar a comunicação direta na pilha, e em seguida um ponto seguido do nome da agenda que deverá ser executada, como mostrado no exemplo 6.2. Não deve haver espaços entre o ponto e o nome da agenda. "possível parâmetro" identidadeDoAtor.nomeDeUmaAgenda Algoritmo 6.2: Exemplo de comunicação direta. Para evitar que um ator realize comunicação direta com qualquer agenda de outro ator, Telis fornece um mecanismo para evitar que uma agenda possa ser utilizada para 37 comunicação direta. Estas agendas são chamadas de agendas privadas, sendo as outras chamadas de agendas públicas. A diferença entre agendas privadas e agendas públicas é que agendas privadas tem seu nome iniciado por . Durante a execução da agenda iniciar atores não são capazes de tratar requisições de comunicação direta. Isto ocorre para que a inicialização de atores ocorra antes que uma agenda seja invocada. Assim sendo atores que entram em loops in�nitos na agenda iniciar são incapazes de atender requisições de comunicação direta. Caso alguém tente realizar uma comunicação direta com um destes atores, um time-out ocorre gerando um erro. Agora que sabemos como funciona a comunicação direta, iremos substituir a comuni- cação direta no exemplo 6.1 por comunicação direta. Para fazer isso, teremos que informar ao modelo as identidades dos atores responsáveis pela visão para que a comunicação direta possa ser realizada. Além disso, o tratador de estímulos da visão deverá ser transformado em uma agenda pública. O resultado pode ser visualizado no exemplo 6.3 Modelo VisãoPonteiro: iniciar: [ponteiro cor tamanho espessura] associar 0 angulo associar comSerrilhado atualizar: [angulo] associar [@angulo 15 @tamanho @espessura] mostrarPonteiro [@angulo @cor @tamanho @espessura] mostrarPonteiro mostrarPonteiro: angulo �xarDirecao cor �xarCorDosRastros espessura �xarEspessura comRastros tamanho frente tamanho −1 ∗ frente semRastros Molde Ponteiro: iniciar: [visao] associar comSerrilhado [ 38 calcularAngulo angulo associar [@angulo] visao.atualizar 1 descansar ] praSempre Modelo PonteiroDosSegundos moldado por Ponteiro: calcularAngulo: obterHora 3 obterElemento s associar 90 s 6 ∗ − ang associar {ang=90−(s∗6)} Modelo PonteiroDosMinutos moldado por Ponteiro:calcularAngulo: obterHora 3 obterElemento s associar 90 s 6 ∗ − ang associar {ang=90−(s∗6)} Modelo PonteiroDasHoras moldado por Ponteiro: calcularAngulo: obterHora 3 obterElemento s associar 90 s 6 ∗ − ang associar {ang=90−(s∗6)} Modelo Relógio: iniciar: AroDoRelogio [9 100 3] VisãoDoPonteiro segundos associar [0 80 3] VisãoDoPonteiro minutos associar [0 50 6] VisãoDoPonteiro horas associar [@segundos] PonteiroDosSegundos [@minutos] PonteiroDosMinutos [@horas] PonteiroDasHoras suicidar Algoritmo 6.3: Relógio com Visão e Controle utilizando estímulos. 39 Lição 7--Conclusão Nesta apostila foi feita uma introdução a programação de computadores utilizando a linguagem de programação Telis, com uma abordagem baseada em exemplos. Trechos de códigos e programas são desenvolvidos e explanados visando a introdução da sintaxe de Telis e de conceitos importantes e, muitas vezes, avançados de programação. Telis apresenta diversos conceitos avançados e complexos, como concorrência e pa- ralelismo, de forma simples e intuitiva. Isto incentiva o uso dos conceitos por parte do programador iniciante, deixando-o confortável em usá-la. Apesar de ser uma ótima ferramenta para aprender a programar e introduzir conceitos avançados de forma simples, Telis não é uma linguagem comercial. O próximo passo é aprender uma linguagem de programação comercial. Mas como o aluno aprendeu todos os conceitos importantes em Telis, a aprendizagem desta linguagem deverá se tornar mais suave. Instalação de Telis Primeiro programa Desenhos e Telis Criando Modelos e Agendas Criando um modelo Criando agendas Publicando o programa na internet Criando Agendas Parametrizáveis Desenhando um relógio Ponteiro dos segundos Ponteiro dos minutos Ponteiro das horas Colocando o relógio para funcionar Usando Moldes para Remover Duplicação de Código Movendo a agenda para o molde Subindo a agenda iniciar Comunicação entre atores Separando modelo de visão com estímulos Separando modelo de visão com comunicação direta Conclusão