Expressões Regulares Fluente

Escrevi um post em meu blog que trata sobre um assunto meio controverso e, desta forma, gostaria de obter a opinião dos desenvolvedores sobre as possíveis utilizações, vantagens e desvantagens de usar uma API fluente para criar expressões regulares. Aguardo seus comentários.

http://submundojava.com.br/wordpress/2009/07/26/fluent-regex-composer/

Um abraço.

Acho mais fácil aprender regexp.

O problema de regexp é que elas costumam ser “write-only” (como o Perl). Usando notação fluente, pode-se alcançar o objetivo de termos expressões regulares “auto-documentadas”.

Bobagem, regexp é fácil de ler.

http://flimflan.com/blog/ReadableRegularExpressions.aspx é uma interface fluente para C#.

Olá

Interessante. Mas achei muito verboso. De qualquer forma é preciso saber regexp para usar a API.

O que me impressionou foi mais uma vez ver uma resposta no forum com classificações do tipo: bobagem, ridículo e assemelhados. Será que alguém gosta de ser respondido assim?

[]s
Luca

O Martin Fowler escreveu sobre uma solucao que esta no meio termo: nao usa metodos encadeados mas tambem nao deixa a expressao regular numa unica (e quase criptografica) definicao:

Estranho que você não questionou a afirmação anterior, a qual a palavra “bobagem” se refere. Dizer que regular expressions é write-only e esperar que outros aceitem isso sem maiores questionamentos é o cúmulo da preguiça.

Regexp não é difícil. Não é preciso nem comprar livro, basta procurar na internet coisas a respeito.

Olá

Não aceitar, discordar, contra-argumentar, etc. é prática normal em qualquer forum. O que não consigo me acostumar é ver o argumento contrário ser taxado de bobagem como você fez agora ou de ridículo como o Sergio Taborda fez em outro tópico.

Basta dizer porque acha seu modo de pensar melhor.

[]s
Luca

Olá

[quote=thingol]O problema de regexp é que elas costumam ser “write-only” (como o Perl). Usando notação fluente, pode-se alcançar o objetivo de termos expressões regulares “auto-documentadas”.
[/quote]

Quanto a fama de regexp ser “write-only” (entre aspas para os menos observadores), isto é, só permitindo leitura de quem escreveu a expressão, concordo plenamente. Dei uma rápida googlada e encontrei um monte de links afirmando a mesma coisa.

E concordo também que a notação fluente melhora a documentação. Só acho que precisa digitar muita coisa.

[]s
Luca

[quote=Luca]Olá

[quote=thingol]O problema de regexp é que elas costumam ser “write-only” (como o Perl). Usando notação fluente, pode-se alcançar o objetivo de termos expressões regulares “auto-documentadas”.
[/quote]

Quanto a fama de regexp ser “write-only” (entre aspas para os menos observadores), isto é, só permitindo leitura de quem escreveu a expressão, concordo plenamente. Dei uma rápida googlada e encontrei um monte de links afirmando a mesma coisa.

E concordo também que a notação fluente melhora a documentação. Só acho que precisa digitar muita coisa.

[]s
Luca[/quote]

Esses são os seus parâmetros para determinar a veracidade de uma afirmação? Googlear? Haha. Regexp é muito fácil, basta gastar um tempo aprendendo. Mas como programador Java geralmente é preguiçoso, reclamam.

Mesmo no Java, onde não há literal para regexp e você precisa usar escape para barras, é fácil.

É por causa desse tipo de pensamento que abominações como Hibernate existem. Por que as pessoas não aprendem SQL? É fácil fazer uma API que retorne uma Collection ao invés de precisar usar ResultSets, e ainda existem coisas como RowSets, etc.

Quantas horas são gastas reinventando-se a roda?

