Métodos e Expressões

Na Programação Orientada a Objetos toda computação é ativada pelo envio de mensagens aos objetos. Em resposta a esta mensagem  o objeto executa uma ação correspondente. Esta ação é descrita por meio de um método específico que realiza esta computação.

Em Smalltalk um método é descrito por uma sequência de expressões separadas entre si por um ponto.

expressão-1.
expressão-2.
:
expressão-n.

Cada expressão retorna sempre um único objeto como resultado. Expressões dentro de métodos podem ser precedidas opcionalmente pelo caractere ^ (caret). A execução do método termina quando uma expressão precedida do caret (^) é executada, ou após a execução da última expressão da sequência. Note que não existe em Smalltalk a noção de comando diferenciada da noção de expressão.

Como será visto adiante, um método é sempre ativado pela execução de uma expressão de mensagem, que consiste do envio de uma mensagem a um determinado objeto, que é chamado de receptor da mensagem. Essa expressão se reduzirá ao valor retornado pelo método após ele terminar sua execução. O valor que um método retorna será o valor da última expressão executada, caso esta seja precedida do caret. Caso a última expressão executada no método não seja precedida do caret, então o método retornará uma referência ao receptor.

Uma expressão em Smalltalk assume a forma:

<receptor> <seletor-da-mensagem>

onde <receptor> denota o objeto para o qual a mensagem identificada pelo <seletor-da-mensagem> é enviada.

Existem 3 tipos básicos de mensagens em Smalltalk, a saber, unárias, binárias e mensagens com palavras-chave.



Regra de Precedência

Mensagens podem ser encadeadas resultando em expressão mais complexas. Nesta situação, o objeto resultante da avaliação de uma mensagem é simultaneamente o receptor ou argumento de outra mensagem. Considere a expressão que se segue:

'abc' size factorial.

Nesta expressão, o receptor é o String 'abc' para o qual é enviada a mensagem unária size, resultando no objeto 3. Para este objeto é então enviada a mensagem factorial, resultando no objeto 6, que é o resultado final da avaliação da expressão acima.

Já no exemplo:

5 factorial + 'abc' size

há mensagens de categorias diferentes (unárias e binárias). Para casos como este, a avaliação dos seletores é feita na ordem indicada abaixo:

  1. Mensagens unárias: têm precedência sobre todas as demais
  2. Mensagens binárias: têm precedência sobre mensagens com palavras-chave.
  3. Mensagens com palavras-chave: têm a menor prioridade; são avaliadas por último

são avaliadas da esquerda para a direita. Todos os seletores binários tem a mesma precedência, (ao contrário das linguagens convencionais, onde multiplicação e divisão tem precedência sobre soma e subtração).

No exemplo acima, ambas as mensagens são unárias. Como ambas são da mesma categoria de mensagens, a avaliação é feita da esquerda para a direita: primeiro a mensagem size e em seguida a mensagem factorial.


Exemplo 1: r1 s1: a s2: b s3: c é interpretada como uma mensagem ao objeto r1 com seletor s1:s2:s3: e argumentos a, b e c.

Exemplo 2: r1 s1: (a s2: b s3: c) é interpretada como uma mensagem a r1 com seletor s1: e com argumento igual ao objeto resultante da mensagem ao objeto a com seletor s2:s3: e argumentos b e c.

Exemplo 3: (r1 s1: a) s2: b s3: c é interpretada como uma mensagem ao objeto resultante da mensagem r1 s1: a, com seletor s2:s3: e argumentos b e c.

Todos os seletores unários tem a mesma precedência. Exemplo:
15 + list size é equivalente a 15 + (list size)


Como ilustração, seja a expressão abaixo:
list size + 5 * 10 - 50 max: limite sqrt

onde list é um Array de 3 elementos, e limite tem o valor 100. Arrays respondem à mensagem unária size com seu tamanho. Números respondem à mensagem max: umNumero com o maior entre os valores do receptor e do argumento. Números também respondem à mensagem unária sqrt com a raiz quadrada de si mesmos.

De acordo com as regras de avaliação, a expressão acima é equivalente à seguinte expressão com parênteses:

((((list size) + 5) * 10) - 50) max: (limite sqrt)

A expressão acima será reduzida de acordo com os passos seguintes:



Considere agora a expressão que se segue:

4 factorial between: 3 + 4 and: 'alo mamãe' size * 7

Quando de sua avaliação inicialmente são resolvidas as expressões que envolvam mensagens unárias (em vermelho), resultando em:

24 between: 3 + 4 and: 9 * 7

A seguir são resolvidas as mensagens binárias (em azul), resultando em:

24 between: 7 and: 63

Por último são resolvidas as mensagens do tipo palavra-chave, neste caso retornando true já que 24 está entre 7 e 63.

Parênteses podem ser usados para alterar a ordem de avaliação: