1
resposta

Melhor abordagem para Classe de Aprovação de Cartão

Olá Rodrigo!

Após ver o curso de design patterns quero tentar melhorar meu código. Precisava de algumas dicas para conseguir pensar orientado a objetos, se possível.

Estou desenvolvendo uma classe para aprovação de cartões de crédito. Esta classe precisará ser reutilizada em vários lugares.

A aprovação pode ser feita pela Esitef(skytef) ou pela Cielo. Então pensei que deveria criar uma interface para abstrair quem fosse ser utilizada. E tornei esta classe genérica para receber os dados do cartão para aprovação ( número do cartão, validade, cvv etc..)

public interface Pagamento<T> {
    public T aprovar(T t);
}

Em seguida criei a classe da Esitef para implementar a aprovação:

public class EsitefCartao implements Pagamento<CartaoAprovacao> {

    @Override
    public CartaoAprovacao aprovar(CartaoAprovacao cartaoAprovacao) {
        try {
            validaDadosCartao(cartaoAprovacao.getCartao());
            validaParametrosEsitef(cartaoAprovacao);

             json.put(GSAConst.NUMBER, cartaoAprovacao.getCartao().getNumeroCartao());            
            //... outros campos

            URL url = new URL(cartaoAprovacao.getUrl());        
            //Chamando a api de aprovação
            JSONObject jsonObj = Autenticacao.callWebService(url, json);

            cartaoAprovacao.getCartao().setCodigoAutorizacao((String) paymentJson.get(GSAConst.AUTHORIZATIONNUMBER));

             return cartaoAprovacao;

        } catch (Exception e) {
            throw new RuntimeException(e);
        }
}

Depois posso criar a classe da Cielo e implementar a aprovação. Agora na View eu chamo a aprovação:

    Pagamento<CartaoAprovacao> pagamento = new EsitefCartao();
     CartaoAprovacao caDados = new CartaoAprovacao(
                    vCartao,
                    pLoja.getVarcharPar(),
                    pSigla.getVarcharPar(),
                    vCartao.getQtdeParcela(),
                    pTipoParcelamento.getIntPar(),
                    administradora.getIdESitef(),
                    pedido.getCliente().getIdCliente(),
                    pUrl.getVarcharPar());

     CartaoAprovacao cartaoRetorno = pagamento.aprovar(caDados);
     System.out.println("Autorizaco: " + cartaoRetorno.getCartao().getCodigoAutorizacao());

Contudo nesta view estou preso a aprovar pela Esitef. Se precisar aprovar pela Cielo eu terei que mudar a view. O que eu poderia fazer para melhorar este cenário?

Agradeço a atenção!

Obrigado!

1 resposta

Oi Weles,

Pior que nesse caso não tem o que fazer. Como você vai precisar utilizar uma das duas classes, vai ter que instanciar uma delas.

O que daria para fazer é ter algum parâmetro para saber qual das classes instanciar.

Daria também para utilizar injeção de dependências juntamente com o conceito de qualifier para dar uma simplificada nisso.

Bons estudos!