Não nasci programador Java então vou responder aos que se acham inteligentes em expressões regulares. A idéia é bacana. Verbosa, mas bacana.
Como já disseram, dispensa documentação. Bater o olho e entender o que está acontecendo é um sinal de inteligência. Não adianta o pessoal falar, falar e não saber que essas mesmas expressões, não nasceram no Java, foram adotadas pela linguagem. É, tem gente que nasceu no Java e acaba achando que isso é do Java, acreditem.
Quem aqui já programou no enigmático Perl?
Entender o que está sendo escrito é importante e nem defendo o Java por isso. Mas ai vem um e diz: “háa, olha no google e já era”. Não, melhor, fazer aquela expressão maravilhosa de uma linha que todos acham o máximo porque verifica até se você ronca a noite e todo mundo aplaude, ninguém consegue entender, mas aplaudem. Depois de um tempo, você precisa fazer uma manutenção nela, passados alguns meses talvez, e descobre que não sabe tudo que ela faz e lá se vão alguns váaaaarios minutos para entendê-la, novamente. E olha que foi você quem fez. E isso claro, é sinal de inteligência, afinal, o enigma faz parte do desenvolvimento. Seria essa a proposta mesmo?
Agora, voltando ao tópico após meu lapso de loucura, parabéns ao criador. Evoluir é preciso, mesmo que alguns digam que você reinventou a roda. E nem estou levando em conta as suas inspirações, que por si só, já veem de pensadores que sabem que não adianta construir tudo em 1 linha em uma atitude “inteligente” e depois ser mais “inteligente” ainda para decifrar. Se fosse assim, teríamos que preferir programar em mandarim ao inglês, não é pra simplificar?

[quote=djemacao]Não nasci programador Java então vou responder aos que se acham inteligentes em expressões regulares. A idéia é bacana. Verbosa, mas bacana.
Como já disseram, dispensa documentação. Bater o olho e entender o que está acontecendo é um sinal de inteligência. Não adianta o pessoal falar, falar e não saber que essas mesmas expressões, não nasceram no Java, foram adotadas pela linguagem. É, tem gente que nasceu no Java e acaba achando que isso é do Java, acreditem.
Quem aqui já programou no enigmático Perl?
Entender o que está sendo escrito é importante e nem defendo o Java por isso. Mas ai vem um e diz: “háa, olha no google e já era”. Não, melhor, fazer aquela expressão maravilhosa de uma linha que todos acham o máximo porque verifica até se você ronca a noite e todo mundo aplaude, ninguém consegue entender, mas aplaudem. Depois de um tempo, você precisa fazer uma manutenção nela, passados alguns meses talvez, e descobre que não sabe tudo que ela faz e lá se vão alguns váaaaarios minutos para entendê-la, novamente. E olha que foi você quem fez. E isso claro, é sinal de inteligência, afinal, o enigma faz parte do desenvolvimento. Seria essa a proposta mesmo?
Agora, voltando ao tópico após meu lapso de loucura, parabéns ao criador. Evoluir é preciso, mesmo que alguns digam que você reinventou a roda. E nem estou levando em conta as suas inspirações, que por si só, já veem de pensadores que sabem que não adianta construir tudo em 1 linha em uma atitude “inteligente” e depois ser mais “inteligente” ainda para decifrar. Se fosse assim, teríamos que preferir programar em mandarim ao inglês, não é pra simplificar?
[/quote]

Como pode ser “verbosa” se tanto significado é comprimido em um espaço tão pequeno? Verbosa é a solução em Java. Tantos caracteres e chamadas de métodos que me dá até ânsia, e olha que eu não sou do tipo que conta caracteres para avaliar nada. Preferiria fazer do jeito certo do que usar menos caracteres.

Expressões regulares são muito fáceis. Da mesma forma que depois de um tempo você bate o olho em um código em determinada linguagem e entende, você entenderá regexp. Basta aprender. Agora as críticas quando ao SQL são ridículas. Levando em consideração que alguns vêem “problemas” no SQL, acredito regexp vá pelo mesmo caminho, o de “objetificar” tudo.

Nem tudo é um objeto. A imposição de OO em Java é o que mais me incomoda e não o fato de precisar digitar três linhas de código ao invés de uma.

[quote=Luca]Olá

Não aceitar, discordar, contra-argumentar, etc. é prática normal em qualquer forum. O que não consigo me acostumar é ver o argumento contrário ser taxado de bobagem como você fez agora ou de ridículo como o Sergio Taborda fez em outro tópico.

Basta dizer porque acha seu modo de pensar melhor.

