Код: Выделить всё
public interface MessageService {
void send(String message);
}
@Component("SendEmailService")
public class SendEmailService implements MessageService {
@Override
public void send(String message) {
System.out.println("SendEmailService");
}
}
@Component("SendSmsService")
public class SendSmsService implements MessageService {
@Override
public void send(String message) {
System.out.println("SendSms");
}
}
Код: Выделить всё
public class ExceptionUtils {
public static void retryOnException(Runnable runnable, int maxRetries, long timeSeed) {
// Retry logic here
}
}
@Component("RetryableSendEmailService")
public class RetryableSendEmailService extends SendEmailService {
@Override
public void send(String message) {
ExceptionUtils.retryOnException(() -> super.send(message), 3, 5000);
}
}
- Я создал новый класс RetryableSendEmailService, который расширяет
.
Код: Выделить всё
SendEmailService - Если компоненту требуется логика повтора, он может внедрить
.
Код: Выделить всё
RetryableSendEmailService. В противном случае он может внедрить SendEmailService
Я обеспокоен тем, что это может нарушить принцип подстановки Лискова ( ЛСП) из принципов SOLID. Принцип гласит:
Объекты суперкласса должны быть заменены объектами его
подклассов без нарушения работы приложения. Для этого подклассы
должны вести себя так же, как их суперклассы.
Вопросы:
- Нарушает ли добавление механизма повтора в RetryableSendEmailService
LSP, поскольку он меняет поведение отправки путем введения повторных попыток? - Как я могу это реорганизовать чтобы код более точно соответствовал принципам SOLID
, особенно LSP, сохраняя при этом желаемую
функциональность?
Подробнее здесь: https://stackoverflow.com/questions/787 ... -principle
Мобильная версия