Допустим, у меня есть следующий метод, который, учитывая PaymentType, отправляет соответствующий запрос на платеж каждому объекту, из которого необходимо снять платеж:
public void SendRequestToPaymentFacility(PaymentType payment) {
if(payment is CreditCard) {
SendRequestToCreditCardProcessingCenter();
} else if(payment is BankAccount) {
SendRequestToBank();
} else if(payment is PawnTicket) {
SendRequestToPawnShop();
}
}
Очевидно, что это запах кода, но при поиске подходящего рефакторинга, я видел только примеры, включающие случаи, когда код, выполняемый в условных выражениях, явно является ответственностью самого класса , например, со стандартным примером, приведенным:
public double GetArea(Shape shape) {
if(shape is Circle) {
Circle circle = shape As Circle;
return circle.PI * (circle.radius * circle.radius);
} else if(shape is Square) {
Square square = shape as Square;
return square.length * square.width;
}
}
GetArea()
кажется довольно разумной обязанностью для каждого подкласса Shape, и, конечно, может быть красиво переработан:
public class Shape
{
/* ... */
public abstract double GetArea();
}
public class Circle
{
public override double GetArea()
{
return PI * (radius * radius);
}
}
Тем не менее, SendRequestToPaymentFacility()
не представляется соответствующей обязанностью для PaymentType
. (и, по-видимому, нарушает принцип единой ответственности). И все же мне нужно отправить запрос в соответствующий PaymentFacility
в зависимости от типа PaymentType
- как лучше всего это сделать?