Sign in
Log inSign up
Um tour rápido pelo Pharo

Um tour rápido pelo Pharo

Crab Log's photo
Crab Log
·Oct 23, 2021·

33 min read

Traduzido de A quick tour of Pharo.

Este post faz parte do Tutorial de Pharo Smalltalk.

Este capítulo o levará a uma visita de alto nível do Pharo, para ajudá-lo a se preparar para o ambiente. Haverá muitas oportunidades para experimentar as coisas, então seria uma boa idéia se você tiver um computador à mão quando estiver lendo este capítulo.

Em particular, você irá ativar o Pharo, aprender sobre as diferentes maneiras de interagir com o sistema e descobrir algumas das ferramentas básicas. Você também aprenderá a definir um novo método, a criar um objeto e a enviar-lhe mensagens.

Nota: A maior parte do material introdutório deste livro funcionará com qualquer versão Pharo, portanto, se você já tiver uma instalada, você poderá continuar a usá-la. Entretanto, como este livro foi escrito para o Pharo 90, se você notar diferenças entre a aparência ou comportamento de seu sistema e o que é descrito aqui, não se surpreenda.

1.1 Instalando o Pharo

O Pharo não precisa instalar nada em seu sistema, pois ele é perfeitamente capaz de funcionar de forma autônoma. Como será explicado mais tarde, Pharo consiste na máquina virtual (VM), a imagem (image), as alterações (changes) e os códigos fonte (sources).

Dependendo de sua plataforma, baixe o arquivo .zip apropriado, descomprima-o em um diretório de sua escolha e agora você está pronto para executar o Pharo. O Pharo também pode ser instalado através da linha de comando.

Usando o Pharo Launcher

Mesmo se o Pharo possa ser executado como uma aplicação standalone e executado a partir da linha de comando, encorajamos o uso do Pharo Launcher como mostrado na seção 1.5.

Ele é uma ferramenta muito prática para gerenciar as distribuições do Pharo. Está disponível em pharo.org/download. O Pharo Launcher é uma aplicação multiplataforma que permite fácil gerenciamento das imagens do Pharo. Clique no button correspondente ao seu sistema operacional para fazer o download da versão apropriada do Pharo Launcher, ela contém tudo que você precisa para executar o Pharo.

Fazendo o download do Pharo

Se você quer usar somente o Pharo ele está disponível em pharo.org/download.

Para uma versão standalone faça o download do arquivo .zip apropriado. Uma vez que o arquivo seja descomprimido você terá tudo que é preciso para executar o Pharo.

Usando scripts úteis

files.pharo.org/get oferece uma coleção de scripts para download de versões específicas do Pharo. Isto é realmente útil para automatizar o processo.

Para baixar o último sistema completo 9.0, use o seguinte snippet.

wget -O- get.pharo.org/90+vm | bash

Então você pode executar o seguinte

./pharo-ui Pharo.image

1.2 Pharo: Arquivos que o compõem

O Pharo consiste em quatro arquivos principais. Embora não seja necessário lidar diretamente com eles para o propósito deste livro, é útil compreender os papéis que eles desempenham.

  1. A máquina virtual (VM - virtual machine) é o único componente que é diferente para cada sistema operacional. A VM é o motor de execução (semelhante a uma JVM, do Java). Ela usa o bytecode do Pharo que é gerado cada vez que um usuário compila um código, o converte em código de máquina e o executa. Pharo vem com a VM Cog uma VM JITing muito rápida. O VM executável é nomeado:
    • Pharo.exe para Windows,
    • pharo para Linux, e
    • Pharo para OSX (dentro de um pacote também chamado Pharo.app).

Os outros componentes abaixo são portáveis em sistemas operacionais, e podem ser copiados e executados em qualquer máquina virtual apropriada a cada sistema operacional.

  1. O arquivo de image fornece uma imagem congelada no tempo de um sistema Pharo em funcionamento. Este é o arquivo onde todos os objetos são armazenados e, como tal, é um formato de multi-plataforma. Um arquivo de imagem contém o estado ao vivo de todos os objetos do sistema em um determinado ponto, incluindo classes e métodos compilados, uma vez que eles também são objetos. Uma imagem é um recipiente virtual de objetos. O arquivo é nomeado de acordo com a versão (como Pharo9.0.image) e é sincronizado com o arquivo Pharo9.0.changes descrito abaixo.

  2. O arquivo changes registra todas as modificações do código fonte (especialmente todas as modificações feitas durante a programação) desde que o momento em que o arquivo .sources foi gerado. Cada versão fornece um arquivo quase vazio nomeado para a versão, por exemplo, Pharo9.0.changes. Este arquivo de mudanças suporta um histórico por método para diffs ou reversão. Isso significa que mesmo que você não tenha conseguido salvar o arquivo de imagem em uma falha ou simplesmente esquecido, você pode recuperar suas alterações a partir deste arquivo. Um arquivo de mudanças é sempre acoplado a um arquivo de imagem. Elas funcionam em pares. Não mexa com ele. Mesmo que o Pharo possa funcionar sem ele, você poderia perder sua sessão de codificação se não as salvasse com o git.

  3. O arquivo sources contém o código fonte para partes do Pharo que não mudam com freqüência. Este arquivo é importante porque o formato do arquivo de imagem armazena apenas objetos incluindo métodos compilados e seu bytecode e não seu código-fonte. Tipicamente, um novo arquivo fonte é gerado uma vez por grande lançamento do Pharo. Para o Pharo 9.0, este arquivo é chamado PharoV90.sources.

O par Image/Changes

