Runas, passo 06: hĂfens e nomes antigos
Veja esta parte da tabela UnicodeData.txt
:
0027;APOSTROPHE;Po;0;ON;;;;;N;APOSTROPHE-QUOTE;;;;
0028;LEFT PARENTHESIS;Ps;0;ON;;;;;Y;OPENING PARENTHESIS;;;;
0029;RIGHT PARENTHESIS;Pe;0;ON;;;;;Y;CLOSING PARENTHESIS;;;;
002A;ASTERISK;Po;0;ON;;;;;N;;;;;
002B;PLUS SIGN;Sm;0;ES;;;;;N;;;;;
002C;COMMA;Po;0;CS;;;;;N;;;;;
002D;HYPHEN-MINUS;Pd;0;ES;;;;;N;;;;;
002E;FULL STOP;Po;0;CS;;;;;N;PERIOD;;;;
Duas coisas me chamaram atenção aqui:
- Alguns nomes tĂȘm palavras hifenadas, como âHYPHEN-MINUSâ (por coincidĂȘncia). Ă desejĂĄvel que o usuĂĄrio encontre esses caracteres digitando apenas uma das palavras, âHYPHENâ ou âMINUSâ.
- Algumas linhas tem no campo Ăndice 10 um nome diferente, que era o nome adotado no Unicode 1.0 (veja documentação do UCD 9.0). Por exemplo o caractere U+002E, âFULL STOPâ, era âPERIODâ. Incluir esses nomes tambĂ©m pode facilitar a vida dos usuĂĄrios.
Nesta parte do tutorial a proposta Ă© que vocĂȘ implemente as mudadanças para exercitar os conceitos vistos atĂ© agora.
No final do exercĂcio, o programa deverĂĄ se comportar assim:
$ ./runas quote
U+0027 ' APOSTROPHE (APOSTROPHE-QUOTE)
U+2358 â APL FUNCTIONAL SYMBOL QUOTE UNDERBAR
U+235E â APL FUNCTIONAL SYMBOL QUOTE QUAD
$ ./runas minus hyphen
U+002D - HYPHEN-MINUS
U+207B â» SUPERSCRIPT MINUS (SUPERSCRIPT HYPHEN-MINUS)
U+208B â SUBSCRIPT MINUS (SUBSCRIPT HYPHEN-MINUS)
U+FE63 ïčŁ SMALL HYPHEN-MINUS
U+FF0D ïŒ FULLWIDTH HYPHEN-MINUS
U+E002D TAG HYPHEN-MINUS
Comportamentos a observar:
- A busca pelas palavra âquoteâ encontra qualquer caractere onde essa palavra apareça, mesmo como parte de uma palavra hifenada como âAPOSTROPHE-QUOTEâ
- Buscar as palavras âminus hyphenâ encontra qualquer caractere onde ambas palavras apareçam, em qualquer ordem, mesmo como partes parte de uma palavra hifenada como âHYPHEN-MINUSâ
- A busca inclui o campo 10 dos registros em âUnicodeData.txtâ, onde aparecem os nomes do Unicode 1.0 como âAPOSTROPHE-QUOTEâ e âSUPERSCRIPT HYPHEN-MINUSâ.
- Quando hĂĄ informaçÔes no campo 10, elas sĂŁo exibidas nos resultados entre parĂȘntesis depois do nome do caractere. Por exemplo:
U+0027 ' APOSTROPHE (APOSTROPHE-QUOTE)
MĂŁos Ă obra! Se precisar de ajuda, veja dicas a seguir.
Independente de usar dicas ou nĂŁo, depois me conte quanto tempo vocĂȘ levou para fazer este exercĂcio.
Dicas
1. Mudanças em AnalisarLinha
Para atender os requisitos do exercĂcio, a função AnalisarLinha
precisa devolver uma fatia de palavras que inclua as partes de cada termo com hĂfen, e tambĂ©m as palavras do campo Ăndice 10. AlĂ©m disso, havendo conteĂșdo no campo 10, esse texto deverĂĄ ser concatenado ao nome, entre parĂȘntesis.
Tente resolver o exercĂcio com a dica acima, antes de ler a prĂłxima dica.
2. Casos de teste para AnalisarLinha
Crie outra função de teste, em vez de apagar ou mudar o TestAnalisarLinha
que jĂĄ existe. O comportamento que jĂĄ verificamos em TestAnalisarLinha
continua valendo.
Agora teremos pelo menos trĂȘs casos de teste:
- Campo 10 vazio e nenhum hĂfen.
- Campo 10 vazio e hĂfen no campo 1.
- Campo 10 utilizado e hĂfens presentes.
Para testar isso sem duplicar muito cĂłdigo de TestAnalisarLinha
, sugiro fazer um teste em tabela. Use a estrutura de TestContém
como inspiração.
Tente resolver o exercĂcio com a dica acima, antes de ler a prĂłxima dica.
3. Testando com o âbaby stepsâ
A metodologia TDD recomenda âbaby stepsâ - passos bem simples. Ao criar um teste em tabela, coloque inicialmente apenas um caso na tabela. Faça este caso passar antes de colocar outro caso. No final, sua tabela pode ter vĂĄrios casos, mas vocĂȘ sĂł deve incluir e fazer passar um caso de cada vez.
Tente resolver o exercĂcio com a dica acima, antes de ler a prĂłxima dica.
4. Resolva primeiro o tratamento dos hĂfens
HĂĄ vĂĄrias formas de transformar "SMALL HYPHEN-MINUS"
em uma lista de trĂȘs palavras: []string {"SMALL", "HYPHEN", "MINUS"}
. VocĂȘ pode passar o texto original por strings.Replace
para substituir "-"
por " "
antes de usar strings.Fields
para separar as palavras. Ou entĂŁo vocĂȘ pode usar strings.FieldsFunc
para fazer as duas operaçÔes de uma vez só.
Seja como for, recomendo criar uma função auxiliar para fazer essa separação por espaços ou hĂfens. E nĂŁo esqueça de fazer TDD: escreva o teste antes de implementar a funcionalidade!
Tente resolver o exercĂcio com a dica acima, antes de ler a prĂłxima dica.
5. Lembre-se de reflect.DeepEqual
Para testar a função que transforma "SMALL HYPHEN-MINUS"
em []string {"SMALL", "HYPHEN", "MINUS"}
, vocĂȘ vai precisar comparar a fatia produzida com a fatia esperada, mas Go sĂł permite comparar uma fatia com nil
. Para comparar uma fatia com outra, lembre-se de usar a função reflect.DeepEqual
como fizemos em TestAnalisarLinha
.
Tente resolver o exercĂcio com a dica acima, antes de ler a prĂłxima dica.
6. Atenção para palavras duplicadas nos campos 1 e 10
Observe este caso:
0027;APOSTROPHE;Po;0;ON;;;;;N;APOSTROPHE-QUOTE;;;
Queremos que AnalisarLinha
devolva como lista de palavras apenas isto: []string{"APOSTROPHE", "QUOTE"}
e nĂŁo []string{"APOSTROPHE", "APOSTROPHE", "QUOTE"}
. VocĂȘ pode usar função auxilar contĂ©m
que criamos no passo-05
para resolver este problema.
Fim do exercĂcio
Quando tiver terminado, anote o tempo que levou para fazer o exercĂcio e conte para o instrutor. Isso ajuda a melhorar o tutorial.
O Passo 7 é uma seção bÎnus, onde faremos o download automåtico do arquivo UnicodeData.txt
. Siga em frente se tiver feito o exercĂcio. A solução deste exercĂcio e o cĂłdigo que faz download estĂŁo no diretĂłrio raiz do repositĂłrio runas
(nĂŁo hĂĄ um diretĂłrio runas07
).