Здесь я вижу два вопроса: первый - это хороший шаблон. Это субъективно, но я бы также использовал шаблон стратегии. Что-то, что позволяет реализации быть чем-то, что не заботится о том, что это за платеж:
IPayment payment = new Payment() { PaymentAmount = 100 };
IPayment nonProfitPayment = new NonProfitPayment() { PaymentAmount = 100 };
Console.WriteLine($"Total for 100 payment: ${payment.TotalPayment()}");
Console.WriteLine($"Total for 100 payment: ${nonProfitPayment.TotalPayment()}");
Что, конечно, дает: $ 106,00 и $ 100.
Определения классов:
public interface IPayment
{
decimal TaxRate { get; set; }
decimal PaymentAmount { get; set; }
decimal TotalPayment();
}
public class Payment : IPayment
{
public Payment()
{
TaxRate = 0.06M;
}
public decimal TaxRate { get; set; }
public decimal PaymentAmount { get; set; }
public decimal TotalPayment()
{
return PaymentAmount + (PaymentAmount * TaxRate);
}
}
public class NonProfitPayment : Payment
{
public NonProfitPayment()
{
TaxRate = 0;
}
}
А затем по второму вопросу: получатель платежа и плательщик.
IMO это должны быть два дополнительных класса, передаваемых в класс / метод PostPayment. Быстрый псевдо-класс:
public class PostPayment: IPostPayment
{
public PaymentResponse PostPayment(IPayee payee, IPayor payor, IPayment payment)
{
var totalPayment = payment.TotalPayment();
var payorStatus = payor.Charge(totalPayment);
if (payorStatus == ChargeStatus.InsuffucientFunds)
{
return PaymentResponse.InsuffificientCredit;
}
return payee.Credit(totalAmount).PaymentStatus;
}
}
Это в конечном итоге гарантирует, что любые странные вещи для Типа вещи обрабатываются правильной вещью. Для дополнительных мыслей:
public class ReallyWeirdPayeeCase : IPayee
{
public PaymentStatus Credit(decimal paymentAmount)
{
var approval = new ApprovalRequired()
{
ApprovalRequired = true,
Amount = paymentAmount,
DaysHoldRequired = 30
};
dbContext.CorporateApproval.Add(approvalRequired);
return PaymentStatus.ThirtyDayApprovalQueued;
}
}
Съемка с бедра но, я думаю, это показывает один хороший подход к рефакторингу существующего кода для Единой ответственности и удовлетворению ваших потребностей.