Целесообразно ли вводить несколько служб в один класс? - PullRequest
0 голосов
/ 04 января 2019

У меня есть около 10-15 последовательных вызовов API для выполнения операции.

Каждый API имеет свои отдельные классы реализации службы для получения соответствующего ответа. Чтобы обработать все эти API, я автоматически связал все эти 15 классов в один класс и выполнял один за другим.

Глядя на код, я чувствую, что подход не является приличным способом для этой реализации.

Не могли бы вы предложить, нормально ли это делать или каким-либо другим способом украсить реализацию?

Моя реализация: Я выполняю операцию бронирования, которая имеет 15 сервисов, которые будут вызываться последовательно. В зависимости от ответа каждого сервиса цепочка переходит к следующему. В этом случае я ввел все эти 15 служб в свой BookingServiceImpl, используя @Autowired. Итак, моя реализация верна, верно? Любой другой лучший подход, чем этот?

1 Ответ

0 голосов
/ 05 января 2019

Нет, это ни в коем случае не правильно.

Класс, основанный на 15 зависимостях, никогда не разрабатывался должным образом и нарушал принцип единственной ответственности . Систему, в которой находится такой класс, можно назвать тесно связанной .

Хотя шаблон цепочки ответственности приносит больше абстракции и сложности, он может значительно улучшить существующий дизайн. Компоненты могут быть хорошо отделены друг от друга, каждый из которых выполняет одну часть работы и не знает всего процесса. Может не быть одного класса, управляющего всей процедурой. Вы можете назначить Spring ответственным за порядок в цепочке, который во время выполнения станет динамически переставленным и реконфигурированным объектом.

Я дам вам очень абстрактный фрагмент, в котором я буду следовать:

interface Booking {
    // methods required at any stage of processing
}

interface BookingProcessor {
    void process(Booking booking);
}

@Service("BookingSourceDataService")
class BookingSourceDataService implements BookingProcessor {

    @Autowired
    @Qualifier("CustomerValidationService")
    private BookingProcessor nextProcessor;

    @Override
    public void process(Booking booking) {
        // fetch booking source data, populate the Booking object
        nextProcessor.process(booking);
    }

}
@Service("CustomerValidationService")
class CustomerValidationService implements BookingProcessor {

    @Autowired
    @Qualifier("CustomerCreationService")
    private BookingProcessor nextProcessor;

    @Override
    public void process(Booking booking) {
        // validate customer, populate the Booking object
        nextProcessor.process(booking);
    }

}

Обратите внимание, как Spring и его метаинформация могут снизить уровень связи. Например, BookingSourceDataService понятия не имеет, каким будет его следующий процессор бронирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...