Programação Orientada por Objectos H. Daniel e A. P. Costa UNIVERSIDADE DO ALGARVE Faculdade de Ciências e Tecnologia Departamental de Engenharia Electrónica e Informática Programação Orientada por Objectos (Ano lectivo 2004/2005 - 1º Semestre ) Engenharia de Sistemas e Informática Ensino de Informática Informática (2º ano) (2º ano) (2º ano) Docentes Drª. Ana Paula Costa (Práticas) Dr. Helder Daniel (Responsável, Teóricas, Práticas) Escolaridade: Créditos: 2 Teóricas + 3 Práticas 3 http://w3.ualg.pt/~hdaniel/poo POO Lab 1 -1 Programação Orientada por Objectos H. Daniel e A. P. Costa Recursos Necessários • PCs • VisualWorks ( http://www.cincom.com/smalltalk) • Compilador de ANSI C++ Avaliação Prática • Tem um peso de 40% para a avaliação contínua; • É baseada na realização de um conjunto de trabalhos; • A classificação prática é obtida pela média das classificações dos trabalhos; • Cada trabalho é classificado numa escala de 0 a 20 valores. Realização dos trabalhos • Os trabalhos são realizados em grupo. • A inscrição num grupo de trabalho é obrigatória (i.e., só são considerados trabalhos de alunos inscritos em grupos) • Os grupos são constituídos por dois elementos. Excepcionalmente será admitido um grupo de três elementos. • Cada aluno terá uma área de trabalho individual. • Terminado o prazo de entrega de um dado trabalho, cada grupo deverá disponibilizar na área de um dos seus membros, para além dos ficheiros de código produzidos, um ficheiro com um pequeno relatório do trabalho, devidamente identificado e com premissões só para leitura. Critérios de Avaliação dos Trabalhos • Correcção - Não se consideram características que excedam as especificações. • Utilização correcta dos princípios e técnicas da Programação Orientada por Objectos; será dada particular importância aos seguintes aspectos: - Estrutura de classes - Classes coesas - Reutilização de classes pré-definidas • Facilidade de utilização • Eficiência (utilização criteriosa de recursos) • Legibilidade • Comentários adequados no código: - Não se consideram comentários sobre sintaxe ou semântica da linguagem utilizada • Relatório: - Completo, conciso e claro. - Inclui manual de utilizador - Inclui manual de referência (opções tomadas, a estrutura e organização do programa, descrição de métodos e funções). - Não se consideram listagens de código; • Discussão http://w3.ualg.pt/~hdaniel/poo POO Lab 1 -2 Programação Orientada por Objectos H. Daniel e A. P. Costa VisualWorks - Procedimento Inicial 1. Entre na sua área de trabalho na rede ADEEC. 2. Antes de entrar pela primeira vez no ambiente VisualWorks faça uma cópia da imagem do ambiente original para a sua área. 2.1. 2.2. Crie uma directoria com o nome vwnc; Copie o seguinte ficheiro para a directoria que criou: c:\vwnc\image\visualnc.im 2.3. Opcionalmente copie os seguintes ficheiros para a directoria que criou: c:\vwnc\image\visualnc.cha c:\vwnc\image\visualnc.sou Estes ficheiros contêm o estado actual do ambiente de desenvolvimento. Caso algo inesperado aconteça poderá sempre voltar ao início, repondo estes ficheiros. Mantenha também copias de segurança destes ficheiros. Lembre-se que a preservação do seu trabalho é da sua responsabilidade. 3. Entre em VisualWorks, a partir da imagem criada na sua área: c:\vwnc\image\visualnc.im 4. A imagem inicial contêm apenas algumas ferramentas. Vamos utilizar uma ferramenta para construção de interfaces, designada por UI Painter. Para isso, vamos integrar o UI Painter e gravar a imagem. O UI Painter está definido num módulo externo também chamado parcela (parcel). 4.1. 4.2. 4.3. 4.4. Selecione Tools→Load Parcel Named... Introduza o nome da parcela a carregar ou se deixar o asterisco aparecerá uma lista de todas as parcelas disponíveis. Clique em UI Painter para seleccionar a par cela e depois em Ok. Aparecerá outra janela de diálogo, onde deve escolher o botão yes to all. 5. Grave a imagem de modo que as alterações que acabou de fazer à configuração do ambiente seja guardada. Seleccione File→Save As... Saía do VisualWorks. Poderá voltar a entrar clicando sobre o ficheiro com o nome que escreveu (válido apenas em ambiente Windows) 6. A imagem deve ser gravada periodicamente, conforme descrito em 4, para assegurar que o trabalho que realizou não se perde. Para além disso, deverá fazer cópias de segurança periódicas ou, pelo menos, no fim da aula de laboratório, dos três ficheiros descritos em 2. Ao reentrar no VisualWorks verificará que encontra tudo como tinha deixado antes de gravar a imagem. http://w3.ualg.pt/~hdaniel/poo POO Lab 1 -3 Programação Orientada por Objectos H. Daniel e A. P. Costa Trabalho 1a: Breve tutorial sobre o VisualWork e o desenvolvimento de interfaces Duração: 1hora 30 minutos. Objectivos • Expor os alunos ao ambiente de desenvolvimento, mostrando algumas das suas funcionalidades e modo de operação; • Ilustrar alguns dos conceitos básicos da programação orientada por objectos; • Motivar a aprendizagem da linguagem Smalltalk. Enunciado 1. Clique no botão com um cavalete ou seleccione Painter → New Canvas 2. Apareceram três janelas : 2.1. Paleta (Palette) 2.2. Ferramentas de tela (GUI Painter Tool) 2.3. Tela sem nome (Unlabeled Canvas) – onde irá construir o seu GUI 3. Nesta fase vamos construir uma interface simples para o utilizador introduzir um número que poderá ser incrementado e decrementado através de dois botões. 3.1. Vamos seleccionar peças da paleta que correspondem aos botões e campos de entrada. Quando se carrega num dos widgets da paleta aparece uma breve descrição na caixa da parte inferior da janela. 3.2. Seleccione dois campos de entrada (input field) e posicione-os na janela Unlabeled Canvas como aparece na figura. 3.3. Repita o passo anterior para os botões. 3.4. Clique no botão esquerdo do rato para seleccionar o botão de acção. Depois, levante o menu da janela, carregando no botão direito do rato. Seleccione Painter Tool. 3.5. No botão de acção, os itens mais importantes são os campos String e Action:. O Campo String define o rótulo do botão e Action as mensagens associadas. Apague o texto que aparece à frente de String e escreva Iniciar, Incrementa (Inc) e Decrementa (Dec) para cada um dos botões. Defina as acções Inicio, IncVal e DecVal para cada um dos botões. Clique em Apply. 3.6. Clique no botão esquerdo do rato para seleccionar os campos de input. Depois, levante o menu da janela, carregando no botão direito do rato. Seleccione Painter Tool. http://w3.ualg.pt/~hdaniel/poo POO Lab 1 -4 Programação Orientada por Objectos H. Daniel e A. P. Costa 3.7. No campo de input, os itens mais importantes são os campos Aspect: e Type:. O campo de input de topo serve apenas para mostrar o valor depois de incrementado ou decrementado. Na página de propriedades temos de indicar um nome para este campo em Aspect:, vamos designá-lo por ValorCorrente. No campo Type:, seleccione Number da lista disponível. Clique Apply. 3.8. Aparecerá como valor inicial 0. Clique na tabela Details do caderno de propriedades. No campo Align: seleccione Right (direita). Como apenas quer ver o valor alterado, clique em Read Only. Além disso não seleccione Can Tab. Clique Apply. 3.9. O segundo campo de entrada serve para o utilizador introduzir o valor inicial. Na página de propriedades, vamos indicar o nome Inicial em Aspect: No campo Type:, seleccione Number da lista disponível. Clique Apply. 3.10. Na página de detalhes, no campo Align: seleccione Right (direita). Desta vez queremos ter a possibilidade de introduzir um valor nesse campo. Apenas clique Apply. 3.11. Procure Label na paleta e coloque uma junto a cada um dos campos de entrada. Abra a página de propriedades e altere o campo String para os nomes correspondentes Valor Corrente e Inicial. Novamente confirme com Apply. 3.12. Para atribuir um nome ao canvas clique no fundo. Altere a string das propriedades para Incrementar Decrementar. Confirme com Apply. 3.13. É altura de gravar novamente a imagem. Seleccione File→ Save As... 3.14. Verifique se tem o canvas e o GUI Painter tool visíveis. Na ferramenta clique no botão Install. Aparece uma janela de diálogo Install on Class pedindo para especificar o nome da classe da aplicação, vamos designá-la por IncrementarDecrementar. Repare que aparece uma outra palavra windowSpec que corresponde a um método. O VisualWorks assume que a interface inicial é definida nesse método. Clique em OK. 3.15. Aparece outra janela de diálogo. O painel da esquerda contém uma lista de espaços nominativos (namespaces). O espaço nominativo Smalltalk aparece seleccionado. Não será o local apropriado para guardar a nova classe mas, por agora, ficará assim. As aplicações construídas no UIPainter são definidas quase sempre como subclasses de ApplicationModel. Clique em OK. 3.16. Clique no fundo do Canvas e carregue no botão Define da ferramentas do Canvas. Verifique se todos os 5 métodos aparecem seleccionados e se a caixa Add Inicialization também. Clique em OK. http://w3.ualg.pt/~hdaniel/poo POO Lab 1 -5 Programação Orientada por Objectos H. Daniel e A. P. Costa 3.17. Carregue no botão Browser na ferramenta do Canvas. O painel superior esquerdo apresenta a hierarquia de classes. No painel inferior aparece a definição do que está seleccionado. O painel central apresenta as categorias pelas quais os métodos estão organizados. 3.18. Aparece seleccionado o botão instance. Existem duas categorias para os métodos, actions e aspects. Clique em actions. Aparece a definição dos métodos para os botões que criou. Clique em aspects. Aparecem dois métodos que supostamente devem retornar o valor do respectivo aspect. 3.19. Para guardar o valor a incrementar e decrementar vamos definir uma variável instância. Esta definição não é estritamente necessária, no entanto serve para ilustrar o processo de definição de variáveis. Clique na classe IncrementarDecrementar, na lista de nomes de variáveis de instância acrescente uma nova variável de nome Aux. Verifique se o rato se encontra no interior da janela de código e clique no seu botão direito para abrir o menu de operação. Seleccione o item Accept para gravar. 3.20. Na categoria actions vamos alterar os três métodos para: IncVal "Incremento do valor em Aux e sua actualização em Valor Corrente" Aux:=Aux+1. ValorCorrente value: Aux. DecVal "Decremento do valor em Aux e sua actualização em Valor Corrente" Aux:=Aux-1. ValorCorrente value: Aux. Inicio "inicialização da variável que guarda o valor alterado" Aux:= Inicial value. ValorCorrente value: Aux. 3.21. Para testar a sua aplicação, clique em Open na ferramenta do canvas. 3.22. Finalmente pode gravar a sua imagem. http://w3.ualg.pt/~hdaniel/poo POO Lab 1 -6 Programação Orientada por Objectos H. Daniel e A. P. Costa 4. Vamos agora criar um novo espaço nominativo. Todo o código Smalltalk deve aparecer definido num sub-espaço nominativo do espaço Smalltalk. 4.1. Abra o Browser dos espaços nominativos (e.g., clique no botão com o globo). 4.2. Selecione a categoria System-Name Spaces. Seleccione o namespace Smalltalk. Depois seleccione New→Namespace do menu de operação. 4.3. O template de definição do namespace é apresentado na janela de código, em baixo. 4.3.1. Na 1ª linha, #NameSpace guarda o argumento da mensagem, que diz ao Smalltalk como se vai chamar o novo namespace. Vamos designá-lo por #Tutorial. 4.3.2. Na 6ª linha, category: corresponde a uma ajuda organizada. Vamos chamar-lhe ‘Experimental’. 4.4. Para guardar a definição e criar o namespace, verifique se o rato se encontra no interior da janela de código e clique no botão direito para abrir o menu de operação. Clique no item Accept. Agora, o namespace aparece na lista de hierarquias. 4.5. Para mover a classe IncrementarDecrementar para o namespace que criou, comece por seleccionar o namespace Smalltalk, no segundo e quarto paineis. No painel central em baixo procure pela classe IncrementarDecrementar e seleccione-a. No menu de operação escolha Utils→Browse. No novo browser selecione a classe IncrementarDecrementar, e abra o menu de operação. Agora escolha Move to ...→ Namespace ... . Aparece uma janela de diálogo mostrando os namespaces disponíveis. Seleccione o namespace Tutorial na caixa inferior da janela e clique em OK. 5. Vamos agora criar um modulo externo (parcela) para a nossa aplicação. Esta parcela pode ser usada para se carregar o nosso programa noutra imagem. Depois da parcela criada não será necessário manter a imagem de desenvolvimento (habitualmente de tamanho elevado). 5.1. Primeiro abra o Browser de sistema (Browse →System). Agora escolha Browse →Parcel. 5.2. O painel superior esquerdo deverá mostra todas as parcelas activasAbra o menu de operação e seleccione New... . Aparece uma janela a pedir o nome da nova parcela. Escreva Teste e clique em OK. 5.3. De seguida seleccione ***Unparceled*** na 1ª Janela de cima, e na 2ª janela escolha a classe IncrementarDecrementar. No menu de operação seleccione Move → Selected to Parcel. 5.4. Repita o passo anterior para o namespace Smalltalk. http://w3.ualg.pt/~hdaniel/poo POO Lab 1 -7 Programação Orientada por Objectos H. Daniel e A. P. Costa 5.5. Para escrever a parcela para um ficheiro seleccione a parcela Teste. Abra o menu de operação e seleccione Save... . Aparece uma janela de diálogo. Escreva o nome que quer dar ao ficheiro, por exemplo Teste. Clique em OK. Apareceram dois ficheiros na directoria da imagem de trabalho, Teste.pcl e Teste.pst. Deve copiar estes ficheiros para a sua disquete. 6. Para re-abrir um canvas deve seleccionar o Browser de Recursos (Painter→ Resource Finder). Seleccione a classe que contem o canvas, depois seleccione a especificação e clique em Edit (neste caso será Tutorial.IncrementarDecrementar). Para guardar alguma alteração que faça no canvas, deve proceder à sua reinstalação. Mais informação pode ser encontrada nos manuais que acompanham a distribuição: \vw7\doc\GuiDevGuide.pdf \vw7\doc\AppDevGuide.pdf http://w3.ualg.pt/~hdaniel/poo POO Lab 1 -8 Programação Orientada por Objectos H. Daniel e A. P. Costa Trabalho 1b: Familiarização com o VisualWorks e o Smalltalk Duração: 1hora 30 minutos. Objectivos Familiarização com: 1. Janelas de texto e o Transcript: Avaliação de expressões simples; 2. Menus e suas opções; 3. Browser de classes; • Adicionar/remover classes e seus métodos; • Guardar e instalar classes; 4. Inspector 5. Walkback e Debugger. Enunciado Depois de efectuar o procedimento inicial descrito anteriormente proceda como se segue: 1. Abra uma nova janela de texto (Tools→Workspace ou clicando no segundo botão da esquerda); 2. Avalie as expressões abaixo. 2.1. Seleccione uma expressão; 2.2. Levante o menu de operação da janela, carregando no botão direito do rato; 2.3. Seleccione Print It. Observe o resultado obtido. Algumas das expressões permitirão aceder ao Debuger. i) ii) iii) iv) v) vi) vii) viii) ix) x) xi) xii) xiii) xiv) xv) xvi) xvii) xviii) xix) xx) xxi) ‘isto e uma string’ class 1234 class $A class #( 1 2 3 ) class #( 1 (‘2’ 3) ) class 1/2r10 1/2r10 class 8r(4/2) 1 / 2 class (3/4) class 16rD3 class 16rF1 20 factorial ‘uma grande string’ size #( 1 2 3 ) size #( 1 (2 3) ) size ‘uma grande string’ at: 5 ‘uma grande string’ includes: $g ‘uma grande string’ copyFrom: 2 to: 7 #( 1 2 3 ) at: 2 #( 1 (2 3) ) at: 2 http://w3.ualg.pt/~hdaniel/poo POO Lab 1 -9 Programação Orientada por Objectos H. Daniel e A. P. Costa xxii) xxiii) xxiv) xxv) xxvi) xxvii) ‘tudo para cima’ asUppercase ‘de tras para a frente’ reverse #( 1 2 3 ) reverse #( 1 (2 3) ) reverse $A asInteger 65 asCharacter 3. Avalie a expressão #(1 a (2 3)) inspect. Avalie ainda Smalltalk inspect. 4. Grave o conteúdo da janela de texto (File→Save As) 5. Obtenha o dobro do seu número de grupo somado a 3 e dividido por 2. O resultado confirma as suas expectativas? 6. Implemente na classe Integer, o método fibonnaci, que calcula o número de fibonnaci. 6.1. Abra o Browser de classes (Browse→Classe Named) ou clique no terceiro botão da direita do painel de ferramentas); 6.2. Escreva Magnitude 6.3. Na janela do canto superior esquerdo, seleccione a sub-classe Number; 6.4. Continue e seleccione a sub-sub-classe Integer; 6.5. Seleccione factorization and devisibility na lista de categorias de métodos (janela do meio em cima); 6.6. Implemente o seguinte método fibonnaci, na janela de baixo: fibonnaci "Calcula o número de fibonnaci." self > 2 ifTrue: [^(self - 1) fibonnaci + (self - 2) fibonnaci]. self <= 0 ifTrue: [^self error: 'negative value']. ^1 6.7. Grave o método. Seleccione Accept do menu do painel onde escreveu o código. 6.8. Teste no workspace o método implementado avaliando um conjunto de expressões adequadas. 6.9. Guarde o método fibonnaci num ficheiro. Seleccione File Out as... do menu do painel de métodos, clicando com o botão direito sobre o nome do método; 6.10. Guarde toda a classe Integer em ficheiro. Seleccione File Out as... do menu do painel de classes. Nota Os primeiros números da série de Fibbonnaci são: Inteiro Nº de fibonnaci <= 0 1 Não definido 1 2 1 3 2 4 3 5 5 6 8 ... ... O método implementado acima é ineficiente. Porquê? Implemente um outro método que calcule o número de Fibbonaci de forma eficiente. Observações 1. Este trabalho não será avaliado. 2. Excepcional e facultativamente, do relatório deverá apenas constar as dificuldades encontradas na realização do trabalho. http://w3.ualg.pt/~hdaniel/poo POO Lab 1 - 10