terça-feira, 7 de dezembro de 2010

Meu primeiro Code Dojo (Primeira parte)

Conforme prometido no post abaixo (Python), aí vai o resumo do nosso primeiro Code Dojo. O texto é o mesmo que enviei no e-mail original. E pra não ficar muito grande esta postagem, vou dividí-la em duas partes. A primeira segue abaixo:
E foi grupal! :-))


Brincadeiras a parte, achei muito legal e produtivo. Então, coloco abaixo pra nosso registro o problema, o código a que chegamos e a avaliação. Estejam à vontade para contribuir:


Problema:


Amigo Secreto:


Entrar com uma lista de nomes e sair uma lista com pares.
  • Um dos nomes do par é aleatório.
  • Um usuário não pode se “auto-sortear”.
  • Uma pessoa não pode ser sorteada duas vezes.
Exemplos:
  • Entrada: Francival, Sebastião, Ézyo, Rogênio, Cléoson
  • Saída: Sebastião tirou Francival; Francival tirou Rogênio; ...
Código: (vou mandar em anexo o arquivo)


#!/usr/bin/env python
# -*- encoding:utf-8 -*-


import unittest,random


#def ListarAmigos:
#TODO


def ListarAmigos(amigo1, amigo2):
    return amigo1 == amigo2
   
def sorteio(amigos):
    amigo=amigos[0]
    amigosDisp=amigos[0:1]
    num=random.randrange(len(
amigosDisp))
    par = (amigo, amigosDisp[num])
    print par
    return par
 
class teste_amigos(unittest.TestCase):


    def teste_igual(self):
        self.assertEqual(ListarAmigos("Maria", "Joao"), False)
       
    def teste_sorteio(self):
        amigos=["dartanham","athos", "porthos", "aramis"]
        listaPar = sorteio(amigos)
        self.assertNotEqual(listaPar[0], listaPar[1])
       
#        self.assertEqual(par[0], "dartanham")
#        self.assertNotEqual(par[1], "dartanham")

   
unittest.main() 
Avaliação:


Pontos positivos:
  • Entendimento da metodologia: foi bem proveitoso no sentido de conhecer a metodologia do Code Dojo na prática.
  • Instalações: Sala, refrigeração, computador, a TV de 50 polegadas, tudo em cima e funcionando.
  • Aprendizado da linguagem Python: Sempre se aprende algo de linguagem em situações assim.
  • Foi divertido!!
Pontos negativos:
  • Problema mais simples: Por ser o nosso primeiro Code Dojo, poderia ter sido escolhido um problema mais simples. Bem, vou me defender: eu achei que este problema era simples! :-)
  • Pouco conhecimento de Code Dojo e TDD: O fato de termos pouco conhecimento de como funciona um Code Dojo, e principalmente o desenvolvimento orientado a teste, nos fez perder algum tempo tentando entender como eles funcionavam.
  • Intromissão do público no piloto e co-piloto: O pessoal que estava como público sem empolgava e dizia como o piloto deveria fazer isso ou aquilo. Normal, todos queriam ver o código pronto. Mas para os próximos, vamos tentar nos conter. :-)


Finalizando, gostaria de marcar o próximo Code Dojo para a próxima sexta-feira, 26/11/2010, no mesmo bat-horário e bat-local, ou seja, 15:00h. O problema deve ser com números decimais e romanos, mas não pesquisem antes senão não vai ter graça! Todo mundo de acordo?


Ah, e se alguém conseguir fazer o código deste problema, manda pra todo mundo!
Esse foi o primeiro e-mail. Depois, seguindo a discussão, enviei outro e-mail, com um melhoramento (pelo menos eu acho que ficou melhor :-) ) no código. O e-mail foi:

Não consegui me conter e "resolvi resolver" (o_O) o problema do nosso Code Dojo. Envio o arquivo "amigos.py" em anexo com o código.

     A minha lógica (que eu peguei emprestado do Rogênio :-) ) foi a seguinte: eu pego a lista de entrada, "embaralho" ela, e depois crio os pares em seqüência, ou seja, o elemento[0] da lista "tira" o elemento[1], o elemento[1] "tira" o elemento[2] e assim por diante até o final da lista. Quando chega no final, o último elemento "tira" o primeiro elemento da lista fechando o ciclo. Assim, acho que resolvo o problema de ter número par ou impar de participantes, e também resolvo o problema de "sorteio recíproco".
     Eu acrescentei um teste e eliminei outro: acrescentei um para ver se existem elementos repetidos lista, afinal de contas ninguém participa duas vezes do amigo secreto; e eliminei um (o teste " def teste_igual(self):" do código do e-mail anterior) que fiz de outra forma, ou seja, depois de formados os pares.
     Pra facilitar os (muito aguardados) pitacos de vocês no código, colo-o abaixo:
#!/usr/bin/env python
# -*- encoding:utf-8 -*-

import unittest,random
def nomeRepetido(lista):
    """
    Verifica se a lista tem nomes repetidos.
    """
   
    flag = True
    tamLista = len(lista)
    for i in range(tamLista - 1):
        for j in range(1, tamLista):
            if i < j:
                if lista[i] == lista[j]:
                    flag =  False
    return flag
      
def sorteio(lista):
    """
    Realiza o sorteio dos pares.
    """
   
    random.shuffle(lista) # "Embaralha" a lista recebida
    pares = {} # Cria um dicionário vazio onde serão armazenados os pares
    i = 0
    while i < len(lista):
        amigo1 = lista[i]
        if i == len(lista) - 1:
            amigo2 = lista[0]
            pares[amigo1] = amigo2
            i = i + 1
            continue
        amigo2 = lista[i+1]
        pares[amigo1] = amigo2
        i = i + 1
    return pares


class teste_amigos(unittest.
TestCase):
   
    def teste_repetido(self):
        lista = ["D'Artagnan","Athos", "Porthos", "Aramis"]
        self.assertEqual(nomeRepetido(

lista), True)
       
    def teste_sorteio(self):
        lista = ["D'Artagnan","Athos", "Porthos", "Aramis"]
        listaPar = sorteio(lista)
        for par in listaPar:
            self.assertNotEqual(par, listaPar[par])

unittest.main()
O Sebastião, que manja de programação mas é modesto pra admitir :-), respondeu o seguinte:

Muito bom o código, gostei da função shuffle, eu não conhecia. E os testes ficaram bem legais.
Estou enviando uma outra forma de implementar as funções: http://pastebin.com/yjpVhCmu

Continua no próximo post...

Nenhum comentário: