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.
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