Rodrigo Kumpera Weblog

Meus achados sobre tecnologia

Sobre Ponteros e Pattern Matching

June 10th, 2007 · 8 Comments

Existem alguns conceitos na computação que a partir do momento que são compreendidos se mostram triviais, ao ponto que ser difícil justificar a dificuldade de aprender. Dentre eles tenho ponteiros e pattern matching como dois bons exemplos. Foram, de longe, as duas coisas mais difíceis que aprendi, apesar de hoje considerá-las simples, beirando o trivial. O problema está mesmo em desenvolver o raciocínio associado a ambos.

Ponteiros exigem que a pessoa desenvolva a disciplina mais complicada a um programador, que entender e explorar indireção. Todo problema difícil pode ser resolvido facilmente quando adicionamos um nível extra de indireção, está é uma das máximas da nossa área, que é importante para todo profissional. O complicado é conseguir ver uma pessoa assimilando a idéia de comportamento indireto, ainda mais por ser algo sem exemplos na natureza.

Quando falamos de pattern matching, o segredo por trás é a decomposição estrutural, pela qual os casamentos são realizados. Erlang e Scala são exemplos de linguagens que suportam esse recurso. Sua principal utilidade está em expressar uma série de condicionais de maneira muito mais simples e clara que usando operadores tradicionais. O porém fica pelo fato de sua operação ser muito mais interessante quando usamos tipos algébricos (assunto para outro artigo) que para objetos, então não é nada simples integrar com um linguagem OO.

A utilidade em aprender ambos vai além de saber como usá-las, está em entender o fundamento por traz de cada um pois muitos dos grandes avanços da programação estão enraizados neles – reparem como a maioria do catalogo do GoF trata apenas do uso de indireção adicional.

Tags: Programming · erlang · java

8 responses so far ↓

  • 1 Luca Bastos // Jun 10, 2007 at 9:27 pm

    Ponteiros e Pattern matching não são difíceis de usar mas eles podem dificultar bem a leitura do código até que a gente se acostume com eles.
    .
    Pattern matching assusta um pouco mas nem tanto para quem se acostumou a usar o printf do C, que no fundo faz parecido. O problema é acostumar a cabeça com o fato de que o sinal de igual (=) NÃO significa atribuição de valor e sim Pattern matching na hora de ler o código.
    .
    Para quem nunca viu nenhum exemplo de Pattern matching, aí vai um trechinho de programa (para simplificar, por ora entendam tupla como um “vetor”):
    .
    % Point vai conter a tupla {point, 10, 45}
    Point = {point, 10, 45}.
    %
    % Coloca os valores 10 e 45 em X e Y
    {point, X, Y} = Point.
    .
    Os valores são extraídos de Point e o sinal de igual(=) faz o Pattern matching.

  • 2 kumpera // Jun 10, 2007 at 10:37 pm

    Luca, atribuição com desestruturante é uma das principais utilidades de pattern matching, inclusive é uma forma de ter o equivalente a checked exceptions, porém de maneira muito menos intrusiva.
    .
    Erlang utiliza o idioma de que toda função deve retornar a tupla {ok, _} no caso de sucesso, onde _ é o resultado efetivo. Quando a função falha com { error, Reason }, irá causar uma falha de matching e uma exception.

  • 3 Luiz C. F. dos Santos // Jun 11, 2007 at 1:17 pm

    Não conhecia “pattern matching”, onde posso ler mais sobre isso?

  • 4 kumpera // Jun 11, 2007 at 8:29 pm

    Luiz, o verbete da wikipedia é uma boa leitura por onde começar, especialmente os links externos.
    .
    Fora isso recomendo ler o Scala By Example, possui uma ótima introdução sobre o assunto. O manual introdutorio do Erlang também discorre muito bem sobre o assunto, vale conferir também.

  • 5 Luiz C. F. dos Santos // Jun 12, 2007 at 10:25 am

    OK, o wiki eu já li… básico :-) Os duas outras referências vou ler. Obrigado!

  • 6 Paulo Silveira // Jun 13, 2007 at 9:09 pm

    Apesar da idéia me agradar, ainda fica um pouco com cara de switch. Mas entendo que querer tratar tudo com polimorfimos da um trabalhao, alem de que o pattern matching pode deixar bem claro pra quem esta lendo o codigo de quem esta invocando o metodo.

  • 7 kumpera // Jun 14, 2007 at 11:23 am

    Paulo, não é quem tem cara, é um switch turbinado sim ;). O problema é mais das linguagens funcionais que não te permitem fatorar seu código de maneira adequada e isso se deve principalmente ao fato de ser uma construção limitadíssima.
    .
    Eu vejo mais utilidade de pattern matching na criação de métodos e destruturing assignment que própriamente nas construções tipo switch.

  • 8 murilo // May 7, 2010 at 6:36 pm

    Realmente ponteiros e pattern matching até se tornarem triviais são um “pesadelo”.
    Só uma observação quanto ao título, a palavra “Ponteiros” foi escrita “Pointeiros”.

    Abraço.

Leave a Comment