1
resposta

[Projeto] Desafio: Conversão de moedas - dólar e real

Resolução tendo como base a informações passadas na URL e em suas variações.

import re


class ExtratorURL:
    def __init__(self, url):
        self.url = self.sanitiza_url(url)
        self.validacao_url()

    def __str__(self):
        return f'URL Completa: {self.url}\nBase da URL: {self.get_url_base()}\nParâmetros da URL: {self.get_url_parametros()}'

    def __len__(self):
        return len(self.url)

    def __eq__(self, other):
        return self.url == other.url

    @staticmethod
    def sanitiza_url(url):
        if type(url) == str:
            return url.strip()
        else:
            return ''

    def validacao_url(self):
        if not self.url:
            raise ValueError('URL inexistente')
        padrao_url = re.compile('(http(s)?://)?(www.)?[a-z]+.com(.br)?/[a-z]')
        busca_url = padrao_url.match(self.url)
        if not busca_url:
            raise ValueError('A URL é inválida')

    def get_url_base(self):
        indice_barra = self.url.find('//')
        indice_interrogacao = self.url.find('?')
        url_base = self.url[indice_barra + 2:indice_interrogacao]
        return url_base

    def get_url_parametros(self):
        indice_interrogacao = self.url.find('?')
        url_parametros = self.url[indice_interrogacao + 1:]
        return url_parametros

    def get_busca_parametro(self, parametro):
        indice_parametro = self.get_url_parametros().find(parametro) + len(parametro) + 1
        indice_e_comercial = self.get_url_parametros().find('&', indice_parametro)
        if indice_e_comercial == -1:
            return self.get_url_parametros()[indice_parametro:]
        else:
            return self.get_url_parametros()[indice_parametro:indice_e_comercial]

    def conversor_de_moeda(self, cotacao):
        moeda_origem = self.get_busca_parametro('moedaOrigem')
        moeda_destino = self.get_busca_parametro('moedaDestino')
        quantidade = int(self.get_busca_parametro('quantidade'))
        if moeda_origem == moeda_destino:
            raise ValueError('A moeda de origem não pode ser a mesma de destino.')
        elif moeda_origem == 'real':
            conversao = quantidade / cotacao
            return f'Real: R$ {quantidade:.2f} -> Dólar: US$ {conversao:.2f}'
        elif moeda_origem == 'dolar':
            conversao = cotacao * quantidade
            return f'Dólar: US$ {quantidade:.2f} -> Real: R$ {conversao:.2f}'
        else:
            raise ValueError('O conversor trabalha apenas com Real e Dólar')


url = ExtratorURL('http://bytebank.com/cambio?moedaOrigem=real&moedaDestino=dolar&quantidade=100')
url1 = ExtratorURL('http://bytebank.com/cambio?moedaOrigem=real&moedaDestino=dolar&quantidade=100')

print(f'Comparando dois objetos [url = url1]: {url == url1}')
print(f'Tamanho da URL: {len(url)}')
print(url)
busca = url.get_busca_parametro('moedaOrigem')
print(busca)
print(url.conversor_de_moeda(5.50))

# Troca de moedas origem e destino
url2 = ExtratorURL('http://bytebank.com/cambio?moedaOrigem=dolar&moedaDestino=real&quantidade=150')
print(url2.conversor_de_moeda(5.50))


# Troca das posições dos parâmetros da url
url3 = ExtratorURL('http://bytebank.com/cambio?quantidade=135&moedaDestino=real&moedaOrigem=dolar')
print(url3.conversor_de_moeda(5.50))
1 resposta

Olá Guilherme, tudo bem contigo?

Parabéns pela sua solução no projeto de conversão de moedas! Você se saiu muito bem ao resolver o problema utilizando informações passadas na URL e suas variações.

Sua implementação mostra uma ótima organização do código, com uma classe bem estruturada e métodos bem definidos. Além disso, a ideia de utilizar expressões regulares para validar a URL e obter os parâmetros é muito eficiente.

A utilização dos métodos especiais __str__, __len__ e __eq__ é uma ótima abordagem para tornar a classe mais amigável e poder comparar objetos.

Agora, como dica para complementar sua solução, sugiro adicionar tratamento de exceções para o caso em que a cotação passada para o método conversor_de_moeda seja igual a zero. Assim, evitaremos divisões por zero e problemas indesejados.

Mais uma vez, parabéns pela sua excelente solução! Continue assim, e não deixe de explorar mais desafios e aprimorar suas habilidades de programação. Se precisar de ajuda ou tiver alguma dúvida, estaremos aqui para apoiá-lo.

Grande abraço!