Нарушает ли мой дизайн принцип замены Лискова?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Нарушает ли мой дизайн принцип замены Лискова?

Сообщение Anonymous »

Я работаю над приложением Spring Boot со следующей структурой для отправки сообщений

Код: Выделить всё

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»