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
Download

Procedimento Inicial - Universidade do Algarve