Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Transformando a calculadora de impostos.

Atualmente a calculadora recebe dois objetos, um que armazena um valor e um que contem os cálculos.

Gostaria que pudesse ser passado um parâmetro numérico e um parâmetro texto, e retornasse um valor numérico com o resultado.

    public class CalculadorDeImposto
    {
//        public double Calcula(double orcamento, Imposto estrategiaDeImposto)
        public double Calcula(double orcamento, string estrategiaDeImposto)
        {
//-- Aqui fica a dúvida de como transformar texto em um objeto
            double resultado = estrategiaDeImposto.Calcula(new Orcamento(orcamento));

            return resultado;
        }
    }
9 respostas

Opa Samir, aí deu ruim.. se vc recebe uma string com a estrategia, vc vai precisar fazer os ifs para decidir qual implementação de Imposto instanciar. Geralmente esse código fora da classe Calculador, caso contrário vc estaria acoplando ela fortemente as implementações de imposto.

Em xHarbour que é a linguagem que eu trabalho é possível fazer isso através de blocos de código, ficaria mais ou menos assim:

//double resultado = estrategiaDeImposto.Calcula(new Orcamento(orcamento));

local Result, bFuncao := {|| nil }, cAux := ""

   cAux := '{|| ' + estrategiaDeImposto + '.Calcula( new Orcamento(orcamento)) }'

   bFuncao := &(cAux)

   Result := Eval(bFuncao)

Return Result

E se o parametro estrageriaDeImposto for uma string invalida? Você consegue algo parecido com meta programação no c#.. mas acho meio arriscado.

Nesse caso daria um erro que deveria ser tratado com Try / Catch

Sei que é arriscado, só estou conjecturando e tentando entender como eu poderia fazer algo semelhante no C#, algum dos cursos da Alura aborda Meta programação?

Não rola fazer com string extensions?

http://stackoverflow.com/questions/4910108/how-to-extend-c-sharp-built-in-types-like-string

Bruno, não resolveria pois ainda precisaria de IF's para definir quais das extensions usaria...

O que poderia resolver é usar uma extension para fazer a meta programação, algo como:

"ICMS(1000)".Executar()

Quero poder passar Calculadora.Calcula(1000, "ICMS") e receber o resultado do ICMS para um Orçamento de 1000,00

Ainda não temos um curso que cobre isso aqui na alura :(.

Tem previsão?

Sinto falta também de um curso para poder fazer revisão de tudo aprendido, pois tem coisas tipo o cast que foram pouco utilizados.

solução

Bem, pelo visto esse conteúdo é muito avançado pra mim ainda, quando amadurecer um pouco o conhecimento volto a procurar uma forma de fazer isso.

Até lá fica o pedido de um curso com esse tipo de conteúdo avançado.

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