Os arquivos .image e .changes fornecidos por uma release do Pharo são o ponto de partida para um ambiente dinâmico que você adapta às suas necessidades. Na medida em que você trabalha no Pharo, esses arquivos são modificados, portanto você precisa se certificar de que eles sejam graváveis. Preste atenção para remover as mudanças e arquivos de imagem da lista de arquivos a serem verificados por anti-vírus. Os arquivos .image e .changes estão intimamente ligados e devem ser sempre mantidos juntos, com nomes de arquivos base correspondentes. Nunca os edite diretamente com um editor de texto, pois .images guarda sua memória de tempo de execução do objeto em tempo real, que indexa nos arquivos .changes para a fonte. É uma boa idéia manter uma cópia de segurança dos arquivos .image e .changes baixados para que você possa sempre começar a partir de uma imagem nova e recarregar seu código. Entretanto, a maneira mais eficiente de fazer backup do código é usar o Iceberg para usar o git (um sistema de controle de versão) que proporcionará uma maneira mais fácil e poderosa de fazer backup e rastrear suas alterações.

Configuração usual

Os quatro arquivos principais acima podem ser colocados no mesmo diretório, mas é uma prática comum colocar a Virtual Machine e o arquivo de fontes (sources) em um diretório separado, onde todos têm acesso somente de leitura a eles.

Escolha o que funcionar melhor para seu estilo de trabalho e seu sistema operacional. Para começar com o Pharo é melhor usar o Pharo Launcher pois ele administrará tudo para você.

1.3 Iniciando o Pharo

Para iniciar o Pharo, se você estiver usando o Pharo Launcher, selecione a imagem que você deseja usar e pressione launch. Ou se você estiver usando a versão autônoma, faça o que seu sistema operacional espera: arraste o arquivo .image para o ícone da máquina virtual, ou clique duas vezes no arquivo .image, ou na linha de comando digite o nome da máquina virtual seguido do caminho para o arquivo .image.

  • No OS X, clique duas vezes no pacote Pharo9.0.app no download descompactado.
  • No Linux, clique duas vezes (ou invoque a partir da linha de comando) o script pharo executável Bash da pasta Pharo descompactada.
  • No Windows, entre na pasta Pharo descompactada e clique duas vezes no arquivo Pharo.exe.

Em geral, o Pharo tenta "fazer a coisa certa". Se você clicar duas vezes no VM, ele procura por um arquivo de imagem no local padrão. Se você clicar duas vezes em um arquivo .image, ele tentará encontrar a VM mais próxima para lançá-lo.

Se você tiver várias VMs instaladas em sua máquina, o sistema operacional pode não ser mais capaz de adivinhar a VM certa. Neste caso, é mais seguro especificar exatamente quais delas você pretende lançar, seja arrastando e soltando o arquivo de imagem para a VM, ou especificando a imagem na linha de comando (veja a próxima seção).

1.4 Lançamento do Pharo através da Linha de Comando

O padrão geral para o lançamento do Pharo a partir de um terminal é:

<Pharo executable> <path to Pharo image>

Linha de comando do Linux.

Para o Linux, assumindo que você esteja na pasta descompactada do pharo9.0:

./pharo shared/Pharo9.0.image

Linha de comando do OS X.

Para o OS X, assumindo que você esteja no diretório onde o arquivo .zip foi descompactado como Pharo9.0.app:

Pharo9.0.app/Contents/MacOS/Pharo9.0.app/C…

Ao utilizar um Pharo bundle, você precisa clicar com o botão direito do mouse no Pharo9.0.app e selecionar Show Package Contents para ter acesso à imagem. Se você precisar disto freqüentemente, basta baixar um par de image/changes separado e soltar essa imagem no Pharo9.0.app.

Linha de comando do Windows.

Para Windows, assumindo que você esteja na pasta Pharo9.0 descompactada:

Pharo.exe Pharo9.0.image

1.5 Pharo Launcher

Pharo Launcher é uma ferramenta que ajuda você a baixar e gerenciar imagens do Pharo. É muito útil para obter novas versões do Pharo (assim como atualizações das versões existentes que contêm correções de bugs importantes). Ele também dá acesso a imagens pré-carregadas com bibliotecas específicas que tornam muito fácil o uso dessas ferramentas sem a necessidade de instalá-las e configurá-las manualmente.

PharoLauncher pode ser encontrado em pharo.org/download junto com as instruções de instalação e links para download, dependendo de sua plataforma.

Pasted image 20211020093719.png Figura 1-1 PharoLauncher - a maneira fácil de gerenciar suas imagens Pharo.

Após instalar o PharoLauncher e abri-lo (como você faria para qualquer imagem Pharo), você deve obter uma GUI semelhante à Figura 1-1. Aqui clicamos no canto superior esquerdo no ícone New para baixar uma nova imagem Pharo a partir do servidor.

Há uma coluna com a lista imagens que se encontram localmente em sua máquina (geralmente em uma pasta de sistema compartilhada). Você pode lançar qualquer imagem local diretamente (seja clicando duas vezes, ou selecionando-a e pressionando o botão Launch). Um menu de contexto com o botão direito do mouse fornece várias funções úteis como copiar e renomear suas imagens, assim como localizá-las no sistema de arquivos.

Você pode usar suas próprias imagens locais com o PharoLauncher, além de trabalhar com as imagens que você baixou. Para fazer isso, basta importar seus arquivos .image e seus arquivos .changes associados usando o Pharo Launcher.

1.6 O menu World

Pasted image 20211020101252.png Figura 1-2 Clicar em qualquer lugar no fundo da janela do Pharo ativa o Menu World.

