1
resposta

Uso design pattern strategy envolvendo retorno do banco de dados

Fiquei com dúvida referente a este padrão principalmente ao final que é quando devo aplicar. Digamos que tenho um job que faz uma chamada ao banco retorna uma lista, em seguida chama o método abaixo, passando o orçamento e um imposto qualquer que venha na consulta.

public void RealizaCalculo(Orcamento orcamento, String imposto) 
{        
    if( "ICMS".Equals(imposto) )
    {   
        double icms = orcamento.Valor * 0.1;
        Console.WriteLine(icms); // imprimirá 50.0
    } 
    if( "ISS".Equals(imposto) )
    {   
        double icms = orcamento.Valor * 0.1;
        Console.WriteLine(icms); // imprimirá 50.0
    } 
}

Então o que eu faço é verificar o tipo do imposto para poder executar o cálculo daquele imposto apenas.. como não sei qual imposto vai vir...( dentro de uma lista finita é claro ex.: ICMS, ISS) Nesse caso o que identifica pra mim é apenas o nome do tipo do imposto.. como eu não sei qual o imposto vai vir acabo fazendo um if pra cada item..

O pattern Strategy é válido pra esse cenário? caso não tem algum outro que possa ser aplicado pra esse tipo de problema?

1 resposta

Olá @Ramires, Pelos meu humilde conhecimento creio que pode ser aplicado esse Pattern sim. Nesse caso, vc terá que abstrair o comportamento comum entre os Impostos (ICMS, ISS, Outros) numa classe mais generalista/Interface. Qual é o comportamento comum? Calcular o imposto. No código que vc postou perceba que tem responsabilidade de mais, ele está responsável pela taxa do tipo de imposto e pelo valor que deve ser cobrado para cada tipo de imposto. Nesse caso, como eu faria?

Assim...

public interface Imposto {
    double calculaImposto(double valor);
}

public class IcmsImposto implements Imposto {
    private double taxaIcms = 0.1D;
    @override
    public double calculaImposto(double valor) {
        return valor * getTaxaIcms();
    }

    public double getTaxaIcms() {
        return taxaIcms;    
    }
}

public class IssImposto implements Imposto {
    private double taxaIss = 0.1D;
    @override
    public double calculaImposto(double valor) {
        return valor * getTaxaIss();
    }
    public double getTaxaIss() {
        return taxaIss;    
    }
}

// Agora no seu metodo ficaria assim

public void RealizaCalculo(Orcamento orcamento, Imposto imposto) {        
    return imposto.calculaImposto(orcamento.getValor()); 
}

Dessa forma, toda vez que vc tiver que implementar um novo imposto vc terá que implementar a interface e sobrescrever o metodo.