marcelohnq / costumer-api

API application for clients, products, and payments. | ASP.NET, API, GitHub Actions, Unit Tests, Integration Tests, TestContainers, Coverage
2 stars 0 forks source link

Parte3Controller #3

Closed marcelohnq closed 7 months ago

marcelohnq commented 7 months ago

Essa API cria o pagamento de uma compra (PlaceOrder). Verifique o método PayOrder da classe OrderService. Você deve ter percebido que existem diversas formas de pagamento (Pix, cartão de crédito, paypal), certo? Essa classe, no entanto, é problemática. Imagine que teríamos que incluir um novo método de pagamento, seria mais um if na estrutura.

Você precisa:

Faça uma alteração na arquitetura para que fique mais bem estruturado e preparado para o futuro. Tenha certeza que o princípio Open-Closed será respeitado.

marcelohnq commented 7 months ago

O princípio Open-Closed foi aplicado. Não é mais necessário realizar mudanças na classe OrderService para expandir novas formas de pagamento. Foram criada a classe PaymentBase e as classes Pix, CreditCard e Paypal, que estende a PaymentBase e cada uma realizando sua forma de pagamento específica. Além disso, para saber qual classe deve ser instanciada, é definida em Payment/PaymentMethod.cs:

public static PaymentBase Get(PaymentMethod pm, decimal paymentValue) => pm switch
{
    PaymentMethod.Pix => new Pix(paymentValue),
    PaymentMethod.Creditcard => new Creditcard(paymentValue),
    PaymentMethod.Paypal => new Paypal(paymentValue),
    _ => throw new ArgumentException("The payment method does not exist.")
};

Portanto, para adicionar uma nova forma de pagamento, deve ser criado uma nova classe, que estende PaymentBase, e adicionar novo tipo em PaymentMethod.cs.