Uma vez que o Pharo esteja executando, você deve ver uma única janela grande, possivelmente com algumas janelas de playgrounds abertas (ver Figura 1-2). Você pode notar uma barra de menu, mas o Pharo também faz uso de menus pop-up dependentes do contexto.

Clicando em qualquer lugar no fundo da janela do Pharo, será exibido o Menu World, que contém muitas das ferramentas, utilidades e configurações do Pharo.

Explore o Menu World Iremos discuti-las em mais detalhes nos próximos capítulos.

1.7 Interagindo com o Pharo

Pharo oferece três maneiras de interagir com o sistema usando um mouse ou outro dispositivo apontador.

click (ou clique com o botão esquerdo do mouse): este é o botão do mouse mais usado, e normalmente equivale a clicar com o botão esquerdo do mouse (ou clicar com um único botão do mouse sem nenhuma tecla modificadora). Por exemplo, clique sobre o fundo da janela do Pharo para abrir o menu World (Figura 1-2).

Pasted image 20211020101445.png Figura 1-3 Action Click (right click) traz o menu contextual.

action-click (or right-click): este é o próximo botão mais utilizado. Ele é usado para trazer à tona um menu contextual que oferece diferentes conjuntos de ações dependendo de para onde o mouse está apontando (veja Figura 1-3). Se você não tiver um mouse com vários botões, então normalmente você irá configurar a tecla modificadora de controle para action-click com o botão do mouse.

Pasted image 20211020101522.png Figura 1-4 Meta-Clicking em uma janela abre os Halos.

meta-click: Finalmente, você pode fazer um meta-click em qualquer objeto exibido na imagem para ativar o "halo mórfico", um conjunto de handles que são usadas para realizar operações nos próprios objetos na tela, como inspecioná-los ou redimensioná-los (ver Figura 1-4). Se você deixar o mouse sobre uma handle, um balão de ajuda explicará sua função. No Pharo, como você faz um meta-click depende de seu sistema operacional: ou você deve segurar Shift-Ctrl ou Shift-Alt (no Windows ou Linux) ou Shift-Option (no OS X) enquanto clica.

1.8 Enviando mensagens

Abra um playground a partir do menu Browse. A ferramenta Playground será aberta (você pode reconhecê-la como a ferramenta Workspace, das versões anteriores do Pharo). Podemos usar o Playground para executar rapidamente código do Pharo.

Pasted image 20211020101653.png Figura 1-5 A execução de uma expressão é simples com o item do menu Do it.

Digite a seguinte expressão ProfStef go de código no Playground, depois execute um Do it como mostrado na Figura 1-5.

Pasted image 20211020101724.png Figura 1-6 O ProfStef é um simples tutorial interativo para aprender sobre a sintaxe do Pharo.Interagindo com o Pharo

Esta expressão acionará o tutorial ProfStef (como mostrado na Figura 1-6). É um tutorial simples e interativo que lhe ensinará os princípios básicos do Pharo.

Parabéns, você acabou de enviar sua primeira mensagem! O Pharo se baseia no conceito de enviar mensagens aos objetos. Os objetos do Pharo são como seus soldados prontos para obedecer uma vez que você lhes envie uma mensagem que eles possam entender. Veremos como um objeto pode entender uma mensagem, mais tarde.

Sobre o vocabulário

Se você falar com Pharoers por um tempo, você notará que eles geralmente não usam expressões como chamar uma operação ou invocar um método, como os desenvolvedores fazem em outras linguagens de programação. Ao invés disso, eles dirão para enviar uma mensagem. Isto reelabora a idéia de que os objetos são responsáveis por suas próprias ações e que o método associado à mensagem é procurado dinamicamente. Ao enviar uma mensagem para um objeto, o objeto, e não o remetente, seleciona o método apropriado para responder à sua mensagem. Na maioria dos casos, o método com o mesmo nome que a mensagem é executado.

Como usuário, você não precisa entender como cada mensagem funciona, a única coisa que você precisa saber é quais são as mensagens disponíveis para os objetos que lhe interessam. Desta forma, um objeto pode esconder sua complexidade, e a codificação pode ser mantida o mais simples possível sem perder flexibilidade.

Como encontrar as mensagens disponíveis para cada objeto é algo que iremos explorar mais adiante.

1.9 Salvando, fechando e reiniciando uma sessão do Pharo

Você pode sair do Pharo em qualquer ponto, fechando a janela do Pharo como faz em qualquer outra janela de aplicação. Além disso, você pode utilizar a barra de menu ou o menu World e selecionar Save and quit ou Quit.

Em qualquer caso, o Pharo exibirá um prompt para lhe perguntar sobre como salvar sua imagem. Se você salvar sua imagem e reabri-la, você verá que as coisas estão exatamente como você as deixou. Isto acontece porque o arquivo de imagem armazena todos os objetos (texto editado, posições de janela, métodos adicionados... claro, porque todos eles são objetos) que o Pharo carregou em sua memória de forma que nada se perca quando você fechar o Pharo.

Quando você inicia o Pharo pela primeira vez, a máquina virtual Pharo carrega o arquivo de imagem que você especificou. Este arquivo contém um instantâneo de um grande número de objetos, incluindo uma grande quantidade de código pré-existente e ferramentas de programação (todos os quais são objetos).Ao trabalhar com Pharo, você enviará mensagens a esses objetos, criará novos objetos, e alguns desses objetos morrerão e sua memória será recuperada (coleta de lixo).

Quando você fecha o Pharo, normalmente você guarda uma snapshot que contém todos os seus objetos. Se você salvar normalmente, você sobregravará seu arquivo de imagem antigo com o novo snapshot. Alternativamente, você pode salvar a imagem com um novo nome.

