Pratique, pratique, pratique!

O título deste post faz uma referencia ao livro O Programador Apaixonado de Chad Fowler, (um livro muito bom, recomendo). No capitulo que leva o mesmo nome deste post, o autor fala da necessidade do desenvolvedor em praticar, tanto para apreender coisas novas, como para não esquecer e fortalecer esse aprendizado, dentre outras coisas.

Algo que muito me chamou a atenção neste capitulo foi a última dica passada na sessão faça algo, a dica “Pratique com Code Kata”. Não entrarei em detalhes sobre Code Kata, porém, recomendo a leitura do artigo O que é o Coding Dojo do meu grande amigo Márcio Bonfim.

Voltando ao tema, esse capítulo me motivou a praticar mais com Python. Como eu estava sem ideias sobre o que atacar, resolvi procurar alguns desafios simples, em um formato muito semelhante a um code kata, nesta busca me deparei com o site DojoPuzzles que consiste em uma coleção desses pequenos desafios.

O primeiro desafio que escolhi foi o Analisando URLs, um desafio simples o suficiente para validar se essa ideia maluca pode ser divertida. O desafio desse puzzle basicamente seria validar e interpretar as partes de uma url, seja uma url do protocolo HTTP ou uma url do protocolo SSH. O resultado do estudo/desafio ficou desta forma:

import re

class UrlAnalyzing:
    def __init__(self, url=''):
        self.url = url

    def __get_protocol(self):
        m = re.match(r'\w+', self.url)
        if m:
            return m.group(0)
        else:
            raise Exception('Invalid url')

    def __get_http_information(self):
        m = re.match(r'(?P<protocol>\w+)://(?P<host>\w+)\.(?P<domain>[\w\.]+)/?(?P<path>\w*)/?(?P<parameter>[\w=]*)', self.url)
        if m:
            return {'url': self.url,
                    'protocol': m.group('protocol'),
                    'host': m.group('host'),
                    'domain': m.group('domain'),
                    'path': m.group('path'),
                    'parameter': m.group('parameter')}
        else:
            raise Exception('Invalid url')

    def __get_ssh_information(self):
        m = re.match(r'(?P<protocol>\w+)://(?P<user>\w+)%(?P<password>\w+)@(?P<domain>[^/]+)', self.url)
        if m:
            return {'url': self.url,
                    'protocol': m.group('protocol'),
                    'user': m.group('user'),
                    'password': m.group('password'),
                    'domain': m.group('domain')}

    def analyzing(self):
        protocol = self.__get_protocol().upper()
        if protocol == 'HTTP':
            return self.__get_http_information()
        elif protocol == 'SSH':
            return self.__get_ssh_information()
        else:
            raise Exception('Invalid url')

Basicamente fiz uma classe que realiza todas as validações e tratamentos utilizando RegEx (uma das coisas mais bacanas que eu apreendi no último ano). A utilização desta classe é algo muito simples, informe a url e execute o método analyzing(), veja os exemplos:

Chamada:

ua = UrlAnalyzing('http://www.google.com/mail/user=fulano')
print(ua.analyzing())

Saída:

{'host': 'www', 'path': 'mail', 'protocol': 'http', 'domain': 'google.com', 'parameter': 'user=fulano', 'url': 'http://www.google.com/mail/user=fulano'}

Chamada:

ua.url = 'ssh://fulano%senha@git.com/'
print(ua.analyzing())

Saída:

{'protocol': 'ssh', 'user': 'fulano', 'domain': 'git.com', 'password': 'senha', 'url': 'ssh://fulano%senha@git.com/'}

Chamada:

ua.url = 'htp://123@gmail.www&_.1'
print(ua.analyzing())

Exception gerada pela url ser inválida:

Exception: Invalid url

Apesar de eu não estar fazendo um dojo (por estar desenvolvendo sozinho), ainda sim a experiência até agora foi muito divertida. Recomendo para você que esteja aprendendo uma nova linguagem mas não tem abertura para usa-la profissionalmente, procure por grupos de CodingDojo em sua cidade, ou seja independente e procure alguns pequenos desafios para praticar e testar seus conhecimentos.

Estarei mantendo o repositório python-puzzles no GitHub com todos os katas que eu for resolvendo, sinta-se à vontade para colaborar com o repositório, seja sugerindo melhores resoluções ou até mesmo sugerindo novos desafios para serem resolvidos.

Sobre Diego Garcia

Analista/Desenvolvedor Delphi desde 2008, bacharel em Ciência da Computação e entusiasta de metodologias ágeis e engenharia de software.
Esse post foi publicado em Metodologias Ágeis, Programação, Tecnologia e marcado , , , , , . Guardar link permanente.

Deixe um comentário