Вызов метода службы из другого класса службы

У меня два класса обслуживания. WarehouseManagementService предоставляет методы для администрирования складов и запасов. SalesManagementService предоставляет методы для управления клиентами и их заказами.

Для создания заказа необходимо проверить, достаточно ли количество товара в заказе. Для этого я бы использовал метод availableStock(Product p) в WarehouseManagementService. Но я не знаю, как правильно вызвать этот метод.

Нужно ли создавать экземпляр WarehouseManagementService в SalesManagementService? Или мне следует добавить WarehouseManagementServiceInterface в конструктор SalesManagementService (внедрение зависимостей)?

Как может выглядеть хорошая архитектура для достижения слабой связи этих двух классов?

Заранее спасибо.

public class WarehouseManagementService implements WarehouseManagementServiceInterface {

    private DatabaseReadWarehouseInterface dbRead;
    private DatabaseWriteWarehouseInterface dbWrite;

    public int availableStock(Product p) {
    // returns available quantity of product
    }

}
public class SalesManagementService implements SalesManagementServiceInterface {

    private DatabaseReadSalesInterface dbRead;
    private DatabaseWriteSalesInterface dbWrite;

    public void addOrder(Order o) {
    // creates order, if product quantity is sufficient
    }

}

вы используете весенний фреймворк?

Mustahsan 12.06.2019 09:33

Нет, я не использую Spring Framework. Поскольку это небольшой учебный проект, он не предназначен для использования

user9870801 12.06.2019 09:38

хорошо, тогда вам нужно создавать объекты услуг друг в друге

Mustahsan 12.06.2019 09:38

@Mustahsan: я не согласен. Также без использования Spring вы должны разъединить зависимости.

fjc 12.06.2019 09:45

Зависимость от конструктора — лучший вариант вместо создания объекта класса.

MangduYogii 12.06.2019 12:00
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
5
4 432
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас есть правильное ощущение: зависимость должна быть внедрена. Просто помните Принцип единой ответственности: «У класса должна быть только одна причина для изменения».

Построив WarehouseManagementService в SalesManagementService, вы добавите вторую причину для изменения SalesManagementService: когда изменится способ построения вашего WarehouseManagementService.

Чтобы решить эту проблему, вы можете либо использовать полноценную структуру внедрения зависимостей, либо просто начать с добавления параметра конструктора в SalesManagementService:

public class SalesManagementService implements SalesManagementServiceInterface {

    private DatabaseReadSalesInterface dbRead;
    private DatabaseWriteSalesInterface dbWrite;
    private WarehouseManagementServiceInterface warehouseManagementService;

    constructor(DatabaseReadSalesInterface dbRead,
                DatabaseWriteSalesInterface dbWrite,
                WarehouseManagementServiceInterface warehouseManagementService) {
        this.dbRead = dbRead;
        this.dbWrite = dbWrite;
        this.warehouseManagementService = warehouseManagementService;
    }

    public void addOrder(Order o) {
    // creates order, if product quantity is sufficient
    }

}

Затем в вашем методе main позаботьтесь о создании экземпляра WarehouseManagementService и передайте его SalesManagementService.

В качестве побочного примечания вы можете переместить конструкцию SalesManagementService и WarehouseManagementService в фабрики, которые дают вам SalesManagementServiceInterface и WarehouseManagementServiceInterface, а не конкретные классы («программа для интерфейса, а не реализация»).

Другие вопросы по теме