Como mencionado anteriormente, além do arquivo .image, há também um arquivo .changes. Este arquivo contém um registro de todas as mudanças no código fonte que você fez usando as ferramentas padrão. Na maioria das vezes você não precisa se preocupar com este arquivo de forma alguma. Como veremos, porém, o arquivo .changes pode ser muito útil para recuperar de erros, ou reproduzir novamente as alterações perdidas. Mais sobre isto mais tarde!

Pode parecer que a imagem é o mecanismo chave para armazenar e gerenciar projetos de software, mas não é esse o caso. Como veremos em breve, existem ferramentas muito melhores para o gerenciamento de código e compartilhamento de software desenvolvido por equipes. As imagens são muito úteis, mas você deve aprender a ficar de sobreaviso sobre a criação e no lançamento de imagens, já que as ferramentas de criação de versões Iceberg oferecem formas muito melhores de gerenciar versões e compartilhar código entre os desenvolvedores. Além disso, se você precisar persistir com objetos, você pode usar vários sistemas como Fuel (um objeto rápido binário serializador), STON (um objeto textual serializador) ou um banco de dados.

1.10 Playgrounds e Transcripts

Pasted image 20211020104850.png Figura 1-7 Executando uma expressão: exibindo uma string no Transcript.

Vamos começar com alguns exercícios:

  1. Fechar todas as janelas abertas dentro do Pharo.
  2. Olhe no menu e abra um Transcript e um Playground.
  3. Posicione e redimensione as janelas do Transcript e do Playground para que o Playground apenas se sobreponha ao Transcript (veja Figura 1-7).

Você pode redimensionar as janelas arrastando um dos cantos. A qualquer momento apenas uma janela está ativa; ela está na frente e tem sua borda destacada.

Sobre a Transcript.

O Transcript é um objeto que é freqüentemente usado para registrar mensagens do sistema. É uma espécie de console do sistema.

Sobre o Playground.

Os playgrounds são úteis para digitar trechos de código que você gostaria de experimentar. Você também pode usar playgrounds simplesmente para digitar qualquer texto que você gostaria de lembrar, como listas de afazeres ou instruções para quem quer que use sua imagem.

Digite o seguinte texto no playground:

Transcript show: 'hello world'; cr.

Tente double-clicking em vários pontos do texto que você acabou de digitar. Observe como uma palavra inteira, toda a cadeia ou todo o texto é selecionado, dependendo se você clica dentro de uma palavra, no final da cadeia, ou no final da expressão inteira.Em particular, se você colocar o cursor antes do primeiro caractere ou depois do último caractere e fizer double-click, você seleciona o parágrafo completo.

Selecione o texto que você digitou, clique com o botão direito do mouse e selecione Do it. Observe como o texto ”hello world” aparece na janela de transcrição (Veja Figura 1-7). Faça Do it novamente.

1.11 Atalhos de teclado

Se você quiser avaliar uma expressão, nem sempre é preciso clicar com o botão direito do mouse. Ao invés disso, você pode usar os atalhos de teclado mostrados nos itens do menu. Mesmo que o Pharo possa parecer um ambiente movido pelo mouse, ele contém mais de 200 atalhos que permitem operar uma variedade de ferramentas, bem como a facilidade de atribuir um atalho de teclado a qualquer um dos 110 000 métodos contidos na imagem do Pharo.

Dependendo de sua plataforma, você pode ter que pressionar um dos modificadores
chaves que são Control, Alt e Command. Usaremos CMD no resto do livro: assim, cada vez que você vir algo como CMD-d, basta substituí-lo pela chave modificadora apropriada, dependendo do seu sistema operacional. A chave modificadora correspondente no Windows é CTRL, e no Linux é ALT ou CTRL, então cada vez que você vir algo como CMD-d, basta substituí-la, dependendo do seu sistema operacional, pela chave modificadora apropriada.

Além de Do it, você deve ter notado Do it and go, Print it, Inspect it e várias outras opções no menu de contexto. Vamos dar uma rápida olhada em cada uma delas.

1.12 Doing vs. Printing

Digite a expressão 3 + 4 no playground. Agora Do it com o atalho do teclado.

Não se surpreenda se você não viu nada acontecer! O que você acabou de fazer foi enviar a mensagem + com o argumento 4 para o número 3. Normalmente o 7 resultante teria sido computado e devolvido a você, mas como o playground não sabia o que fazer com esta resposta, simplesmente não mostrou a resposta. Se você quiser "ver" o resultado, você deve usar Print it em vez de Do it. Print it realmente compila a expressão, executa-a, envia a mensagem printString para o resultado e exibe a string resultante.

Selecione 3+4 e Print it (CMD-p). Desta vez, vemos o resultado esperado.

3+4 >>> 7

Utilizamos a notação >>> como uma convenção neste livro para indicar que uma expressão Pharo em particular produz um determinado resultado quando você usa Print it.

N.T.: >>> também é uma mensagem que retorna uma Association. Mas para usá-la é preciso colocar parênteses como em (3+4) >>> 7.

1.13 Inspect

Pasted image 20211020110032.png Figura 1-8 Inspeção de um número simples utilizando o Inspect.

Selecione ou posicione/ o cursor na linha de 3+4, e desta vez Inspect it (CMD-i).

