Очень часто вы можете услышать, что классы должны быть хорошо сплоченными и слабо связанными. Для многих людей это может означать что-то немного другое. Поэтому важнее, чем просто услышать лозунг, иметь практические примеры того, что он на самом деле означает. Чтобы добиться слабой связи, в начале следует рассмотреть шину событий.

Почему я на самом деле хочу использовать слабую связь? Представьте себе сценарий, когда вы отображаете одни и те же данные в нескольких формах: в виде диаграммы, в виде таблицы или в устной форме на естественном языке. И давайте сделаем изменения данных с течением времени. Чтобы поддерживать все зависимые компоненты в актуальном состоянии, вам нужно будет вести их список и отправлять свежие данные напрямую всем. Будет сложно, когда их количество меняется со временем (по мере роста проекта) и это делает их зависимыми от источника данных.

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

Как использовать шину событий? Давайте посмотрим на простой пример ниже.

public void init() {
    EventBus eventBus = new EventBus();

    Chart dataChart = new Chart();
    Table dataTable = new Table();
    TextPanel textPanel = new TextPanel();

    eventBus.register(dataChart);
    eventBus.register(dataTable);
    eventBus.register(textPanel);

    eventBus.post(new DataUpdateEvent(dataResource.fetchCurrent()));
}

class Chart {
    @Subscribe
    public void onNewData(DataUpdateEvent event) {
        // ...
    }
}

Просто как тот. Что вы этим выигрываете?

  1. Вы отделяете классы отображения данных (Chart, Table и TextPanel) от базового ресурса данных. Вы можете легко изменить источник данных, даже не меняя эти классы.
  2. Их можно легко протестировать. Вам не нужно передавать EventBus через конструктор или сеттер. Единственное, что вам нужно сделать, это создать новый экземпляр, например. Chart и вызовите общедоступный метод onNewData.
  3. Добавить новые источники данных очень просто. Вам просто нужно подключить его к eventBus. Источники данных не должны ничего знать о получателях. Таким образом, ваш код открыт для расширений и закрыт для модификаций.
  4. Если зависимые от данных также могут изменять данные, легко распространить изменения на остальных. Просто post обновление до eventBus. Определенные классы не знают о получателях и не должны о них беспокоиться.

Если вы не использовали этот инструмент, попробуйте. Наверняка это сделает ваш код менее связанным.

Есть и другие преимущества Event Bus. В одном классе вы можете подписаться на несколько объектов. Весь механизм типобезопасен, поэтому вы всегда получаете то, что ожидали. И он разработан Google.

Если вы хотите узнать больше, вы можете найти официальные документы здесь.

Первоначально опубликовано на dmydlarz.com 26 сентября 2017 г.