Prova do Google Developer Day em Delphi

Essa foi a primeira vez que decidi resolver a prova proposta pelo Google para quem quer participar do Google Developer Day.

Basicamente você tinha que escrever código para ler e extrair informações de um texto. Palavras que tem tamanho X e começam com letras específicas, palavras que tem tamanho Y e não possuem determinada letra, converter palavras em números usando uma formula maluca deles, ordenar o texto usando uma ordem de alfabeto totalmente diferente do nosso. Coisas desse tipo.

O mais interessante é que eles deram dois textos, em um deles já informando as respostas e o outro é o que você tinha que usar para responder. Isso facilitou muito.

Decidi usar TDD. Criei minha classe para fazer a leitura do texto com os métodos e propriedades que ela precisaria expor para me informar as respostas e antes de codificar a classe, já escrevi os testes baseados nas respostas do texto A. Rodei os testes e obviamente todos falharam, a partir daí comecei a codificar para cada um dos testes passar. Depois dos testes passarem, fiz um segundo projeto com interface visual, permitindo que o usuário digitasse qualquer texto em “Googlon”, que seria automaticamente processado pelo meu parser.

O bom desse tipo de abordagem é que depois você pode refatorar o código sem medo, pois está protegido pelos testes. Se caso você quebre alguma coisa, vai saber imediatamente. Tanto que quando estava escrevendo esse post, percebi que eu tinha uma lista totalmente desnecessária na minha classe. Removi e rodei os testes. Todos passaram, o que quer dizer que não quebrei nada. Não precisei sequer rodar o projeto com a interface visual para testar a mudança. Ou seja, além de tranquilidade, TDD te dá muito mais produtividade, pois você consegue alterar o código com muito mais rapidez.

As duas coisas que deram mais trabalho na solução do problema em Delphi foram:

  • Ordenar a string usando um alfabeto ordenado de forma diferente do nosso. Eu tinha certeza que existia algum algoritmo testado e comprovado para isso, pois é algo que já deve ter sido feito milhões de vezes. Perdi tempo procurando. Por fim não encontrei e fiz o meu mesmo. Ele vai comparando letra por letra e quando a letra é igual, compara a próxima. Se não existir a próxima letra em uma das palavras, ela é menor.
  • Perceber que o Delphi estava silenciosamente informando valores inválidos quando estourava a capacidade do tipo Integer. Isso eu achei bem estranho, pois esperava que fosse levantada uma exception em caso de estourar o tipo. Por algum motivo que ainda não descobri, o código que eu escrevi para converter a palavra para valor numérico não levanta nada, simplesmente informa o valor errado se você usar Integer. O que acontece é que, não sei por qual motivo, o Delphi vem por padrão com “Range Checking” desativado (valeu Cesar!). Ativando esta opção, o código quebra e você consegue perceber o problema imediatamente. Troquei para Int64 e resolveu.

Enfim, levei duas ou três horas para resolver os problemas e acho que valeu o desafio. Principalmente para ficar ainda mais atento com as limitações dos tipos (como no caso do Integer) e o tal do Range Checking desativado por padrão.

Acho que vale a pena tentar resolver, principalmente porque a prova é diferente para cada um. Esse é o link para a prova, e você pode fazer mesmo que não pretenda participar do evento. Meu projeto completo está aqui, mas recomendo você fazer o seu antes de analisar o meu. Quem sabe você não tem idéias muito melhores?

  • Rafael Piccolo

    O problema do overflow já estava no enunciado até, quando eu fiz já fui direto pro Int64 p/ evitar a fadiga, hehe… Agora no caso da ordenação eu achei mais fácil trocar as letras da palavra em aooglon para a ordem normal do nosso alfabeto. Aí é só usar a ordenação padrão do TSringList.

    • http://www.ericksasse.com.br Erick Sasse

      Sim, o overflow estava no enunciado, mas eu tinha tanta confiança que se ocorresse um estouro o Delphi me avisaria que eu simplesmente ignorei isso de início. Ainda preciso entender porque o Delphi deixaria algo acontecer dessa forma silenciosamente, não faz sentido pra mim.

      Sobre a ordenação, excelente! Como não pensei nisso!? :)

  • http://fabriciodev.blogspot.com Fabricio Colombo

    Muito legal Erick, não conhecia essa prova, assim que chegar em casa vou tentar resolver e compartilho o resultado.

    Abraços.

  • Heber

    Eric, que software você usa para fazer o TDD?

    • http://www.ericksasse.com.br Erick Sasse

      DUnit, já vem com o Delphi.

  • Jeferson Oliveira

    “Ainda preciso entender porque o Delphi deixaria algo acontecer dessa forma silenciosamente”

    O help do Delphi explica: “Enabling range checking slows down your program and makes it somewhat larger.”.

    P.S.: seria interessante se fosse possível responder um comentário (threaded comment) para facilitar o debate.

    • http://www.ericksasse.com.br Erick Sasse

      Ah, mesmo assim eu não concordo não. O padrão deveria ser habilitado, que é mais seguro, e claro, ter a opção de desabilitar quando for desejado/necessário.

    • http://www.ericksasse.com.br Erick Sasse

      Jeferson, habilitei os threaded comments. Achei que não existia isso nativamente no WordPress, mas na verdade estava desativado.

      • Jeferson Oliveira

        Testando. Vamo vê se fica legal.

        • Jeferson Oliveira

          Gostei. Valeu!

          • http://www.ericksasse.com.br Erick Sasse

            Também gostei! :)

  • http://fabriciodev.blogspot.com Fabricio Colombo

    @Heber Dias atrás publiquei no meu blog dois posts sobre utilização de testes unitários com DUnit.

    Dá uma conferida lá: http://fabriciodev.blogspot.com/search/label/DUnit

  • Rafael Pimenta

    “DUnit, já vem com o Delphi.”

    Qual versao do Delphi?

    • http://www.ericksasse.com.br Erick Sasse

      Não me lembro, mas já faz muito tempo que vem.

  • http://fabriciodev.blogspot.com Fabricio Colombo

    Segundo a wikipedia o DUnit acompanha o delphi desde a versão 2005. Realmente já faz bastante tempo.

  • Pingback: Prova do Google Developer Day 2011 « Evandro da Silva Amparo

  • http://evandroamparo.wordpress.com Evandro

    Gostei tanto que resolvi fazer a prova também, mas em C# e com TDD, é claro, apesar de gostar muito do Delphi.