Agora você deve ver uma nova janela intitulada Inspector on 7, como mostrado na Figura 1-8. O inspetor é uma ferramenta extremamente útil que lhe permite navegar e interagir com qualquer objeto no sistema. O título nos diz que 7 é uma instância da classe SmallInteger. O painel superior nos permite navegar pelas variáveis de instância de um objeto e seus valores. O painel inferior pode ser utilizado para escrever expressões para enviar mensagens para o objeto. Digite self squared no painel inferior do inspetor, e Print it.

Pasted image 20211020113335.png Figura 1-9 Inspeção de um Morph usando Inspect.

O inspetor apresenta abas específicas que mostrarão diferentes informações e visões sobre o objeto, dependendo do tipo de objeto que você está inspecionando. Inspecione Morph new openInWorld e você deve obter uma situação semelhante à da Figura 1-9.

1.14 Outras operações

Outras opções obtidas com de right-click que podem ser utilizadas são as seguintes:

  • Do it and go, além disso, abre um inspetor navegável na lateral do playground. Ele nos permite navegar na estrutura do objeto.Tente com a expressão anterior Morph new openInWorld e navegue na estrutura.
  • Basic Inspect it abre o inspetor clássico que oferece uma GUI mais mínima e atualizações ao vivo das mudanças no objeto.
  • Debug it abre o debugger no código.
  • Profile it mostra o código com a ferramenta de profile do Pharo que mostra quanto tempo é gasto para cada mensagem enviada.
  • Code search oferece várias opções fornecidas pelo System Browser, tais como navegar pelo código fonte de uma expressão, procurar por senders e implementors, e assim por diante.

O inspetor apresenta abas específicas que mostrarão diferentes informações e visões sobre o objeto, dependendo do tipo de objeto que você está inspecionando. Inspecione Morph new openInWorld e você deve obter uma situação semelhante à da Figura 1-9.

1.15 Calypso: O System Browser

O System Browser, também conhecido como ClassBrowser, é uma das principais ferramentas utilizadas para a programação. Como veremos, há vários navegadores interessantes disponíveis para Pharo, mas este é o básico que você encontrará em qualquer imagem. A implementação atual do System Browser é chamada de Calypso. A versão anterior do System Browser chamava-se Nautilus.

Abertura do System Browser em um determinado método

Esta não é a maneira usual de abrir um navegador sobre um método: usamos ferramentas mais avançadas! Mas, para este exercício, execute o seguinte trecho de código:

ClyFullBrowser openOnMethod: Integer>>#slowFactorial

Pasted image 20211020114320.png Figura 1-10 O System Browser mostrando o método slowFactorial da classe Integer.

Ele abrirá um system browser sobre o método "slowFactorial". Devemos obter um System Browser como na Figura 1-10. A barra de título indica que estamos navegando na classe 'Integer' e em seu método slowFactorial. A Figura 1-10 mostra as diferentes entidades exibidas pelo browser: packages, classes, protocols, methods e method definition.

No Pharo, o System Browser padrão é o 'Calypso'. Entretanto, é possível ter outros System Browsers instalados no ambiente Pharo. Cada System Browserpode ter sua própria GUI que pode ser muito diferente da GUI do Calypso. De agora em diante, utilizaremos os termos Browser, System Browser e Calypso de maneira intercambiável.

1.16 Navegando usando o Calypso (o System Browser)

O Pharo tem o Spotter (veja abaixo) para encontrar informações rápidas. Agora queremos apenas mostrar-lhe o fluxo de trabalho no System Browser. Normalmente, com o Spotter, vamos diretamente à classe ou ao método.

Pasted image 20211020120704.png Figura 1-11 O System Browser mostrando o método 'printString' da classe 'Object'.

Vamos tomar o caminho mais lento para encontrar o método printString definido na classe Objeto. Ao final da navegação, veremos a situação descrita na Figura 1-11.

  • Abra o browser. Quando uma nova janela do System Browser se abre pela primeira vez, todas as janelas, exceto a mais à esquerda, estão vazias. Este primeiro painel lista todos os pacotes conhecidos, que contêm grupos de classes relacionadas.

  • Filtre os pacotes. Digite parte do nome do pacote no filtro mais à esquerda. Ele filtra a lista de pacotes a serem mostrados na lista acima dele. Digite Kern, por exemplo.

  • Expandir o pacote do Kernel e selecionar o elemento Objeto. Quando selecionamos um pacote, ele faz com que o segundo painel mostre uma lista de todas as classes do pacote selecionado. Você deve ver a hierarquia de ProtoObject.

  • Selecione a classe Object. Quando uma classe é selecionada, os dois painéis restantes serão preenchidos. O terceiro painel exibe os protocolos da classe atualmente selecionada. Estes são agrupamentos convenientes de métodos relacionados. Se nenhum protocolo for selecionado, você deverá ver todos os métodos no quarto painel.

  • Selecione o protocolo de printing. Você pode ter que rolar para baixo para encontrá-lo. Você também pode clicar no terceiro painel e digitar pr, para encontrar o protocolo printing. Agora selecione-o, e você verá no quarto painel apenas os métodos relacionados à printing.

  • Selecione o método printString. Agora, vemos no painel inferior o código fonte do método printString, compartilhado por todos os objetos do sistema (exceto aqueles que fazem override do mesmo, reimplementando-o).

    Há uma maneira muito melhor de encontrar um método, por exemplo, basta digitá-lo em um Playground e selecionar a palavra e utilizar Implementors of it no item de menu Code search.

1.17 Encontrando classes

Há várias maneiras de encontrar uma classe no Pharo. A primeira, como acabamos de ver acima, é saber (ou adivinhar) em que pacote ela está, e navegar até ela usando o navegador.

