2
respostas

Minha resolução do desafio

Minha resolução do desafio, queria saber se encaixe com o que foi proposto, aceito dicas de melhorias no codigo, e dica no que posso melhorar Obrigado a Todos!

import re

class ExtratorURL:

    def __init__(self, url):
        self.url = self.sanitiza_url(url)
        self.valida_url()

    def __str__(self):
         return f'Url Completa: {self.url}' + '\n' + f'Url Base: {self.get_base_url()}' + '\n' + f'Url parametros: {self.get_parametros_url()} '

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

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

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

    def valida_url(self):
        if not self.url:
            raise ValueError('A URL esta vazia!')
        self.validacao_url_base()

    def validacao_url_base(self):
        padrao_url = re.compile('(http(s)?://)?(www.)?bytebank.com(.br)?(/cambio)')
        busca = padrao_url.match(self.url)
        if not busca:
            raise ValueError('URL Invalida!')


    '''def validacao_url_base(self):
        Validação usando os metodos endswith e startswith
        if not str.endswith(self.get_base_url(), 'cambio'):
            raise ValueError('Pagina na URL nao encontrada!')
        elif not str.startswith(self.get_base_url(), 'https'):
            raise ValueError('HTTPS nao encontrado!')'''

    def get_base_url(self):
        url_interrogacao = self.url.find('?')
        url_base = self.url[:url_interrogacao]
        return url_base

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

    def valores_parametros(self, parametro):
        indice_parametro_busca = self.get_parametros_url().find(parametro)
        indice_valor = indice_parametro_busca + len(parametro) + 1
        indice_e_comercial = self.get_parametros_url().find('&', indice_valor)
        if indice_e_comercial < 0:
            valor = self.get_parametros_url()[indice_valor:]
        else:
            valor = self.get_parametros_url()[indice_valor:indice_e_comercial]
        return valor


class Conversor_moedas:

    def __init__(self, valor_dolar, quantidade_real):
        self._valor_dolar = float(valor_dolar)
        self._quantidade_real = float(quantidade_real)

    def __str__(self):
        return f'Valor Dolar: {self.valor_dolar}' + '\n' + f'Quantidade de moedas em Real: {self.quantidade_real}'

    @property
    def valor_dolar(self):
        return f'U${float(self._valor_dolar):.2f}'

    @valor_dolar.setter
    def valor_dolar(self, novo_valor):
        self._valor_dolar = novo_valor


    @property
    def quantidade_real(self):
        return f'R${float(self._quantidade_real):.2f}'

    @quantidade_real.setter
    def quantidade_real(self, novo_valor):
        self._quantidade_real = novo_valor

    def conversor(self):
        result = self._quantidade_real * self._valor_dolar
        return result

    def mostrar_conversao(self):
        print(f'Conversão de R${self._quantidade_real:.2f} para dolar ficara em um total de R${self.conversor():.2f}!! \n'
              f'Sabendo que o valor do Dolar e de U${self._valor_dolar:.2f}')


url = ExtratorURL('https://bytebank.com/cambio?quantidade=100&moedaDestino=Dolar&moedaOrigem=real')
url1 = ExtratorURL('https://bytebank.com/cambio?quantidade=100&moedaDestino=Dolar&moedaOrigem=real')
conversao1 = Conversor_moedas(5.50, url.valores_parametros('quantidade'))
#url = ExtratorURL('   ')
print(url)
print(f'Tamanho URL:{len(url)}')
print(url.get_base_url())
print(url.get_parametros_url())
print(url.valores_parametros('quantidade'))
print(f'Comparando dois objetos (url e url1): {url == url1}')
print(conversao1)
conversao1.mostrar_conversao()
2 respostas

Olá, Douglas! Tudo bem?

Primeiramente, gostaria de parabenizá-lo pelo esforço na resolução do desafio. Você criou duas classes, ExtratorURL e Conversor_moedas, e implementou diversos métodos para extrair informações da URL e realizar a conversão de moedas.

A classe ExtratorURL parece estar funcionando corretamente, pois você consegue extrair a URL base, os parâmetros da URL e os valores dos parâmetros. No entanto, sugiro que você faça algumas melhorias no código:

  1. Na função sanitiza_url, você pode simplificar o código utilizando o operador ternário. Em vez de usar um if para verificar o tipo da variável url, você pode fazer assim: return url.strip() if isinstance(url, str) else ''.

  2. Na função validacao_url_base, você pode utilizar o método endswith para verificar se a URL termina com "/cambio" e o método startswith para verificar se a URL começa com "https". Isso pode deixar o código mais legível e evitar a necessidade de usar expressões regulares.

A classe Conversor_moedas também está funcionando corretamente, pois você consegue realizar a conversão de moedas e exibir o resultado. No entanto, sugiro que você faça algumas melhorias no código:

  1. Na função conversor, você pode simplificar o cálculo da conversão utilizando uma expressão direta: return self._quantidade_real * self._valor_dolar.

  2. Na função mostrar_conversao, você pode utilizar o método format para formatar as strings de saída. Por exemplo: print('Conversão de R${:.2f} para dólar ficará em um total de R${:.2f}!'.format(self._quantidade_real, self.conversor())).

Além dessas melhorias, sugiro que você implemente a leitura dos parâmetros da URL e a criação do objeto Conversor_moedas no construtor da classe ExtratorURL. Isso pode deixar o código mais organizado e evitar a necessidade de criar esses objetos manualmente.

Espero que essas dicas possam te ajudar a aprimorar seu código.

Bons estudos!

Muito obrigado pelas dicas, Aplicarei as correções.