[]s
Luca[/quote]

Concordo contigo Luca, este tipo de comentário só esfria uma discussão saudável e interessante que sempre aconteceu no guj, coisa que tem diminuído devido a atitudes como essa.

Em relação ao post, eu apesar de achar legal expressões regulares, acho que uma expressividade maior é necessária a partir do momento que a regex começa a ficar gigante…partindo do princípio que ninguém é obrigado a saber regex fluente.

Em particular, acho que a abordagem do Fowler é mais clara e mais performática que notação fluente.

O problema das expressões regulares é que normalmente não são fáceis de decompor em partes menores. Mesmo em matemática as fórmulas costumam ser decompostas em partes menores. Por exemplo, para calcular as raízes de uma equação de segundo grau:

(-b +/- sqrt (b * b - 4 * a * c)) / (2 * a)

você normalmente calcula primeiro sqrt (b * b - 4 * a * c) e põe o resultado em uma variável (que normalmente é chamada de “determinante” ou coisa que o valha). Isso é feito até porque sqrt costuma ser uma operação cara e você quer economizar algum tempo.
Depois é que você calcula (-b + det) / (2 * a) e (-b - det) / (2 * a).

Você vê então que não há mais de 4 operações matemáticas em uma única expressão.

Uma expressão regular pode ser lida razoavelmente se ela tiver menos de 5 componentes*; mais que isso, deve-se efetuar uma decomposição, como o que o Fowler sugeriu.

(* Ou seja, algo parecido com as 4 operações matemáticas de uma expressão matemática que citei acima.)

Para quem quer trabalhar com expressões regulares em C++ e não quer se limitar ao modelo do Java (que casualmente será integrado ao C++0X), pode tentar usar a biblioteca Boost.Xpressive ( http://www.boost.org/doc/libs/1_39_0/doc/html/xpressive.html ).

Na minha opinião, ter um builder para Pattern ( o regex nem se vê) não tem mal nehum.
Várias vantagem existem em usar builders e todo o mundo sabe que POS (programação orientada a String) é erro-prone.

Ter um jeito OO de criar Pattern não é nenhum problema.

A execução acabará sendo a mesma, mas como já foi tido , um builder fluente é muito mais simples de ler e o bom código é aquele é simples de ler.
Codigo que funciona , isso qq um sabe fazer. codigo que é facil de ler é que é o desafio.

A API em si poderia ser melhorada, mas a ideia é válida por si mesma já que é aplicação direta do padrão Builder a objetos Pattern.

[quote=Thiagosc]
Esses são os seus parâmetros para determinar a veracidade de uma afirmação? Googlear? Haha. Regexp é muito fácil, basta gastar um tempo aprendendo. Mas como programador Java geralmente é preguiçoso, reclamam.

Mesmo no Java, onde não há literal para regexp e você precisa usar escape para barras, é fácil.

É por causa desse tipo de pensamento que abominações como Hibernate existem. Por que as pessoas não aprendem SQL? É fácil fazer uma API que retorne uma Collection ao invés de precisar usar ResultSets, e ainda existem coisas como RowSets, etc.

Quantas horas são gastas reinventando-se a roda?[/quote]

Você existe mesmo? Ou é mesmo um alter-ego maligno no CV? :slight_smile:

Falando sério…

Eu também achei muito verboso, não da pra bater o olho e entender, mas também acho que regexp também requer alguns segundos para ser entendida, dependendo da complexidade :confused:

É por isso que Java é a porcaria que é. Camadas e mais camadas de APIs e frameworks desnecessários para se evitar o terrível problema, ó céus, de precisar aprender algo que você tem a obrigação de saber como profissional da área.

Regular expressions não é string, regular expressions são regular expressions. Aprenda a diferença. Java usa strings para representá-las porque é uma linguagem pé de chinelo. Mas muitas outras usam sintaxe própria.

Acho mais simples declarar várias constantes String com os pedaços da RegEx que quero fazer, e ao final concatenar todas elas na ordem que quiser. O compilador faz o trabalho de juntar tudo numa String só.

Pelo menos dá para dar nomes à essas constantes e tornar tudo mais legível.