Uma segunda maneira é enviar a mensagem browse para uma instância ou para a própria classe, pedindo-lhe para abrir um navegador sobre si mesma. Suponha que queiramos navegar pela classe Point.

  • Utilizando a mensagem browse*. Digite Point browse em um playground e Do it. Um navegador será aberto na classe Point. Você pode fazer o mesmo com 10@20 (uma instância da classe Point).

  • Usando CMD-b para navegar. Há também um atalho de teclado CMD-b (browse) que você pode utilizar em qualquer painel de texto; selecione a palavra e pressione CMD-b. Utilize este atalho de teclado para navegar na classe Point.

Observe que quando a classe Point é selecionada mas nenhum protocolo ou método é selecionado, em vez do código fonte de um método, vemos uma definição de classe. Isto nada mais é do que uma mensagem comum que é enviada para a classe pai, pedindo-lhe para criar uma subclasse. Se você clicar no botão Comments na parte inferior do painel de uma classe, você pode ver o comentário da classe em um painel dedicado.

Além disso, o sistema suporta os seguintes atalhos do mouse

  • CMD-Click em uma palavra: abre a definição de uma classe quando a palavra é um nome de classe. Você também obtem os implementors da mensagem quando clica em um seletor que está no corpo de um método.

  • CMD-Shift-Click em uma palavra: abre um navegador de lista com todos as referências à classe quando a palavra for um nome de classe. Você também recebe os senders da mensagem quando clica em um seletor que está no corpo de um método.

1.18 Usando o Spotter

Pasted image 20211020130207.png Figura 1-12 Utilizando Spotter (shift+enter) para navegar na classe Point.

A maneira mais rápida (e provavelmente a mais interessante) de encontrar uma classe é utilizar o Spotter. Pressionar Shift+Enter abre Spotter, uma ferramenta muito poderosa para encontrar classes, métodos, e muitas outras ações relacionadas. A Figura 1-12 mostra que procuramos por Point.

O Spotter oferece várias possibilidades, como mostrado na Figura 1-12. Você pode especificar para Spotter o tipo de categorias em que está interessado. Por exemplo, utilizando #classe seguido da palavra que você procura, indica que você está interessado em classes. Este é o padrão para que você não precise digitar #class.

Pasted image 20211020131853.png Figura 1-13 Procura de implementors que correspondam a printString.

