1
resposta

[Projeto] [Projeto] Conversão de moedas

import re

class ExtratorURL:
    def __init__(self, url):
        self.url = self.sanitiza_url(url)
        self.valida_url()  # Porque que aqui não é self.url ou self.valida_url(url)?

    def sanitiza_url(self, url):
        return url.strip()

    def valida_url(self):
        if self.url == "":
            raise ValueError("A Url está vazia")
        else:
            padrão_url = re.compile(
                "(http(s)?://)?(www.)?(bytebank.com)(.br)?(/cambio)")
            match = padrão_url.match(url)
            if not match:
                raise ValueError("Url inválida")

    def get_url_base(self):
        indice_interrogação = self.url.find("?")
        url_base = self.url[:indice_interrogação]
        return url_base

    def get_url_parametros(self):
        indice_interrogação = self.url.find("?")
        url_parametro = self.url[indice_interrogação+1:]
        return url_parametro

    def get_valor_parametro(self, parametro_busca):
        indice_parametro = self.get_url_parametros().find(parametro_busca)  # 12
        # posição 12 + 5 letras + 1 = posição 24
        indice_valor = indice_parametro + len(parametro_busca) + 1
        indice_ecomercial = self.get_url_parametros().find(
            "&", indice_valor)  # vai procurar o & a partir da posição do indice valor (24)
        if indice_ecomercial == -1:  # -1 aparece quando não se encontra o que se está procurando
            valor = self.get_url_parametros()[indice_valor:]
        else:
            valor = self.get_url_parametros()[indice_valor:indice_ecomercial]
        return valor

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

    def __str__(self):
        return self.url + "\n" + "Parâmetros: " + self.get_url_parametros() + "\n" + "URL Base: " + self.get_url_base()

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


class conversaodeMoedas:
    def __init__(self, url):
        self.moeda_origem = ExtratorURL(url).get_valor_parametro("moedaOrigem")
        self.moeda_destino = ExtratorURL(
            url).get_valor_parametro("moedaDestino")
        self.quantidade = ExtratorURL(url).get_valor_parametro("quantidade")
        self.verifica_dados()
        self.converte_moedas()

    def verifica_dados(self):
        if self.moeda_origem == "" or self.moeda_destino == "" or self.quantidade == "":
            raise ValueError("Impossivel calcular, ausência de dados")

    def converte_moedas(self):
        if self.moeda_origem == "dolar":
            if self.moeda_destino == "real":
                valor_convertido = float(self.quantidade) * 5.10
                self.valor_convertido = valor_convertido
                return self.valor_convertido, self.moeda_origem, self.moeda_destino
            else:
                raise ValueError(
                    "Só realizamos conversão do dolar para real, verifique os dados")

        if self.moeda_origem == "real":
            if self.moeda_destino == "dolar":
                valor_convertido = float(self.quantidade) / 5.10
                self.valor_convertido = valor_convertido
                return self.valor_convertido, self.moeda_origem, self.moeda_destino
            else:
                raise ValueError(
                    "Só realizamos conversão do real para dolar, verifique os dados")

    def __str__(self):
        return "Moeda de origem:" + conversao_moedas.moeda_origem.capitalize() + "\n" + "Moeda de destino: " + conversao_moedas.moeda_destino.capitalize() + "\n" + "Valor a ser convertido: " + conversao_moedas.quantidade + "\n" + "Resultado da conversão: " + str(conversao_moedas.valor_convertido)


url = "bytebank.com/cambio?quantidade=100&moedaOrigem=real&moedaDestino=dolar"
extrator_url = ExtratorURL(url)
conversao_moedas = conversaodeMoedas(url)
print(conversao_moedas)
1 resposta

Olá Lorraine, tudo bem com você?

Meus parabéns pela resolução do desafio, fico feliz que tenha compartilhado-o com a comunidade do fórum Alura. A classe criada para a conversão das moedas atende bem a proposta do desafio.

Notei que dentro do código à seguinte pergunta em forma de comentário, "Porque que aqui não é self.url ou self.valida_url(url)?". Quero aproveitar a oportunidade e deixar uma explicação sobre essa parte do método inicializador da classe ExtratorURL.

Quando é realizada a chamada do método self.valida_url() no método construtor, não será necessário passarmos o parâmetro url, pois, dentro deste método iremos trabalhar com o atributo do objeto (self.url) que passou por uma sanitização, removendo os espaços. Fato que ocorre na seguinte linha: self.url = self.sanitiza_url(url).

Caso forneçamos novamente o parâmetro url para o método self.valida_url() estaríamos fornecendo uma url que não foi sanitizada e que poderia elevar erros de validação. Para que isso não ocorra, dentro do método valida_url() trabalhamos com o atributo do objeto (self.url), pois este possui uma url já sanitizada.

Sobre adicionar apenas o self.url no método construtor, não terá nenhum efeito para a classe.

Espero ter ajudado, fico à disposição em caso de dúvidas.

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!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software