1
resposta

[Projeto] Minha solução ao desafio

Minha solução ao desafio, considerando apenas conversões entre real e dólar (sendo dólar = 5.50). Apreciaria alguma sugestão de como reduzir if's e else's na conversão.

import re

class ExtratorURL:
    def __init__(self, url):
        self.url = self.satizador_url(url)
        self.valida_url()

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

    def __str__(self):
        return self.url + "\n" + "URL Base: " + self.get_url_base() + "\n" + "Parâmetros: " + self.get_url_parametro() + "\n" + 'Conversão: ' + f'{self.get_conversao():.2f}'.replace('.', ',') + ' ' + f'{self.get_moeda()}.'

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

    def satizador_url(self, url):
        if type(url) == str:
            return url.strip()
        else:
            return ''

    def valida_url(self):
        if not self.url:
            raise ValueError('A URL está vazia.')

        padrao_url = re.compile('(http(s)?://)?(www.)?bytebank.com(.br)?/cambio')
        match = padrao_url.match(self.url)
        if not match:
            raise ValueError('A URL não é válida')

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

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

    def get_valor_buscado(self, parametro_busca):
        indice_parametro_busca = self.get_url_parametro().find(parametro_busca)
        indice_valor = indice_parametro_busca + len(parametro_busca) + 1
        indice_e_comercial = self.get_url_parametro().find('&', indice_parametro_busca)
        if indice_e_comercial == -1:
            valor_busca = self.get_url_parametro()[indice_valor:]
        else:
            valor_busca = self.get_url_parametro()[indice_valor:indice_e_comercial]
        return valor_busca

    def get_conversao(self):
        origem = self.get_valor_buscado('moedaOrigem')
        quantidade = int(self.get_valor_buscado('quantidade'))

        if origem == 'real':
            conversao = quantidade / 5.50
        else:
            conversao = quantidade * 5.50
        return conversao

    def get_moeda(self):
        if self.get_conversao() <= 1:
            moeda = self.get_valor_buscado('moedaOrigem')
        else:
            if self.get_valor_buscado('moedaOrigem') == 'dolar':
                moeda = 'reais'
            else:
                moeda = 'dólares'
        return moeda


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

print(url1)
print(url2)
1 resposta

Olá Bruno, tudo bem com você?

Peço desculpas pela demora em lhe responder.

Meus parabéns pela resolução do desafio, fico feliz que tenha compartilhado o seu código com a comunidade do fórum Alura. Sua implementação atende bem a proposta do desafio.

Uma das formas que podemos estar reduzindo o uso da estrutura condicional if, será com a utilização de dicionários. Onde as chaves do dicionário serão o nome da moeda de destino ('moedaDestino'), e o valor será a fórmula utilizada para o cálculo. Como apresentado no dicionário abaixo.

conversao = {
    'dolar': quantidade / 5.50,
    'real': quantidade * 5.50,
}

Usaremos apenas um if para verificar se a moeda de destino é uma das chaves do dicionário, caso seja, acessaremos o dicionário usando o nome da moeda de destino. No código abaixo apresento essa implementação.

if moeda_destino in conversao.keys():
    return conversao[moeda_destino]

No código abaixo temos a implementação completa para o método get_conversao.

def get_conversao(self):
    moeda_destino = self.get_valor_buscado('moedaDestino')
    quantidade = float(self.get_valor_buscado('quantidade'))

    conversao = {
        'dolar': quantidade / 5.50,
        'real': quantidade * 5.50,
    }

    if moeda_destino in conversao.keys():
        return conversao[moeda_destino]

Uma observação, optei por converter a quantidade para o tipo float assim, caso a quantidade possua casas decimais, não será levantado erro de conversão de str para float.

Para o método get_moeda podemos utilizar também o dicionário para reduzir o uso da estrutura condicional if. Deixo abaixo a implementação do método.

Método get_moeda

def get_moeda(self):
    moeda_destino = self.get_valor_buscado('moedaDestino')
    moedas_cadastradas = {
        'real': 'reais',
        'dolar': 'dólares',
    }

    if moeda_destino in moedas_cadastradas.keys():
        return moedas_cadastradas[moeda_destino]

Utilizando as urls presentes no seu código, teremos o seguinte resultado.

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

print(url1)
print(url2)

Resultado

https://bytebank.com/cambio?moedaOrigem=real&moedaDestino=dolar&quantidade=100
URL Base: https://bytebank.com/cambio
Parâmetros: moedaOrigem=real&moedaDestino=dolar&quantidade=100
Conversão: 18,18 dólares.
https://bytebank.com/cambio?moedaOrigem=dolar&moedaDestino=real&quantidade=5
URL Base: https://bytebank.com/cambio
Parâmetros: moedaOrigem=dolar&moedaDestino=real&quantidade=5
Conversão: 27,50 reais.

Espero ter ajudado. Em caso de dúvidas estou à disposição.

Não hesite em voltar ao fórum para continuar aprendendo e interagindo com a comunidade.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!