A Figura 1-13 mostra como podemos pedir ao Spotter para mostrar todos os implementors de uma determinada mensagem. Não temos que digitar o nome completo da categoria. Outras categorias são menu, packages, method (#implementor), examples (#example), pragma (#pragma), senders (#sender), class references (#reference) mas também playground code snippets (usando #playground). Você só precisa digitar o início da categoria para identificá-la, ou seja, #ref Point dará toda a referência à classe Point.

O Spotter pode ser utilizado até mesmo para navegar pelo sistema de arquivos do sistema operacional, e tem uma categoria history onde as buscas anteriores são armazenadas para voltar rapidamente às buscas mais freqüentes.

Navegando nos resultados. Além disso, podemos utilizar o Spotter para navegar nos nossos resultados de busca de forma semelhante à forma como utilizamos o System Browser. O Spotter categoriza seus resultados de busca: por exemplo, as classes estão na categoria Classes, métodos na categoria Implementor, tópicos de ajuda na categoria Help Topics, etc.

1.19 Usando ’Find class’ no System Browser

No System Browser você também pode pesquisar uma classe através de seu nome. Por exemplo, suponha que você esteja procurando por alguma classe desconhecida que represente datas e horários.

No System Browser, clique em qualquer lugar do painel de pacotes ou do painel de classes, e abra a janela Class Search digitando CMD-f, ou selecionando Find class no menu de contexto. Digite time na caixa de diálogo e clique em OK (ou pressione Enter).

É exibida uma lista de classes, cujos nomes contêm a substring "time". Escolha uma (digamos, Time), e o navegador irá mostrá-la. Se você quiser navegar por uma das outras, selecione seu nome (em qualquer painel de texto) e digite CMD-b, ou você pode escolher Browse a partir do menu de contexto.

1.20 Encontrando Métodos

Às vezes é possível adivinhar o nome de um método, ou pelo menos parte do nome de um método, mais facilmente do que o nome de uma classe. Por exemplo, se você estiver interessado na hora atual, você pode esperar que exista um método chamado now, ou contendo now como substring. Mas onde poderia encontrá-lo? O Spotter e o Finder podem ajudá-lo.

Com o Spotter.

Com o Spotter você também pode encontrar métodos. Seja obtendo uma classe e navegando ou utilizando a categoria #implementor seguida do nome do método.

Ele exibirá todos os métodos que são implementados e têm o mesmo nome. Por exemplo, você obterá todo o método começando com now.

Com o Finder.

Pasted image 20211020133933.png Figura 1-14 O Finder mostra todas as classes que definem um método chamado now.

Abra o Finder usando o menu Browse. Digite now na caixa de busca superior esquerda, clique em Search (ou simplesmente pressione a tecla Enter). Você deve ver uma lista de resultados semelhante ao da Figura 1-14.

O Finder exibirá uma lista de todos os nomes dos métodos que contêm a substring now. Para rolar até o now, mova o cursor até a lista e digite n; este truque que funciona em todas as janelas de rolagem. Expandindo o item now mostra as classes que implementam um método com este nome. Selecionando qualquer uma delas, será exibido o código fonte para a implementação no painel de código na parte inferior. Também é possível buscar a correspondência exata, digitando "now” (com aspas) na barra de busca superior esquerda, usando aspas você obterá apenas a correspondência exata.

1.21 Encontrar métodos usando exemplos

Utilizando o Finder você pode procurar classes ou métodos baseados em seus nomes, como mencionado acima. Você também pode procurar por uma string dentro do corpo completo do método, inclusive comentários.

Mas o Finder oferece uma facilidade única e poderosa. Em outros momentos, você pode ter uma boa idéia da existência de um método, mas não terá idéia de qual seria seu nome. O Finder ainda pode ajudar! Por exemplo, suponha que você gostaria de encontrar um método que transforma um string em maiúsculas (por exemplo, transformando 'eureka' em 'EUREKA'). Podemos dar as entradas e os resultados esperados de um método e o 'Finder' tentará encontrá-lo para você.

O Finder tem uma funcionalidade realmente poderosa: você pode dar o receptor, os argumentos e o resultado esperado e o localizador tentará encontrar a mensagem correspondente.

1.22 Finder em ação

No Finder, selecione o modo Examples usando a segunda combo-box (aquela que mostra os seletores por padrão).

Digite 'eureka' . EUREKA" na caixa de busca e pressione a tecla Enter (não esqueça as aspas simples).

Pasted image 20211020134813.png Figura 1-15 Procurando um método que, dada a string 'eureka', retorna a string 'EUREKA'.

O Finder irá então sugerir um método que faz o que você estava procurando, assim como exibir uma lista de classes que implementam métodos com o mesmo nome. Neste caso, determinou que o método asUppercase é aquele que realizou a operação que se encaixa no seu exemplo, como mostrado na Figura 1-15.

Clique na expressão 'eureka' asUppercase --> 'EUREKA', para mostrar a lista de classes que implementam esse método.

Um asterisco no início de uma linha na lista de classes indica que este método é aquele que foi realmente utilizado para obter o resultado solicitado. Assim, o asterisco na frente do 'String' nos permite saber que o método asUppercase definido na classe 'String' foi executado e retornou o resultado que queríamos. As classes que não têm um asterisco são apenas outros implementadores de asUppercase, que compartilham o nome do método, mas não foram utilizados para retornar o resultado desejado. Portanto, o método Character>>asUppercase não foi executado em nosso exemplo, porque 'eureka' não é uma instância de Character (mas é uma 'String').

Você também pode utilizar o Finder para pesquisar métodos por argumentos e resultados. Por exemplo, se você estiver procurando um método que encontrará o maior fator comum de dois inteiros, você pode tentar 25 . 35 . 5 como um exemplo. Você também pode dar ao buscador de métodos múltiplos exemplos para reduzir o espaço de busca; o texto de ajuda no painel inferior explica como.

N.T.: Se estiver curioso sobre como o Finder encontra métodos através de exemplos leia o post How does find by example work in the Pharo Finder (está em português).

1.23 Definição de um novo método

O advento do Test Driven Development (TDD) mudou a maneira como escrevemos o código. A idéia por trás do TDD é que escrevemos um teste que define o comportamento desejado de nosso código antes de escrevermos o próprio código. Somente então escrevemos o código que satisfaz o teste.

Suponha que nossa tarefa seja escrever um método que "diga algo em voz alta e com ênfase". O que isso poderia significar exatamente? O que seria um bom nome para tal método? Como podemos garantir que os programadores que possam ter que manter nosso método no futuro tenham uma descrição inequívoca do que ele deve fazer? Podemos responder a todas estas perguntas dando um exemplo.

Nosso objetivo é definir um novo método com o nome "String" na classe "String". A idéia é que esta mensagem deve transformar uma string em sua versão em maiúsculas, como mostrado no exemplo abaixo:

'No panic' shout >>> 'NO PANIC!'

Entretanto, antes de criar o próprio método shout, devemos primeiro criar um método de teste! Na seção seguinte, usamos o exemplo "No Panic" para criar nosso método de teste.

1.24 Definição de um novo método de teste

Como criar um novo método no Pharo? Primeiro, temos que decidir a que classe o método deve pertencer. Neste caso, o método shout que estamos testando irá na classe String, então o teste correspondente irá, por convenção, em uma classe chamada StringTest.

Primeiro, abra um navegador na classe StringTest, e selecione um protocolo apropriado para nosso método, neste caso tests - converting. O texto destacado no painel inferior é um modelo que lembra o aspecto de um método Pharo. Apague este código de modelo (lembre-se, você pode clicar no início ou no final do texto, ou pressionar CMD-a(para Select All), e começar a digitar seu método. Podemos transformar nosso exemplo de código "No Panic" no próprio método de teste:

testShout  
    self assert: ('No panic' shout = 'NO PANIC!')

Pasted image 20211020151820.png Figura 1-16 Definição de um método de teste na classe StringTest.

Uma vez digitado o texto no browser, observe que o canto superior direito é laranja. Isto é um lembrete de que o painel contém mudanças não salvas. Portanto, selecione Aceitar (s) clicando com o botão direito do mouse no painel inferior, ou apenas digite CMD-s, para compilar e salvar seu método. Você deve ver uma situação semelhante àquela descrita na Figura 1-16.

Se esta é a primeira vez que você aceita qualquer código em sua imagem, provavelmente você será solicitado a digitar seu nome. Já que muitas pessoas contribuíram com código para a imagem, é importante manter o controle de todos que criam ou modificam os métodos. Basta digitar seu primeiro e último nome, sem nenhum espaço.

Como ainda não há nenhum método chamado "shout", o verificador automático de código (Assitance Quality Assitance) informará que a mensagem shout é enviada mas não implementada, você a verá no painel inferior do navegador e na mesma linha em que você escreveu o código. Isto pode ser bastante útil se você simplesmente cometeu um erro de digitação, mas neste caso, realmente queremos dizer shout, já que este é o método que estamos prestes a criar. Confirmamos isto selecionando a primeira opção do menu.

1.25 Executando seu método de teste

Execute seu teste recém-criado: abra o Test Runner a partir do Menu World (ou pressione no ícone do círculo em frente ao nome do método que é mais rápido e mais interessante).

No Test Runner, os dois painéis mais à esquerda são um pouco como os painéis superiores do System Browser. O painel esquerdo contém uma lista de pacotes, mas é restrito aos pacotes que contêm classes de teste.

Selecione o pacote CollectionsTests-Strings, e o painel à direita mostrará todas as classes de teste nele, que inclui a classe StringTest. Os nomes das classes já estão selecionados, portanto clique em Run Selected para executar todos esses testes.

Pasted image 20211020155132.png Figura 1-17 Olhando para o erro no debugger.

Você deve ver o painel superior direito ficar vermelho, o que indica que houve um erro na execução dos testes. A lista de testes que deram origem a erros é mostrada no painel inferior direito. Como você pode ver, o método StringTest>>testShout é o culpado. (Note que StringTest>>testShout é a forma Pharo de identificar o método testShout da classe StringTest). Se você clicar nesse método no painel inferior direito, o teste errôneo será executado novamente, desta vez de tal forma que você verá o erro acontecer: Instance of ByteString did not understand #shout ( veja Figura1-17).

A janela que se abre com a mensagem de erro é a do debugger do Pharo. Vamos analisar o depurador e como utilizá-lo oportunamente.

1.26 Implementando o método de teste

O erro é, naturalmente, exatamente o que esperávamos: executar o teste gera um erro porque ainda não escrevemos um método que diga como responder a mensagem shout. No entanto, é uma boa prática certificar-se de que o teste falhe porque isto confirma que montamos a máquina de teste corretamente e que o novo teste está realmente sendo executado. Uma vez que você tenha visto o erro, você pode abandonar (Abandon) o teste em execução, o que fechará a janela de depuração.

Codificando no debugger

Pasted image 20211020160425.png Figura 1-18 Ao pressionar o botão Create no debugger, você é solicitado a selecionar em qual classe criar o novo método.

Pasted image 20211020160749.png Figura 1-19 O método shout criado automaticamente à espera de uma definição concreta.

Em vez de pressionar Abandon, você pode definir o método que falta usando o botão Create diretamente no depurador. Isto o levará a selecionar uma classe na qual definir o novo método (ver Figura 1-18), depois o levará a selecionar um protocolo para este método e, finalmente, a uma janela do editor de código no debugger, na qual você pode editar o código para este novo método. Note que como o sistema não pode implementar o método para você, ele cria um método genérico que é marcado como a ser implementado (veja Figura 1-19).

Pasted image 20211020161222.png Figura 1-20 Definindo o método shout no debugger.

Agora vamos definir o método que fará o teste ser bem sucedido! Diretamente no debugger edite o método shout com esta definição (como mostrado na Figura 1-20):

shout  
    ^ self asUppercase,'!'

A vírgula (,) é a operação de concatenação de strings, então o corpo deste método acrescenta um ponto de exclamação a uma versão em caixa alta de qualquer objeto String para o qual a mensagem shout foi enviada. O ^ diz ao Pharo que a expressão que se segue é a resposta a ser devolvida pelo método, neste caso a nova string concatenada.

Quando tiver terminado de implementar o método, não se esqueça de compilá-lo usando CMD-s e você pode pressionar Proceed e continuar com os testes. Observe que o Proceed simplesmente continua a executar o conjunto de testes, e não executa novamente o método que falhou.

Será que este método vai funcionar?

Vamos fazer os testes e ver. Clique em Run Selected novamente no TestRunner, e desta vez você deve ver uma barra verde e um texto indicando que todos os testes são executados sem falhas e sem erros. Quando você chegar a uma barra verde, é uma boa idéia salvar seu trabalho salvando a imagem (World Menu > Pharo > Save), e fazer uma pausa. Então, faça isso agora mesmo!

1.27 Resumo

Este capítulo o apresentou ao ambiente Pharo e lhe mostrou como usar algumas das principais ferramentas, como o System Browser, o Spotter, o Finder, o Debugger, e o Test Runner. Você também já viu um pouco da sintaxe do Pharo, mesmo que ainda não tenha entendido completamente.

  • Um sistema Pharo em funcionamento consiste de uma virtual machine, arquivos . sources, e . image e . changes. Apenas estes dois últimos mudam, pois registram um snapshot do sistema em execução.
  • Quando você abre uma imagem do Pharo, você a encontrará exatamente no mesmo estado (isto é, com exatamente os mesmos objetos em execução) que você tinha quando salvou aquela imagem pela última vez.
  • Você pode clicar sobre o fundo Pharo para trazer o World Menu e lançar várias ferramentas.
  • O Playground é uma ferramenta para escrever e avaliar trechos de código. Você também pode usá-lo para armazenar textos arbitrários.
  • Você pode usar atalhos de teclado em texto no playground, ou qualquer outra ferramenta, para avaliar o código. As mais importantes delas são Do it (CMD-d), Print it (CMD-p), Inspect it (CMD-i), e Browse it (CMD- b).
  • O System Browser é a principal ferramenta para navegar no código Pharo e para desenvolver um novo código.
  • O Test Runner é uma ferramenta para executar testes unitários, e ajuda no Test Driven Development.
  • O Debugger permite examinar erros e exceções (tais como erros ou falhas encontradas ao executar testes). Você pode até mesmo criar novos métodos diretamente no depurador.