
























Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Material voltado a matéria de Técnicas Alternativas de Programacão (TAP) - UFPR.
Tipologia: Notas de estudo
1 / 32
Esta página não é visível na pré-visualização
Não perca as partes importantes!

























http://media.wiley.com/assets/264/19/0764557599_bonus_AppA.pdf
http://www.cs.vu.nl/~eliens/poosd/ http://www.cs.vu.nl/~eliens/online/oo/contents.html
http://www.inf.ufpr.br/andrey/soft/docs/beckCunningham89.pdf
Em linhas gerais, o paradigma de “orienta¸c˜ao a objetos” auxilia desenvolvedores a descrever disciplinada- mente a solu¸c˜ao de problemas complexos de especifica¸c˜ao e de programa¸c˜ao (e n˜ao a complexidade dos pontos de vista de dom´ınio espec´ıfico e esfor¸co computacional). De forma mais detalhada, o termo complexo se refere `a integra¸c˜ao das seguintes tarefas de programa¸c˜ao:
A vis˜ao tradicional do paradigma de programa¸c˜ao imperativista e procedimental enfoca prioritariamente as opera¸c˜oes (ou fun¸c˜oes) e, em segundo plano, os dados que s˜ao manipulados (consultados e alterados) pelas opera¸c˜oes. Nestas condi¸c˜oes, o “ataque” indisciplinado e n˜ao padronizado aos dados pode provocar graves problemas de desenvolvimento. Na vis˜ao da programa¸c˜ao orientada a objetos, a id´eia geral ´e a de deslocar o foco prim´ario de aten¸c˜ao para o dado, de maneira que, em segundo plano, um conjunto padronizado de opera¸c˜oes possa ser definido e subordinado ao dado. Dessa forma, objetos de dados podem “se comunicar” uns com os outros por meio de canais “estreitos” e muito precisamente definidos. Diante de um princ´ıpio t˜ao b´asico, podemos dizer que tanto a programa¸c˜ao orientada por eventos quanto a programa¸c˜ao orientada por agentes s˜ao varia¸c˜oes da programa¸c˜ao orientada a objetos.
Para que seja poss´ıvel a descri¸c˜ao amplamente abstrata de programas, o paradigma de programa¸c˜ao orientada a objetos oferece duas disciplinas principais: (a) modulariza¸c˜ao e (b) oculta¸c˜ao parcial de informa¸c˜ao. A modulariza¸c˜ao ´e uma disciplina que se preocupa com a fragmenta¸c˜ao de um programa em partes (denominados m´odulos) com descri¸c˜ao auto-contida. Em termos computacionais, isto significa que um m´odulo pussui todas as estruturas de dados e algoritmos respons´aveis por implementar, “independente- mente”, sua parte diante do sistema completo. A oculta¸c˜ao parcial de informa¸c˜ao eleva o n´ıvel de abstra¸c˜ao um passo acima por se preocupar em esconder (parcial ou totalmente), dos usu´arios de um m´odulo, os detalhes de impelemta¸c˜ao do pr´oprio m´odulo. Com a oculta¸c˜ao (parcial ou total) da informa¸c˜ao, os usu´arios tˆem acesso a um objeto somente por meio de uma interface protegida (transl´ucida) de opera¸c˜oes de comunica¸c˜ao. Sendo assim, ao usu´ario de um m´odulo, n˜ao ´e permitido o acesso a alguns detalhes internos de implementa¸c˜ao de estruturas de dados e algoritmos.
O Polimorfismo, na verdade, pode ser enquadrado de duas grandes categorias diferentes:
Objetos de dados podem “se comunicar” uns com os outros por meio de canais “estreitos” e muito precisamente definidos, conhecidos como o envio de mensagens. Esta forma de comunica¸c˜ao entre objetos permite uma s´erie de interpreta¸c˜oes dinˆamicas, as quais podem ser resumidamente apresentadas como:
A t´ecnica de programa¸c˜ao por heran¸ca de c´odigo ´e uma das mais conhecidas e contempla os conceitos de classes, subclasses, e instˆancias como objetos. Em seu est´agio mais elementar, a heran¸ca simples permite que todas as subclasses ou instˆancias de uma classe tenham acesso autom´atico a todos os dados e m´etodos da referida classe. Em uma defini¸c˜ao hier´arquica contendo um n´umero indefinido de n´ıveis de classes, subclasses e instˆancias, esta t´ecnica permite que um objeto qualquer da hierarquia tenha acesso autom´atico a todos os dados e m´etodos de todas as classes de objetos aos quais ele est´a subordinado.
As t´ecnicas de organiza¸c˜ao taxonˆomica e especializa¸c˜ao de c´odigo s˜ao talvez as maiores motivadoras de conceitos na programa¸c˜ao orientada a objetos. A t´ecnica de organiza¸c˜ao taxonˆomica do c´odigo permite o grupamento de objetos que compartilham comportamentos semelhantes. Este grupamento ´e chamado de classifica¸c˜ao da informa¸c˜ao, o qual tamb´em admite que uma classifica¸c˜ao inclua outra. Por exemplo, uma “pilha” com comportamento “empilha” e “desempilha” pode ser inclu´ıda em uma “nova pilha” a qual tem comportamentos “empilha”, “desempilha” e “imprime”. De forma an´aloga, a especializa¸c˜ao permite a extens˜ao de comportamentos genericamente semel- hantes por meio de adapta¸c˜oes ou refinamentos sucessivos que ficam gravados explicitamente como parte integrante do c´odigo. Por exemplo, uma “fila” pode ser classificada como uma entidade que pos- sui os comportamentos “insere”, “elimina” e “imprime”. Sendo assim, todas as sub-classes derivadas de “fila” ter˜ao, consequentemente, os mesmos nomes de comportamentos (“insere”, “elimina” e “imprime”), definidos, por´em, de formas mais e mais refinadas, estendendo ou substituindo integralmente o c´odigo dos comportamentos equivalentes nas super-classes.
Mais comumente chamado de valor “default”, o preenchimento de valor ausente ´e uma forma original- mente criada no ˆambito dos primeiros passos da programa¸c˜ao orientada a objetos. A id´eia b´asica desta t´ecnica ´e a de obten¸c˜ao dinˆamica de um valor, assumido na falta de outro mais especificamente dedicado a um objeto. Em v´arios casos, a combina¸c˜ao da t´ecnica de valor ausente com a t´ecnica de heran¸ca oferece um poderoso mecanismo de reutiliza¸c˜ao de c´odigo. Por meio de tal mecanismo, ´e poss´ıvel realizar a cria¸c˜ao de grandes quantidades de objetos contendo, na descri¸c˜ao de cada um, apenas a defini¸c˜ao expl´ıcita dos elementos de diferenciadores. A defini¸c˜ao expl´ıcita dos elementos de semelhan¸ca fica localizada na programa¸c˜ao da classe dos objetos.
Na linguagem flavours, uma classe (ou flavour) tem a seguinte forma gen´erica:
uses flavours; flavour
O corpo de uma classe ´e constitu´ıdo de vari´aveis de instˆancia e de m´etodos. As vari´aveis de instˆancia s˜ao atributos que comp˜oem o estado dos dados de um objeto. Os m´etodos s˜ao descri¸c˜oes de como receber e manipular mensagens enviadas ao objeto. A sess˜ao de vari´aveis de instˆancia ´e definida com a decclara¸c˜ao “ivars” ao passo que cada m´etodo ´e deninido com a declara¸c˜ao “defmethod”. O exemplo abaixo mostra a defini¸c˜ao de uma classe “pessoa” contendo 3 vari´aveis de instˆancia e 2 m´etodos.
uses flavours; flavour pessoa; ivars nome idade sexo; defmethod aniversario; idade + 1 -> idade; [ feliz aniversario para ^nome] => enddefmethod; defmethod identifique_se; pr(’<pessoa ’); pr(nome); pr(’>\n’); enddefmethod; endflavour;
A cria¸c˜ao de instˆancias de classes ´e feita por meio da ativa¸c˜ao do procedimento “make instance”, o qual deve receber como parˆametro ´unico, uma lista contendo seqˆencias das seguintes informa¸c˜oes combinadas: <vari´avel de instˆancia> e seu
: vars joao; : make_instance([pessoa nome joao idade 30 sexo masculino]) -> joao;
Observa¸c˜ao: neste caso, o nome da instˆancia (“joao”) coincidiu com o valor inicial da vari´avel de instˆancia “nome”. Se a instˆancia “joao” da classe “pessoa” for empilhada e, em seguida, impressa, obteremos o seguinte:
: joao => **
O envio de mensagens ´e feito da seguinte forma geral:
A mensagem ´e estruturada com base no conceito de sele¸c˜ao do foco de comunica¸c˜ao. O “seletor” de foco ´e sempre associado a uma veri´avel de instˆancia a ser simplesmente consultada (de forma padr˜ao) ou alterada e/ou consultada (por meio de m´etodos definidos na classe). Em v´arios casos, n˜ao h´a argumentos a serem associados ao seletor. No exemplo abaixo, v´arias mensagens s˜ao enviadas `a instˆancia “joao”, nas quais os seletores coincidem propositalmente com os nomes das vari´aveis de instˆancia “idade”, “sexo” e “nome” (consulta padr˜ao).
Agora ent˜ao podemos executar os seguintes passos:
: joao <- conjuge=> **
;;; MISHAP - BIGAMIA ;;; INVOLVING:
Cuidado! A repeti¸c˜ao do envio de uma mesma mensagem pode n˜ao provocar o mesmo efeito. Vocˆe pode imaginar por que? Por exemplo, no caso abaixo, pode ser que mais um m´etodo (“sus- pende casamento”) tenha que ser definido para evitar a situa¸c˜ao.
: joana <- casa(joao); :
A heran¸ca na linguagem flavours ´e definida por meio da declara¸c˜ao “isa”. Ela permite que uma sub-classe ou super-classe de outra classe seja especificada, permitindo assim a visibilidade autom´atica, por parte de uma sub-classe, das vari´aveis de instˆancia e dos m´etodos definidos na classe. No exemplo abaixo, “professor” ´e definida como sub-classe de “pessoa”. Sendo assim, instˆancias da classe “professor” possuir˜ao automaticamente tamb´em as vari´aveis “nome”, “idade”, “sexo” e “con- juge”. Al´em destas, foram adicionadas 2 vari´aveis espec´ıficas (exclusivas) da classe professor: “matricula” e “area de interesse”. Sendo assim, uma instˆancia de professor, al´em de responder a todas as mensagens que uma instˆancia de pessoa ´e capaz de responder, ainda responder´a `as mensagens “leciona” e “identi- fique se”.
flavour professor isa pessoa; ivars matricula area_de_interesse; defmethod leciona(assunto); [^nome da aula de ^assunto] => enddefmethod; defmethod identifique_se;
pr(’<professor ’); pr(nome); pr(’>\n’); enddefmethod; endflavour;
Observa¸c˜ao: note que, aparentemente, uma instˆancia de professor tem agora 2 (dois) m´etodos para manipular a mensagem “identifique se”. Todavia, se a mensagem “identifique se” for enviada para uma instˆancia de professor, o m´etodo mais espec´ıfico ser´a utilizado para manipular a mensagem (aquele definido dentro da classe “professor”). Alguns exemplos de uso de heran¸ca simples s˜ao:
: vars alex; : make_instance([professor nome alex sexo masculino idade 26 area_de_interesse programacao_oo ]) -> alex; : alex => **
V´arios sistemas de programa¸c˜ao orientada a objetos permitem que uma classe herde veri´aveis e m´etodos de mais de uma classe. Esta t´ecnica ´e chamada de heran¸ca m´ultipla e tamb´em ´e especificada com a declara¸c˜ao “isa”. No exemplo abaixo, uma nova classe, a de “professor ingles”, ´e definida como sub-classe de “profes- sor”, a qual, por sua vez, ´e tamb´em uma sub-classe de “pessoa”.
flavour professor_ingles isa professor; ... ... endflavour;
Uma forma alternativa de definir “professor ingles” por meio de heran¸ca m´ultipla seria por meio da cria¸c˜ao de uma classe “pessoa inglesa” e, em seguida, definindo “professor ingles” como sub-classe tanto de “pessoa inglesa” quanto de “professor”. Isto poderia ser atingido da seguinte forma:
flavour professor_ingles isa pessoa_inglesa professor; ... ... endflavour;
3.1.1 N ´UMEROS (numbers):
{3 gato ’curso de Pop-11’ 99 }
Para se ter acesso a um determinado de um vetor tanto para consulta quanto para altera¸c˜ao, um ´ındice num´erico deve ser utilizado, de acordo com os exemplos abaixo:
: {um gato} -> vetor; : vetor(2) => ** gato : subscrv(2,vetor) => ** gato : "rato" -> subscrv(1, vetor); : vetor => ** {rato gato}
Vetores, assim como words, striings e outros objetos, podem ser concatenados da seguinte forma:
: {o curso} <> {de pop esta emocionante} => ** {o curso de pop esta emocionante}
REFERˆENCIAS: help vectors, help consvector, help subscrv, help vectorclass
3.1.5 VETORES MULTIDIMENSIONAIS OU MATRIZES (arrays): Um array ´e uma estrutura multidimensional composta de:
Para se criar um array, deve ser utilizado o procedimento “newarray” da seguinte forma:
newarray(<LISTA-DE-LIMITES>, <VALOR-INICIAL>) -> <NOME-MATRIZ> ;
Por exemplo:
: newarray([1 10 1 10], 0) -> matriz; : matriz => ** <array [1 10 1 10]>
Em modo de consulta, temos por exemplo:
: matriz(3,9) => ** 0
Em modo de altera¸c˜ao, temos por exemplo:
: 1 -> matriz(3,9);
Se o acesso tentar utilizar um ´ındice inv´alido, teremos:
: matriz(3,29) => ;;; MISHAP - INVALID ARRAY SUBSCRIPT ;;; INVOLVING: 29 ;;; DOING : compile nextitem popval compile
Caso seja necess´ario criar um array com valores iniciais diferentes para cada elemento, a seguinte forma do “newarray” pode ser usada:
newarray(<LISTA-DE-LIMITES>,
Neste caso, < LIST A − DE − LIM IT ES > tem 2N elementos e < P ROCEDIM EN T O >, quando ´e ativado, recebe N inteiros como parametros, os quais s˜ao resultantes de cada elemento do produto cartesiano dos ´ındices. A quantidade de vezes que < P ROCEDIM EN T O > ´e ativado ´e igual ao n´umero total de elementos do array. Para cada ativa¸c˜ao, o valor inicial do referido elemento ´e calculado com base nos valores dos ´ındices do elemento. Sendo assim, o valor de < N OM E − M AT RIZ > (i 1 , i 2 , ..., iN ) ser´a calculado por uma ativa¸c˜ao autom´atica da forma: < P ROCEDIM EN T O > (i 1 , i 2 , ..., iN ) onde i1 e’ um valor dentro dos limites num´ericos da dimens˜ao 1, valendo o mesmo para i 2 , ..., iN. REFERˆENCIAS: teach arrays, help newarray
3.1.6 LISTAS DIN ˆAMICAS (lists):
Listas dinamicas s˜ao estruturas muito flex´ıveis e que contam com um grande n´umero de procedimentos de manipula¸c˜ao, constituindo uma poderosa biblioteca para a implementa¸c˜ao de algoritmos diversos. O exemplo abaixo mostra como criar uma lista de 4 elementos:
[ 333 ’curso maravilhoso’ [a b c ] 99 ]
Listas podem ser facilmente manipuladas, por exemplo, para a invers˜ao de seus elementos:
: rev([1 2 3 4]) => ** [4 3 2 1]
O ´ultimo elemento de uma lista ´e obtido com o procedimento “last”:
: last([gato cachorro cobra]) => ** cobra : last([ [marcus vinicius] [luiz alberto] [ana maria] ]) => ** [ana maria]
Ou o primeiro elemento:
: hd([1 2 3 4]) => ** 1 : hd(rev([gato cachorro cobra])) => ** cobra : hd(last([ [marcus vinicius] [luiz alberto] [ana maria] ])) => ** ana
Por´em, se uma lista vazia for processada, o seguinte ocorre:
: hd([]) =>
;;; MISHAP - NON-EMPTY LIST NEEDED ;;; INVOLVING: [] ;;; DOING : hd pop_setpop_compiler runproc runproc
O procedimento “tl” recebe uma lista e produz uma nova lista contendo todos os elementos da lista de entrada, com excess˜ao do primeiro.
: delete(3, [3 3 3], 1) => ** [3 3] : delete(3, [3 3 3], 2) => ** [3]
Considere o seguinte comportamento:
: vars l, l1; : [ a b c ] -> l; : l -> l1; : 93 -> l1(2); : l1 => ** [a 93 c] : l => ** [a 93 c]
Listas s˜ao compostas de pares. Um par ´e uma estrutura com os componentes
Uma lista de 3 elementos ´e constituida de 3 pares encadeados:
_____ variavel l | _____ variavel l v | ____v___________ ________________ ________________ | a | ----------> | 93 | ---------->| c | ------>/
Logo, ambas as vari´aveis “l” e “l1” apontam para o mesmo local de mem´oria. Cuidado!!! A concatena¸c˜ao de listas pode produzir efeitos indesej´aveis. Por exemplo:
: [ a b c ] -> l1; : [ d e f ] -> l2; : l1 <> l2 -> l3;
A´em das opera¸c˜oes acima, ainda temos:
: 3 :: [4 5 6] => ** [3 4 5 6] : "CAT" :: [] => ** [CAT] : "CAT" :: "DOG" =>
;;; MISHAP - LIST NEEDED ;;; INVOLVING: DOG ;;; DOING : :: pop_setpop_compiler runproc runproc
Quando da intercala¸c˜ao ou composi¸c˜ao de listas, cuidados devem ser tomados com a diferen¸ca entre inser¸c˜ao e c´opia dos elementos um a um. Veja o exemplo abaixo:
vars lista; [ b c d ] -> lista; [a ^lista e ] => ** [a [b c d] e] [a ^^lista e ] => ** [a b c d e]
Al´em disso, os seguintes comandos s˜ao equivalentes:
: [^x] <> l -> l; : x :: l -> l; : [^x ^^l] -> l;
. Tamb´em s˜ao equivalentes os seguintes comandos:
: [ ^X + ^Y is ^(X + Y) ] -> l; : [% X, "+", Y, "is", X + Y %] ->l; : [ %X% + %Y% is %X + Y% ] -> l;
Finalmente, ´e importante entender alguns detalhes das express˜oes abaixo:
[ % 3, aaa, hd(l) % ] [ 3, aaa, hd(l) ] [ % aaa, hd(l)% ] [% [% a %], [% b, c%], [% d %] %]
REFERˆENCIAS: teach lists, teach listsummary, help morelists help destlist, dest, dl, explode, applist, maplist, sort, ::, <>
3.1.7 REGISTROS (defclass):
Classes de registros s˜ao definidas para que seja poss´ıvel alocar estruturas heterogˆeneas na mem´oria de forma orientada por atributos mnemˆonicos. Listas e vetores tamb´em admitem valora¸c˜ao heterogˆenea por´em, o acesso indexado ´e puramente num´erico. No exemplo abaixo, a classe de registros “reg aluno” ´e definida com atributos “matric aluno”, “nome aluno”, “ira aluno”. Em seguida, o objeto registro “alexd” ´e definido.
: defclass reg_aluno {matric_aluno, nome_aluno, ira_aluno}; : consreg_aluno(981334, ’Alexandre Direne’, 7.46) -> alexd;
A atribui¸c˜ao, expressa por “− >” e uma opera¸c˜ao que remove um item da pilha do programador, e o coloca em outra posi¸c˜ao de mem´oria. Por exemplo, coloca-se quatro itens na pilha da seguinte forma:
: 9, ’gato’, 99, "azul";
A seta de atribui¸c˜ao pode ser usada para remover o topo da pilha e armazena-lo como o valor da vari´avel “x” da seguinte forma:
: -> x;
Logo, 3 itens ainda permanecem na pilha.
: stacklength() ==> ** 3
Agora, se exibirmos o que restou na pilha teremos:
: => ** 9 gato 99
Ou ainda, a forma geral da decis˜ao por nega¸c˜ao ´e:
unless
...
Esta ´e equivalente a:
if not(
Seja o exemplo abaixo:
if x > y then x => else y => endif;
Compare com:
if x > y then x => elseif y > x then y => else "iguais" => endif;
Considere agora o exemplo abaixo:
if 2 < x and x < 6 then true ; else false ; endif =>
Note que o exemplo acima ´e equivalente a:
2 < x and x < 6 =>
REFERˆENCIAS: help if, help switchon
Forma geral:
until
Exemplo:
3 -> num; until num > 99 do num => num + 1 -> num; enduntil;
Forma geral:
repeat
Exemplo:
repeat 10 times pr(newline) endrepeat;
Forma geral:
repeat
Observa¸c˜ao: repeti¸c˜ao infinita (a para deve utilizar quitif). Forma geral:
while
Exemplo:
1 -> num; while num * num < 1000 do num + 1 -> num endwhile;
Forma geral:
for
Exemplo:
for 1->x step x+2 -> x till x > 42 do spr(x); endfor;
: 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41
Forma geral:
for
Exemplo:
[1 2 3 4 5] -> numbers; for num in numbers do pr(’\n O quadrado de: ’); pr(num); pr(’ e: ’); pr(num*num); endfor;
: O quadrado de: 1 e: 1 O quadrado de: 2 e: 4 O quadrado de: 3 e: 9 O quadrado de: 4 e: 16 O quadrado de: 5 e: 25
Forma geral:
for
Quando o erro ´e semˆantico, este receber´a tratamento semelhante ao sint´atico mas com a exibi¸c˜ao da mensagem somente em tempo de execu¸c˜ao do comando (e n˜ao de compila¸c˜ao). Por exemplo, considere a compila¸c˜ao correta do procedimento abaixo:
define teste; "um" + "dois" => enddefine;
A ati¸c˜ao do mesmo prodizir´a:
: teste(); ;;; MISHAP - NUMBER(S) NEEDED ;;; INVOLVING: um dois ;;; DOING : + teste pop_setpop_compiler runproc runproc
REFERˆENCIAS: help mishap
Vari´aveis e constantes s˜ao identificadores os quais podem assumir escopo DIN AMICO ou Lˆ EXICO.´ Todo identificador em Pop-11 ´e local ao seu escopo, a n˜ao ser que este seja explicitamente declarado como GLOBAL. Observa¸c˜oes Importantes:
Forma geral para declara¸c˜ao:
vars
REFERˆENCIAS: help vars, help constant, help global Exemplos:
define teste11; vars a11; 1 -> a11; enddefine;
define teste12; lvars a12; 2 -> a12; enddefine;
: isdeclared("a11") => ** <ident
: isdeclared("a12") => **
Observa¸c˜oes adicionais:
A declara¸c˜ao de procedimentos e fun¸c˜oes como unidades de um programa ´e feita da seguinte forma:
define
Quando for o caso, o “ATUALIZADOR” do procedimento ou fun¸c˜ao tamb´em pode ser declarado de forma semelhante:
define updaterof
De forma mais espec´ıfica, o procedimento abaixo define um identificador “proc” de 3 argumentos e 2 resultados. O nome “proc” ´e global e o corpo do procedimento e’ associado a “proc” como sendo seu valor.
define proc(a,b,c) ->d ->e; < ... > < ... > enddfine;
Adicionalmente, cinco vari´aveis LOCAIS, 3 de entrada e 2 de sa´ıda, s˜ao declaradas implicitamente e ser˜ao, por default, de carater PERMANENTE (n˜ao s˜ao de escopo l´exico). Caso seja requisito de programa¸c˜ao que as vari´aveis (algumas ou todas) sejam de carater TEMPOR ARIO, a declara¸´ c˜ao expl´ıcita das mesmas se faz necess´ario. A forma gen´erica para isso ´e a seguinte:
define proc(a,b,c) ->d ->e; lvars a,b,c,d,e;
Em seguida est˜ao alguns exemplos b´asicos de modulariza¸c˜ao de comandos explicitando as quest˜oes de VISIBILIDADE (escopo) e VALIDADE (tempo) de vari´aveis.